diff --git a/latest-head4rawhide.sh b/latest-head4rawhide.sh new file mode 100755 index 0000000..55d4e90 --- /dev/null +++ b/latest-head4rawhide.sh @@ -0,0 +1,29 @@ +#! /bin/zsh -e + +done=false +if [ "x$1" = "xjames" ]; then + done=true + cvs=~/work/fedora/cvs/yum/devel + git=~/work/rpm/private/yum +fi +if [ "x$1" = "xseth" ]; then + done=true + cvs=~/work/fedora/cvs/yum/devel + git=~/work/rpm/private/yum + exit 1 +fi +if ! $done; then + + echo " Usage: $0 james | seth" 1>&2 + echo "" 1>&2 + echo " This command copies the latest git HEAD into Fedora rawhide," 1>&2 + echo " working out the versions automatically. It also makes the" 1>&2 + echo " diff between HEADs as minimal as possible. " 1>&2 + exit 1 +fi + +cd $cvs +ver=$(make verrel | perl -lpe 's/-[^-]+$//' | sed s/\\\./-/g) + +cd $git +git format-patch --stdout $ver | perl -pe 's!^(Subject: \[PATCH )0*(\d+)/\d+!$1$2!' > $cvs/yum-HEAD.patch diff --git a/yum-HEAD.patch b/yum-HEAD.patch index 0158168..66d6cd2 100644 --- a/yum-HEAD.patch +++ b/yum-HEAD.patch @@ -1,1033 +1,384 @@ -diff --git a/Makefile b/Makefile -index d75b220..8065899 100644 ---- a/Makefile -+++ b/Makefile -@@ -34,7 +34,7 @@ install: - install -m 755 bin/yum-updatesd.py $(DESTDIR)/usr/sbin/yum-updatesd +From cc5d13a39dcefbc401255d224c8700f4f907f285 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Mon, 22 Mar 2010 19:31:43 +0200 +Subject: [PATCH 1] Fix unknown syslog facility mapping. + +--- + yum/logginglevels.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/logginglevels.py b/yum/logginglevels.py +index 6c23f88..3d82b55 100644 +--- a/yum/logginglevels.py ++++ b/yum/logginglevels.py +@@ -75,7 +75,7 @@ def syslogFacilityMap(facility): + elif (facility.upper().startswith("LOG_") and + facility[4:].upper() in _syslog_facility_map): + return _syslog_facility_map[facility[4:].upper()] +- return syslog.LOG_USER ++ return syslog_module.LOG_USER - mkdir -p $(DESTDIR)/var/cache/yum -- mkdir -p $(DESTDIR)/var/lib/yum -+ mkdir -p $(DESTDIR)/var/lib/yum + def logLevelFromErrorLevel(error_level): + """ Convert an old-style error logging level to the new style. """ +-- +1.7.0.1 + + +From 11dfde5e065e21c5bdb25a087501b90afe0b0dab Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Tue, 23 Mar 2010 10:09:20 -0400 +Subject: [PATCH 2] make sure we aren't overwriting the value of 'keys' + +this determines how many args we pass back in our yielded results +never noticed it b/c nothing in yum uses keys=True - but it broke PK +--- + yum/__init__.py | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index ea73549..0aaa819 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2163,10 +2163,10 @@ class YumBase(depsolve.Depsolve): - for d in $(SUBDIRS); do make PYTHON=$(PYTHON) DESTDIR=`cd $(DESTDIR); pwd` -C $$d install; [ $$? = 0 ] || exit 1; done + # do the ones we already have + for item in sorted_lists.values(): +- for pkg, keys, values in item: ++ for pkg, k, v in item: + if pkg not in results_by_pkg: + results_by_pkg[pkg] = [] +- results_by_pkg[pkg].append((keys,values)) ++ results_by_pkg[pkg].append((k,v)) -diff --git a/cli.py b/cli.py -index f5ed53d..2f1479b 100644 ---- a/cli.py -+++ b/cli.py -@@ -100,6 +100,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - self.registerCommand(yumcommands.VersionCommand()) - self.registerCommand(yumcommands.HistoryCommand()) - self.registerCommand(yumcommands.CheckRpmdbCommand()) -+ self.registerCommand(yumcommands.DistroSyncCommand()) + # take our existing dict-by-pkg and make the dict-by-count for + # this bizarro sorted_lists format +@@ -2175,9 +2175,9 @@ class YumBase(depsolve.Depsolve): + for pkg in results_by_pkg: + totkeys = [] + totvals = [] +- for (keys, values) in results_by_pkg[pkg]: +- totkeys.extend(keys) +- totvals.extend(values) ++ for (k, v) in results_by_pkg[pkg]: ++ totkeys.extend(k) ++ totvals.extend(v) + + totkeys = misc.unique(totkeys) + totvals = misc.unique(totvals) +-- +1.7.0.1 + + +From c6f4d336bd6be5cdb575c94628da2eb7bcb900f4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Mon, 22 Mar 2010 19:56:44 +0200 +Subject: [PATCH 3] Use LOG_USER as default syslog facility everywhere in base. + +--- + yum/config.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/config.py b/yum/config.py +index ad8db7e..cb01306 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -601,7 +601,7 @@ class StartupConf(BaseConfig): + pluginconfpath = ListOption(['/etc/yum/pluginconf.d']) + gaftonmode = BoolOption(False) + syslog_ident = Option() +- syslog_facility = Option('LOG_DAEMON') ++ syslog_facility = Option('LOG_USER') + persistdir = Option('/var/lib/yum') + + class YumConf(StartupConf): +-- +1.7.0.1 + + +From 40a53f0d3a8dd8ad4fb4802890e4f30b0214f3f9 Mon Sep 17 00:00:00 2001 +From: Ville-Pekka Vainio +Date: Wed, 24 Mar 2010 12:37:03 +0000 +Subject: [PATCH 4] l10n: Updates to Finnish (fi) translation + +Transmitted-via: Transifex (www.transifex.net) +--- + po/fi.po | 203 +++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 103 insertions(+), 100 deletions(-) + +diff --git a/po/fi.po b/po/fi.po +index 4347eba..4240973 100644 +--- a/po/fi.po ++++ b/po/fi.po +@@ -6,8 +6,8 @@ msgid "" + msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2010-02-10 10:43-0500\n" +-"PO-Revision-Date: 2010-02-11 21:50+0200\n" ++"POT-Creation-Date: 2010-02-11 10:54-0500\n" ++"PO-Revision-Date: 2010-03-24 14:36+0200\n" + "Last-Translator: Ville-Pekka Vainio \n" + "Language-Team: Finnish \n" + "MIME-Version: 1.0\n" +@@ -156,15 +156,15 @@ msgstr "Ladataan paketteja:" + msgid "Error Downloading Packages:\n" + msgstr "Virhe pakettien latauksessa:\n" - def registerCommand(self, command): - for name in command.getNames(): -@@ -149,7 +150,34 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - usage += "%s\n" % command.getNames()[0] +-#: ../cli.py:426 ../yum/__init__.py:4194 ++#: ../cli.py:426 ../yum/__init__.py:4195 + msgid "Running rpm_check_debug" + msgstr "Suoritetaan rpm_check_debug" - return usage -- -+ -+ def _parseSetOpts(self, setopts): -+ """parse the setopts list handed to us and saves the results as -+ repo_setopts and main_setopts in the yumbase object""" -+ -+ repoopts = {} -+ mainopts = yum.misc.GenericHolder() -+ mainopts.items = [] -+ -+ for item in setopts: -+ k,v = item.split('=') -+ period = k.find('.') -+ if period != -1: -+ repo = k[:period] -+ k = k[period+1:] -+ if repo not in repoopts: -+ repoopts[repo] = yum.misc.GenericHolder() -+ repoopts[repo].items = [] -+ setattr(repoopts[repo], k, v) -+ repoopts[repo].items.append(k) -+ else: -+ setattr(mainopts, k, v) -+ mainopts.items.append(k) -+ -+ self.main_setopts = mainopts -+ self.repo_setopts = repoopts -+ -+ - def getOptionsConfig(self, args): - """parses command line arguments, takes cli args: - sets up self.conf and self.cmds as well as logger objects -@@ -166,6 +194,13 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - opts.quiet = True - opts.verbose = False +-#: ../cli.py:435 ../yum/__init__.py:4203 ++#: ../cli.py:435 ../yum/__init__.py:4204 + msgid "ERROR You need to update rpm to handle:" + msgstr "VIRHE RPM on päivitettävä, jotta se osaa käsitellä:" -+ # go through all the setopts and set the global ones -+ self._parseSetOpts(opts.setopts) -+ -+ if self.main_setopts: -+ for opt in self.main_setopts.items: -+ setattr(opts, opt, getattr(self.main_setopts, opt)) -+ - # get the install root to use - root = self.optparser.getRoot(opts) +-#: ../cli.py:437 ../yum/__init__.py:4206 ++#: ../cli.py:437 ../yum/__init__.py:4207 + msgid "ERROR with rpm_check_debug vs depsolve:" + msgstr "VIRHE rpm_check_debugin ja riippuvuuksien tarkistuksen välillä:" -@@ -189,7 +224,12 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - pc.enabled_plugins = self.optparser._splitArg(opts.enableplugins) - pc.releasever = opts.releasever - self.conf -- -+ -+ # now set all the non-first-start opts from main from our setopts -+ if self.main_setopts: -+ for opt in self.main_setopts.items: -+ setattr(self.conf, opt, getattr(self.main_setopts, opt)) -+ - except yum.Errors.ConfigError, e: - self.logger.critical(_('Config Error: %s'), e) - sys.exit(1) -@@ -305,7 +345,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - p = re.compile('needs (\d+)MB on the (\S+) filesystem') - disk = {} - for m in p.finditer(errstring): -- if not disk.has_key(m.group(2)): -+ if m.group(2) not in disk: - disk[m.group(2)] = int(m.group(1)) - if disk[m.group(2)] < int(m.group(1)): - disk[m.group(2)] = int(m.group(1)) -@@ -376,12 +416,18 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - - # Check which packages have to be downloaded - downloadpkgs = [] -+ rmpkgs = [] - stuff_to_download = False - install_only = True -+ remove_only = True - for txmbr in self.tsInfo.getMembers(): - if txmbr.ts_state not in ('i', 'u'): - install_only = False -+ po = txmbr.po -+ if po: -+ rmpkgs.append(po) - else: -+ remove_only = False - stuff_to_download = True - po = txmbr.po - if po: -@@ -394,7 +440,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -339,7 +339,7 @@ msgstr "Saatavilla olevat ryhmät:" + msgid "Done" + msgstr "Valmis" - # Report the total download size to the user, so he/she can base - # the answer on this info -- if stuff_to_download: -+ if not stuff_to_download: -+ self.reportRemoveSize(rmpkgs) -+ else: - self.reportDownloadSize(downloadpkgs, install_only) - - # confirm with user -@@ -594,6 +642,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - - oldcount = len(self.tsInfo) - -+ done = False - for arg in userlist: - if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or - os.path.exists(arg))): -@@ -608,8 +657,13 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - self.term.MODE['bold'], arg, - self.term.MODE['normal']) - self._maybeYouMeant(arg) -+ else: -+ done = True - if len(self.tsInfo) > oldcount: - return 2, [_('Package(s) to install')] -+ -+ if not done: -+ return 1, [_('Nothing to do')] - return 0, [_('Nothing to do')] - - def updatePkgs(self, userlist, quiet=0): -@@ -649,6 +703,75 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - else: - return 0, [_('No Packages marked for Update')] +-#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2787 ++#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 + #, python-format + msgid "Warning: Group %s does not exist." + msgstr "Varoitus: Ryhmää %s ei ole olemassa." +@@ -355,7 +355,7 @@ msgstr "" + msgid "%d Package(s) to Install" + msgstr "%d pakettia asennettavana" -+ # Note that we aren't in __init__ yet for a couple of reasons, but we -+ # probably will get there for 3.2.28. -+ def distroSyncPkgs(self, userlist): -+ """ This does either upgrade/downgrade, depending on if the latest -+ installed version is older or newer. We allow "selection" but not -+ local packages (use tmprepo, or something). """ -+ -+ dupdates = [] -+ ipkgs = {} -+ for pkg in sorted(self.rpmdb.returnPackages(patterns=userlist)): -+ ipkgs[pkg.name] = pkg -+ -+ obsoletes = [] -+ if self.conf.obsoletes: -+ obsoletes = self.up.getObsoletesTuples(newest=1) -+ -+ for (obsoleting, installed) in obsoletes: -+ if installed[0] not in ipkgs: -+ continue -+ dupdates.extend(self.update(pkgtup=installed)) -+ for (obsoleting, installed) in obsoletes: -+ if installed[0] not in ipkgs: -+ continue -+ del ipkgs[installed[0]] -+ -+ apkgs = {} -+ pkgs = [] -+ if ipkgs: -+ try: -+ pkgs = self.pkgSack.returnNewestByName(patterns=ipkgs.keys()) -+ except yum.Errors.PackageSackError: -+ pkgs = [] -+ -+ for pkg in pkgs: -+ if pkg.name not in ipkgs: -+ continue -+ apkgs[pkg.name] = pkg -+ -+ for ipkgname in ipkgs: -+ if ipkgname not in apkgs: -+ continue -+ -+ ipkg = ipkgs[ipkgname] -+ apkg = apkgs[ipkgname] -+ if ipkg.verEQ(apkg): -+ continue -+ if self.allowedMultipleInstalls(apkg): -+ found = False -+ for napkg in self.rpmdb.searchNames([apkg.name]): -+ if napkg.verEQ(apkg): -+ found = True -+ elif napkg.verGT(apkg): -+ dupdates.extend(self.remove(po=napkg)) -+ if found: -+ continue -+ dupdates.extend(self.install(pattern=apkg.name)) -+ elif ipkg.verLT(apkg): -+ n,a,e,v,r = apkg.pkgtup -+ dupdates.extend(self.update(name=n, epoch=e, ver=v, rel=r)) -+ else: -+ n,a,e,v,r = apkg.pkgtup -+ dupdates.extend(self.downgrade(name=n, epoch=e, ver=v, rel=r)) -+ -+ if dupdates: -+ msg = _('%d packages marked for Distribution Synchronization') % len(dupdates) -+ return 2, [msg] -+ else: -+ return 0, [_('No Packages marked for Distribution Synchronization')] -+ - def erasePkgs(self, userlist): - """take user commands and populate a transaction wrapper with packages - to be erased/removed""" -@@ -891,6 +1014,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): - def cleanCli(self, userlist): - hdrcode = pkgcode = xmlcode = dbcode = expccode = 0 - pkgresults = hdrresults = xmlresults = dbresults = expcresults = [] -+ msg = self.fmtKeyValFill(_('Cleaning repos: '), -+ ' '.join([ x.id for x in self.repos.listEnabled()])) -+ self.verbose_logger.log(yum.logginglevels.INFO_2, msg) - if 'all' in userlist: - self.verbose_logger.log(yum.logginglevels.INFO_2, - _('Cleaning up Everything')) -@@ -1149,7 +1275,8 @@ class YumOptionParser(OptionParser): - args = _filtercmdline( - ('--noplugins','--version','-q', '-v', "--quiet", "--verbose"), - ('-c', '-d', '-e', '--installroot', -- '--disableplugin', '--enableplugin', '--releasever'), -+ '--disableplugin', '--enableplugin', '--releasever', -+ '--setopt'), - args) - except ValueError, arg: - self.base.usage() -@@ -1383,7 +1510,8 @@ class YumOptionParser(OptionParser): - help=_("control whether color is used")) - group.add_option("", "--releasever", dest="releasever", default=None, - help=_("set value of $releasever in yum config and repo files")) -- -+ group.add_option("", "--setopt", dest="setopts", default=[], -+ action="append", help=_("set arbitrary config and repo options")) - - - def _filtercmdline(novalopts, valopts, args): -diff --git a/docs/yum.8 b/docs/yum.8 -index 8d42d9d..d5ede0a 100644 ---- a/docs/yum.8 -+++ b/docs/yum.8 -@@ -27,6 +27,8 @@ gnome\-packagekit application\&. - .br - .I \fR * upgrade [package1] [package2] [\&.\&.\&.] - .br -+.I \fR * distribution-synchronization [package1] [package2] [\&.\&.\&.] -+.br - .I \fR * remove | erase package1 [package2] [\&.\&.\&.] - .br - .I \fR * list [\&.\&.\&.] -@@ -67,7 +69,7 @@ gnome\-packagekit application\&. - .br - .I \fR * repolist [all|enabled|disabled] - .br --.I \fR * version [all|installed|available|group-*|grouplist|groupinfo] -+.I \fR * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ] - .br - .I \fR * history [info|list|summary|redo|undo|new] - .br -@@ -87,7 +89,9 @@ group of packages while ensuring that all dependencies are - satisfied\&. (See \fBSpecifying package names\fP for more information) - If no package matches the given package name(s), they are assumed to be a shell - glob and any matches are then installed\&. If the name starts with an --@ character the rest of the name is used as though passed to the groupinstall command\&. If the name is a file, then install works -+@ character the rest of the name is used as though passed to the groupinstall -+command\&. If the name starts with a - character, then a search is done within -+the transaction and any matches are removed. If the name is a file, then install works - like localinstall\&. If the name doesn't match a package, then package - "provides" are searched (Eg. "_sqlitecache.so()(64bit)") as are - filelists (Eg. "/usr/bin/yum"). Also note that for filelists, wildcards will -@@ -119,11 +123,24 @@ Running in verbose mode also shows obsoletes. - Is the same as the update command with the \-\-obsoletes flag set. See update - for more details. - .IP -+.IP "\fBdistribution\-synchronization\fP or \fBdistro\-sync\fP" -+Synchronizes the installed package set with the latest packages available, this -+is done by either obsoleting, upgrading or downgrading as appropriate. This will -+"normally" do the same thing as the upgrade command however if you have the -+package FOO installed at version 4, and the latest available is only -+version 3, then this command will \fBdowngrade\fP FOO to version 3. -+ -+This command does not perform operations on groups, local packages or negative -+selections. -+.IP - .IP "\fBremove\fP or \fBerase\fP" - Are used to remove the specified packages from the system - as well as removing any packages which depend on the package being - removed\&. remove operates on groups, files, provides and filelists just like - the "install" command\&.(See \fBSpecifying package names\fP for more information) -+ -+Note that "yum" is included in the protected_packages configuration, by default. -+So you can't accidentally remove yum itself. - .IP - .IP "\fBlist\fP" - Is used to list various information about available -@@ -180,6 +197,9 @@ Is used to remove all of the packages in a group, unlike "groupinstall" this - will remove everything regardless of group_package_types. It is worth pointing - out that packages can be in more than one group, so "groupinstall X Y" followed - by "groupremove Y" does not do give you the same result as "groupinstall X". -+ -+The groupremove_leaf_only configuration changes the behaviour of this command -+to only remove packages which aren't required by something else. - .IP - .IP "\fBgroupinfo\fP" - Is used to give the description and package list of a group (and which type -@@ -254,6 +274,24 @@ information is listed. The version is calculated by taking a sha1 hash of the - packages (in sorted order), and the checksum_type/checksum_data entries from - the yumdb. Note that this rpmdb version is now also used significantly within - yum (esp. in yum history). -+ -+The version command will now show "groups" of packages as a separate version, -+and so takes sub-commands: -+ -+"version grouplist" - List the defined version groups. -+ -+"version groupinfo" - Get the complete list of packages within one or more version groups. -+ -+"version installed" - This is the default, only show the version information for installed packages. -+ -+"version available" - Only show the version information for available packages. -+ -+"version all" - Show the version information for installed and available packages. -+ -+"version nogroups | nogroups-*" - Just show the main version information. -+ -+"version group-*" - Just show the grouped version information, if more arguments are given then only show the data for those groups. -+ - .IP - .IP "\fBhistory\fP" - The history command allows the user to view what has happened in past -@@ -280,6 +318,12 @@ if there was something not good with the transaction. - .br - .I \fB#\fR - The transaction completed, but with a non-zero status. - .br -+.I \fBE\fR - The transaction completed fine, but had warning/error output during the transaction. -+.br -+.I \fBP\fR - The transaction completed fine, but problems already existed in the rpmdb. -+.br -+.I \fBs\fR - The transaction completed fine, but --skip-broken was enabled and had to skip some packages. -+.br +-#: ../cli.py:1028 ../yum/__init__.py:2799 ++#: ../cli.py:1028 ../yum/__init__.py:2800 + #, python-format + msgid "No group named %s exists" + msgstr "Ryhmää nimeltä %s ei ole olemassa" +@@ -767,7 +767,7 @@ msgstr "Koko yhteensä: %s" + #: ../output.py:904 + #, python-format + msgid "Total download size: %s" +-msgstr "Latausmäärä yhteensä: %s" ++msgstr "Ladattavaa yhteensä: %s" - .IP - .IP "\fBcheck\fP" -@@ -403,6 +447,11 @@ $releasever in your cachedir configuration to stop this). - .IP "\fB\-t, \-\-tolerant\fP" - This option currently does nothing. - .br -+.IP "\fB\-\-setopt=option=value\fP" -+Set any config option in yum config or repo files. For options in the global -+config just use: \-\-setopt=option=value for repo options use: \-\-setopt=repoid.option=value -+.PP -+ - .SH "LIST OPTIONS" - The following are the ways which you can invoke \fByum\fP in list - mode\&. Note that all \fBlist\fP commands include information on the -diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 -index cca3db7..5f1a5c7 100644 ---- a/docs/yum.conf.5 -+++ b/docs/yum.conf.5 -@@ -62,6 +62,14 @@ Debug scriptlet output level. 'info' is the default, other - options are: 'critical', 'emergency', 'error', 'warn' and 'debug'. + #: ../output.py:908 + #, python-format +@@ -2187,29 +2187,32 @@ msgid "Could not create lock at %s: %s " + msgstr "Ei voitu luoda lukkoa sijaintiin %s: %s" - .IP -+\fBprotected_packages\fR -+This is a list of packages that yum should never completely remove. They are -+protected via. Obsoletes as well as user/plugin removals. -+ -+The default is: yum glob:/etc/yum/protected.d/*.conf -+So any packages which should be protected can do so by including a file in -+/etc/yum/protected.d with their package name in it. -+.IP - \fBlogfile\fR - Full directory and file name for where yum should write its log file. + #: ../yum/__init__.py:1470 +-msgid "Package does not match intended download" +-msgstr "Paketti ei vastaa aiottua latausta" ++msgid "" ++"Package does not match intended download. Suggestion: run yum clean metadata" ++msgstr "" ++"Paketti ei vastaa aiottua latausta. Kannattaa ehkä suorittaa komento yum " ++"clean metadata" -@@ -167,6 +175,14 @@ repository will be used. If \fBoverwrite_groups\fR is `0' then the groups - from all matching repositories will be merged together as one large group. +-#: ../yum/__init__.py:1485 ++#: ../yum/__init__.py:1486 + msgid "Could not perform checksum" + msgstr "Ei voitu laskea tarkistussummaa" - .IP -+\fBgroupremove_leaf_only \fR -+Either `0' or `1'. Used to determine yum's behaviour when the groupremove -+command is run. If \fBgroupremove_leaf_only\fR is `0' (default) then -+all packages in the group will be removed. If \fBgroupremove_leaf_only\fR is -+`1' then only those packages in the group that aren't required by another -+package will be removed. -+ -+.IP - \fBenable_group_conditionals\fR - Either `0' or `1'. Determines whether yum will allow the use of conditionals - packages. Default is `1' (package conditionals are allowed). -@@ -304,11 +320,17 @@ on the command line (eg. "update foo bar baz quux"). None of the short options +-#: ../yum/__init__.py:1488 ++#: ../yum/__init__.py:1489 + msgid "Package does not match checksum" + msgstr "Paketti ei vastaa tarkistussummaa" - .IP - \fBsyslog_ident \fR --XXX not implemented yet -+Identification (program name) for syslog messages. +-#: ../yum/__init__.py:1530 ++#: ../yum/__init__.py:1531 + #, python-format + msgid "package fails checksum but caching is enabled for %s" + msgstr "" + "paketti ei vastaa tarkistussummaa, mutta välimuisti on käytössä kohteelle %s" - .IP - \fBsyslog_facility \fR --XXX not implemented yet -+Facility name for syslog messages, see syslog(3). Default is `LOG_USER'. -+ -+.IP -+\fBsyslog_device \fR -+Where to log syslog messages. Can be a local device (path) or a host:port -+string to use a remote syslog. If empty or points to a nonexistent device, -+syslog logging is disabled. Default is `/dev/log'. +-#: ../yum/__init__.py:1533 ../yum/__init__.py:1562 ++#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 + #, python-format + msgid "using local copy of %s" + msgstr "käytetään paikallista kopiota paketista %s" - .IP - \fBproxy \fR -@@ -720,6 +742,14 @@ The configuration file will be inserted at the position of the "include=" line. - Included files may contain further include lines. Yum will abort with an error - if an inclusion loop is detected. +-#: ../yum/__init__.py:1574 ++#: ../yum/__init__.py:1575 + #, python-format + msgid "" + "Insufficient space in download directory %s\n" +@@ -2220,11 +2223,11 @@ msgstr "" + " * vapaana %s\n" + " * tarvitaan %s" -+.SH "GLOB: FOR LIST OPTIONS" -+.LP -+Any of the configurations options which are a list of items can be specfied -+using the glob syntax: \fBglob:/etc/path/somewhere.d/*.conf\fR. This -+will read in all files matching that glob and include all lines in each file -+(excluding comments and blank lines) as items in the list. -+.LP -+ - .SH "VARIABLES" - .LP - There are a number of variables you can use to ease maintenance of yum's -@@ -755,6 +785,17 @@ These will be replaced with the value of the shell environment variable of - the same name. If the shell environment variable does not exist then the - configuration file variable will not be replaced. +-#: ../yum/__init__.py:1623 ++#: ../yum/__init__.py:1624 + msgid "Header is not complete." + msgstr "Otsake ei ole täydellinen." -+.LP -+As of 3.2.28, any file in /etc/yum/vars is turned into a variable named after -+the filename (or overrides any of the above variables). -+ -+Note that no warnings/errors are given if the files are unreadable, so creating -+files that only root can read may be confusing for users. -+ -+Also note that only the first line will be read and all new line -+characters are removed, as a convenience. However, no other checking is -+performed on the data. This means it is possible to have bad character -+data in any value. +-#: ../yum/__init__.py:1660 ++#: ../yum/__init__.py:1661 + #, python-format + msgid "" + "Header not in local cache and caching-only mode enabled. Cannot download %s" +@@ -2232,62 +2235,62 @@ msgstr "" + "Otsake ei ole paikallisessa välimuistissa ja pelkästä välimuistista toimiva " + "tila on käytössä. Ei voida ladata otsaketta %s" - .SH "FILES" - .nf -diff --git a/etc/Makefile b/etc/Makefile -index 68dd3c2..a512cdf 100644 ---- a/etc/Makefile -+++ b/etc/Makefile -@@ -8,7 +8,9 @@ clean: +-#: ../yum/__init__.py:1715 ++#: ../yum/__init__.py:1716 + #, python-format + msgid "Public key for %s is not installed" + msgstr "Julkista avainta pakettia %s varten ei ole asennettu" - install: - mkdir -p $(DESTDIR)/etc/yum/ -+ mkdir -p $(DESTDIR)/etc/yum/protected.d - mkdir -p $(DESTDIR)/etc/yum/repos.d -+ mkdir -p $(DESTDIR)/etc/yum/vars +-#: ../yum/__init__.py:1719 ++#: ../yum/__init__.py:1720 + #, python-format + msgid "Problem opening package %s" + msgstr "Ongelma paketin %s avaamisessa" - install -m 644 yum.conf $(YUMETC)/yum.conf +-#: ../yum/__init__.py:1727 ++#: ../yum/__init__.py:1728 + #, python-format + msgid "Public key for %s is not trusted" + msgstr "Paketin %s julkiseen avaimeen ei luoteta" -diff --git a/etc/yum.bash b/etc/yum.bash -index 5dfdb64..0fcba24 100644 ---- a/etc/yum.bash -+++ b/etc/yum.bash -@@ -82,12 +82,12 @@ _yum() - local cmds=( check check-update clean deplist downgrade groupinfo - groupinstall grouplist groupremove help history info install list - localinstall makecache provides reinstall remove repolist resolvedep -- search shell update upgrade version ) -+ search shell update upgrade version distro-sync ) +-#: ../yum/__init__.py:1731 ++#: ../yum/__init__.py:1732 + #, python-format + msgid "Package %s is not signed" + msgstr "Pakettia %s ei ole allekirjoitettu" - local i c cmd - for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )) ; do - for c in ${cmds[@]} check-rpmdb erase groupupdate grouperase \ -- whatprovides ; do -+ whatprovides distribution-synchronization ; do - [ ${COMP_WORDS[i]} = $c ] && cmd=$c && break - done - [ -z $cmd ] || break -@@ -102,7 +102,7 @@ _yum() - ;; +-#: ../yum/__init__.py:1769 ++#: ../yum/__init__.py:1770 + #, python-format + msgid "Cannot remove %s" + msgstr "Ei voida poistaa tiedostoa %s" - check-update|grouplist|makecache|provides|whatprovides|resolvedep|\ -- search|version) -+ search) - return 0 - ;; +-#: ../yum/__init__.py:1773 ++#: ../yum/__init__.py:1774 + #, python-format + msgid "%s removed" + msgstr "tiedosto %s on poistettu" -@@ -132,7 +132,7 @@ _yum() - return 0 - ;; +-#: ../yum/__init__.py:1819 ++#: ../yum/__init__.py:1820 + #, python-format + msgid "Cannot remove %s file %s" + msgstr "Ei voida poistaa %s-tyyppistä tiedostoa %s" -- erase|remove) -+ erase|remove|distro-sync|distribution-synchronization) - _yum_list installed "$cur" - return 0 - ;; -@@ -214,6 +214,13 @@ _yum() - fi - return 0 - ;; -+ version) -+ if [ "$prev" = version ] ; then -+ COMPREPLY=( $( compgen -W 'all installed available nogroups -+ grouplist groupinfo' -- "$cur" ) ) -+ fi -+ return 0 -+ ;; - esac +-#: ../yum/__init__.py:1823 ++#: ../yum/__init__.py:1824 + #, python-format + msgid "%s file %s removed" + msgstr "%s-tyyppinen tiedosto %s on poistettu" - local split=false -@@ -274,7 +281,7 @@ _yum() - ;; +-#: ../yum/__init__.py:1825 ++#: ../yum/__init__.py:1826 + #, python-format + msgid "%d %s files removed" + msgstr "%d %s-tyyppistä tiedostoa on poistettu" - -R|--randomwait|-x|--exclude|-h|--help|--version|--releasever|--cve|\ -- --bz|--advisory|--tmprepo|--verify-filenames) -+ --bz|--advisory|--tmprepo|--verify-filenames|--setopt) - return 0 - ;; +-#: ../yum/__init__.py:1894 ++#: ../yum/__init__.py:1895 + #, python-format + msgid "More than one identical match in sack for %s" + msgstr "Säkissä on useampi kuin yksi identtinen vastaavuus haulle %s" -@@ -302,7 +309,7 @@ _yum() - --quiet --verbose --assumeyes --version --installroot --enablerepo - --disablerepo --exclude --disableexcludes --obsoletes --noplugins - --nogpgcheck --disableplugin --enableplugin --skip-broken --color -- --releasever ${cmds[@]}' -- "$cur" ) ) -+ --releasever --setopt ${cmds[@]}' -- "$cur" ) ) - } && - complete -F _yum -o filenames yum yummain.py +-#: ../yum/__init__.py:1900 ++#: ../yum/__init__.py:1901 + #, python-format + msgid "Nothing matches %s.%s %s:%s-%s from update" + msgstr "Mikään ei vastaa päivityksen pakettia %s.%s %s:%s-%s" -diff --git a/output.py b/output.py -index b09730a..de04b83 100755 ---- a/output.py -+++ b/output.py -@@ -927,6 +927,26 @@ class YumOutput: - self.verbose_logger.log(logginglevels.INFO_1, - _("Installed size: %s"), - self.format_number(insize)) -+ -+ def reportRemoveSize(self, packages): -+ """Report the total size of packages being removed. """ -+ totsize = 0 -+ error = False -+ for pkg in packages: -+ # Just to be on the safe side, if for some reason getting -+ # the package size fails, log the error and don't report download -+ # size -+ try: -+ size = int(pkg.size) -+ totsize += size -+ except: -+ error = True -+ self.logger.error(_('There was an error calculating installed size')) -+ break -+ if (not error): -+ self.verbose_logger.log(logginglevels.INFO_1, -+ _("Installed size: %s"), -+ self.format_number(totsize)) - - def listTransaction(self): - """returns a string rep of the transaction in an easy-to-read way.""" -@@ -1232,8 +1252,9 @@ to exit. - return count, "".join(list(actions)) +-#: ../yum/__init__.py:2179 ++#: ../yum/__init__.py:2180 + msgid "" + "searchPackages() will go away in a future version of " + "Yum. Use searchGenerator() instead. \n" +@@ -2295,181 +2298,181 @@ msgstr "" + "searchPackages() poistetaan jossakin Yumin tulevassa versiossa. Käytä sen " + "sijaan searchGenerator()-metodia.\n" - def _pwd_ui_username(self, uid, limit=None): -- # loginuid is set to -1 on init. -- if uid is None or uid == 0xFFFFFFFF: -+ # loginuid is set to -1 (0xFFFF_FFFF) on init, in newer kernels. -+ # loginuid is set to INT_MAX (0x7FFF_FFFF) on init, in older kernels. -+ if uid is None or uid in (0xFFFFFFFF, 0x7FFFFFFF): - loginid = _("") - name = _("System") + " " + loginid - if limit is not None and len(name) > limit: -@@ -1310,6 +1331,13 @@ to exit. - rmark = lmark = '*' - elif old.return_code: - rmark = lmark = '#' -+ # We don't check .errors, because return_code will be non-0 -+ elif old.output: -+ rmark = lmark = 'E' -+ elif old.rpmdb_problems: -+ rmark = lmark = 'P' -+ elif old.trans_skip: -+ rmark = lmark = 's' - if old.altered_lt_rpmdb: - rmark = '<' - if old.altered_gt_rpmdb: -@@ -1413,6 +1441,29 @@ to exit. - def _historyInfoCmd(self, old, pats=[]): - name = self._pwd_ui_username(old.loginuid) +-#: ../yum/__init__.py:2218 ++#: ../yum/__init__.py:2219 + #, python-format + msgid "Searching %d packages" + msgstr "Etsitään %d pakettia" -+ def _simple_pkg(pkg, prefix_len, highlight=False): -+ prefix = " " * prefix_len -+ state = _('Installed') -+ ipkgs = self.rpmdb.searchNames([hpkg.name]) -+ ipkgs.sort() -+ if not ipkgs: -+ state = _('Not installed') -+ elif hpkg.pkgtup in (ipkg.pkgtup for ipkg in ipkgs): -+ pass -+ elif ipkgs[-1] > hpkg: -+ state = _('Older') -+ elif ipkgs[0] < hpkg: -+ state = _('Newer') -+ else: -+ assert False, "Impossible, installed not newer and not older" -+ if highlight: -+ (hibeg, hiend) = self._highlight('bold') -+ else: -+ (hibeg, hiend) = self._highlight('normal') -+ print "%s%s %s%s%s" % (prefix, -+ hibeg, utf8_width_fill(state, 12), hiend, -+ hpkg) -+ - print _("Transaction ID :"), old.tid - begtm = time.ctime(old.beg_timestamp) - print _("Begin time :"), begtm -@@ -1448,6 +1499,9 @@ to exit. - print _("Return-Code :"), _("Failure:"), old.return_code - else: - print _("Return-Code :"), _("Success") -+ if old.cmdline is not None: -+ print _("Command Line :"), old.cmdline -+ - print _("Transaction performed with:") - for hpkg in old.trans_with: - prefix = " " * 4 -@@ -1462,11 +1516,25 @@ to exit. - state = _('Updated') - elif ipkgs[0] < hpkg: - state = _('Downgraded') -- else: # multiple versions installed, both older and newer -- state = _('Weird') -+ else: -+ assert False, "Impossible, installed not newer and not older" - print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg) - print _("Packages Altered:") - self.historyInfoCmdPkgsAltered(old, pats) -+ -+ if old.trans_skip: -+ print _("Packages Skipped:") -+ for hpkg in old.trans_skip: -+ _simple_pkg(hpkg, 4) -+ -+ if old.rpmdb_problems: -+ print _("Rpmdb Problems:") -+ for prob in old.rpmdb_problems: -+ key = "%s%s: " % (" " * 4, prob.problem) -+ print self.fmtKeyValFill(key, prob.text) -+ for hpkg in prob.packages: -+ _simple_pkg(hpkg, 8, highlight=hpkg.main) -+ - if old.output: - print _("Scriptlet output:") - num = 0 -@@ -1587,7 +1655,7 @@ to exit. - count, uiacts = self._history_uiactions(hpkgs) - uperiod = _period2user[period] - # Should probably use columns here, esp. for uiacts? -- print fmt % (utf8_width_fill(name, 22, 22), -+ print fmt % (utf8_width_fill(name, 26, 26), - utf8_width_fill(uperiod, 19, 19), - utf8_width_fill(uiacts, 16, 16), count) +-#: ../yum/__init__.py:2222 ++#: ../yum/__init__.py:2223 + #, python-format + msgid "searching package %s" + msgstr "etsitään pakettia %s" -@@ -1639,6 +1707,10 @@ class DepSolveProgressCallBack: - _('--> Processing Dependency: %s for package: %s'), formatted_req, - po) - -+ def groupRemoveReq(self, po, hits): -+ self.verbose_logger.log(logginglevels.INFO_2, -+ _('---> Keeping package: %s'), po) -+ - def unresolved(self, msg): - self.verbose_logger.log(logginglevels.INFO_2, _('--> Unresolved Dependency: %s'), - msg) -@@ -1660,24 +1732,52 @@ class DepSolveProgressCallBack: - if not yb: - return msg - -+ def _msg_pkg(action, pkg, needname): -+ " Add a package to the message, including any provides matches. " -+ msg = _('\n %s: %s (%s)') % (action, pkg, pkg.ui_from_repo) -+ needtup = (needname, None, (None, None, None)) -+ done = False -+ for pkgtup in pkg.matchingPrcos('provides', needtup): -+ done = True -+ msg += _('\n %s') % yum.misc.prco_tuple_to_string(pkgtup) -+ if not done: -+ msg += _('\n Not found') -+ return msg -+ - ipkgs = set() - for pkg in sorted(yb.rpmdb.getProvides(needname)): -- ipkgs.add(pkg.pkgtup) -+ nevr = (pkg.name, pkg.epoch, pkg.version, pkg.release) -+ ipkgs.add(nevr) - action = _('Installed') -- if yb.tsInfo.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES): -+ rmed = yb.tsInfo.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES) -+ if rmed: - action = _('Removing') -- msg += _('\n %s: %s (%s)') % (action, pkg, pkg.ui_from_repo) -+ msg += _msg_pkg(action, pkg, needname) -+ # These should be the only three things we care about: -+ relmap = {'updatedby' : _('Updated By'), -+ 'downgradedby' : _('Downgraded By'), -+ 'obsoletedby' : _('Obsoleted By'), -+ } -+ for txmbr in rmed: -+ for (rpkg, rtype) in txmbr.relatedto: -+ if rtype not in relmap: -+ continue -+ nevr = (rpkg.name, rpkg.epoch, rpkg.version, rpkg.release) -+ ipkgs.add(nevr) -+ msg += _msg_pkg(relmap[rtype], rpkg, needname) -+ - last = None - for pkg in sorted(yb.pkgSack.getProvides(needname)): - # We don't want to see installed packages, or N packages of the - # same version, from different repos. -- if pkg.pkgtup in ipkgs or pkg.verEQ(last): -+ nevr = (pkg.name, pkg.epoch, pkg.version, pkg.release) -+ if nevr in ipkgs or (pkg.verEQ(last) and pkg.arch == last.arch): - continue - last = pkg - action = _('Available') - if yb.tsInfo.getMembersWithState(pkg.pkgtup, TS_INSTALL_STATES): - action = _('Installing') -- msg += _('\n %s: %s (%s)') % (action, pkg, pkg.repoid) -+ msg += _msg_pkg(action, pkg, needname) - return msg - - def procConflict(self, name, confname): -diff --git a/po/fi.po b/po/fi.po -index 4347eba..71c926d 100644 ---- a/po/fi.po -+++ b/po/fi.po -@@ -6,8 +6,8 @@ msgid "" - msgstr "" - "Project-Id-Version: yum\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2010-02-10 10:43-0500\n" --"PO-Revision-Date: 2010-02-11 21:50+0200\n" -+"POT-Creation-Date: 2010-02-11 10:54-0500\n" -+"PO-Revision-Date: 2010-05-27 21:23+0300\n" - "Last-Translator: Ville-Pekka Vainio \n" - "Language-Team: Finnish \n" - "MIME-Version: 1.0\n" -@@ -156,15 +156,15 @@ msgstr "Ladataan paketteja:" - msgid "Error Downloading Packages:\n" - msgstr "Virhe pakettien latauksessa:\n" +-#: ../yum/__init__.py:2234 ++#: ../yum/__init__.py:2235 + msgid "searching in file entries" + msgstr "etsitään tiedostoista" --#: ../cli.py:426 ../yum/__init__.py:4194 -+#: ../cli.py:426 ../yum/__init__.py:4195 - msgid "Running rpm_check_debug" - msgstr "Suoritetaan rpm_check_debug" +-#: ../yum/__init__.py:2241 ++#: ../yum/__init__.py:2242 + msgid "searching in provides entries" + msgstr "etsitään tarjoajista" --#: ../cli.py:435 ../yum/__init__.py:4203 -+#: ../cli.py:435 ../yum/__init__.py:4204 - msgid "ERROR You need to update rpm to handle:" - msgstr "VIRHE RPM on päivitettävä, jotta se osaa käsitellä:" +-#: ../yum/__init__.py:2274 ++#: ../yum/__init__.py:2275 + #, python-format + msgid "Provides-match: %s" + msgstr "Tarjoajavastaavuus: %s" --#: ../cli.py:437 ../yum/__init__.py:4206 -+#: ../cli.py:437 ../yum/__init__.py:4207 - msgid "ERROR with rpm_check_debug vs depsolve:" - msgstr "VIRHE rpm_check_debugin ja riippuvuuksien tarkistuksen välillä:" +-#: ../yum/__init__.py:2323 ++#: ../yum/__init__.py:2324 + msgid "No group data available for configured repositories" + msgstr "Asetetuille asennuslähteille ei ole saatavilla ryhmädataa" -@@ -250,7 +250,7 @@ msgstr "Vanhennettavat paketit" - #: ../cli.py:717 +-#: ../yum/__init__.py:2354 ../yum/__init__.py:2373 ../yum/__init__.py:2404 +-#: ../yum/__init__.py:2410 ../yum/__init__.py:2492 ../yum/__init__.py:2496 +-#: ../yum/__init__.py:2813 ++#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 ++#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 ++#: ../yum/__init__.py:2814 #, python-format - msgid " (from %s)" --msgstr " (versiosta %s)" -+msgstr " (asennuslähteestä %s)" + msgid "No Group named %s exists" + msgstr "Ryhmää nimeltä %s ei ole olemassa" - #: ../cli.py:719 +-#: ../yum/__init__.py:2385 ../yum/__init__.py:2512 ++#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 #, python-format -@@ -339,7 +339,7 @@ msgstr "Saatavilla olevat ryhmät:" - msgid "Done" - msgstr "Valmis" + msgid "package %s was not marked in group %s" + msgstr "pakettia %s ei ollut merkitty kuuluvaksi ryhmään %s" --#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2787 -+#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 +-#: ../yum/__init__.py:2432 ++#: ../yum/__init__.py:2433 #, python-format - msgid "Warning: Group %s does not exist." - msgstr "Varoitus: Ryhmää %s ei ole olemassa." -@@ -355,7 +355,7 @@ msgstr "" - msgid "%d Package(s) to Install" - msgstr "%d pakettia asennettavana" + msgid "Adding package %s from group %s" + msgstr "Lisätään paketti %s ryhmästä %s" --#: ../cli.py:1028 ../yum/__init__.py:2799 -+#: ../cli.py:1028 ../yum/__init__.py:2800 - #, python-format - msgid "No group named %s exists" - msgstr "Ryhmää nimeltä %s ei ole olemassa" -@@ -767,7 +767,7 @@ msgstr "Koko yhteensä: %s" - #: ../output.py:904 +-#: ../yum/__init__.py:2436 ++#: ../yum/__init__.py:2437 #, python-format - msgid "Total download size: %s" --msgstr "Latausmäärä yhteensä: %s" -+msgstr "Ladattavaa yhteensä: %s" + msgid "No package named %s available to be installed" + msgstr "Pakettia nimeltä %s ei ole saatavilla asennusta varten" - #: ../output.py:908 +-#: ../yum/__init__.py:2538 ++#: ../yum/__init__.py:2539 #, python-format -@@ -2187,29 +2187,32 @@ msgid "Could not create lock at %s: %s " - msgstr "Ei voitu luoda lukkoa sijaintiin %s: %s" - - #: ../yum/__init__.py:1470 --msgid "Package does not match intended download" --msgstr "Paketti ei vastaa aiottua latausta" -+msgid "" -+"Package does not match intended download. Suggestion: run yum clean metadata" -+msgstr "" -+"Paketti ei vastaa aiottua latausta. Kannattaa ehkä suorittaa komento yum " -+"clean metadata" + msgid "Package tuple %s could not be found in packagesack" + msgstr "Paketti-tuplea %s ei löytynyt pakettisäkistä" --#: ../yum/__init__.py:1485 -+#: ../yum/__init__.py:1486 - msgid "Could not perform checksum" - msgstr "Ei voitu laskea tarkistussummaa" +-#: ../yum/__init__.py:2557 ++#: ../yum/__init__.py:2558 + #, python-format + msgid "Package tuple %s could not be found in rpmdb" + msgstr "Paketti-tuplea %s ei löytynyt RPM-tietokannasta" --#: ../yum/__init__.py:1488 -+#: ../yum/__init__.py:1489 - msgid "Package does not match checksum" - msgstr "Paketti ei vastaa tarkistussummaa" +-#: ../yum/__init__.py:2613 ../yum/__init__.py:2663 ++#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 + msgid "Invalid version flag" + msgstr "Virheellinen versiolippu" --#: ../yum/__init__.py:1530 -+#: ../yum/__init__.py:1531 - #, python-format - msgid "package fails checksum but caching is enabled for %s" - msgstr "" - "paketti ei vastaa tarkistussummaa, mutta välimuisti on käytössä kohteelle %s" - --#: ../yum/__init__.py:1533 ../yum/__init__.py:1562 -+#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 - #, python-format - msgid "using local copy of %s" - msgstr "käytetään paikallista kopiota paketista %s" - --#: ../yum/__init__.py:1574 -+#: ../yum/__init__.py:1575 - #, python-format - msgid "" - "Insufficient space in download directory %s\n" -@@ -2220,11 +2223,11 @@ msgstr "" - " * vapaana %s\n" - " * tarvitaan %s" - --#: ../yum/__init__.py:1623 -+#: ../yum/__init__.py:1624 - msgid "Header is not complete." - msgstr "Otsake ei ole täydellinen." - --#: ../yum/__init__.py:1660 -+#: ../yum/__init__.py:1661 - #, python-format - msgid "" - "Header not in local cache and caching-only mode enabled. Cannot download %s" -@@ -2232,62 +2235,62 @@ msgstr "" - "Otsake ei ole paikallisessa välimuistissa ja pelkästä välimuistista toimiva " - "tila on käytössä. Ei voida ladata otsaketta %s" - --#: ../yum/__init__.py:1715 -+#: ../yum/__init__.py:1716 - #, python-format - msgid "Public key for %s is not installed" - msgstr "Julkista avainta pakettia %s varten ei ole asennettu" - --#: ../yum/__init__.py:1719 -+#: ../yum/__init__.py:1720 - #, python-format - msgid "Problem opening package %s" - msgstr "Ongelma paketin %s avaamisessa" - --#: ../yum/__init__.py:1727 -+#: ../yum/__init__.py:1728 - #, python-format - msgid "Public key for %s is not trusted" - msgstr "Paketin %s julkiseen avaimeen ei luoteta" - --#: ../yum/__init__.py:1731 -+#: ../yum/__init__.py:1732 - #, python-format - msgid "Package %s is not signed" - msgstr "Pakettia %s ei ole allekirjoitettu" - --#: ../yum/__init__.py:1769 -+#: ../yum/__init__.py:1770 - #, python-format - msgid "Cannot remove %s" - msgstr "Ei voida poistaa tiedostoa %s" - --#: ../yum/__init__.py:1773 -+#: ../yum/__init__.py:1774 - #, python-format - msgid "%s removed" - msgstr "tiedosto %s on poistettu" - --#: ../yum/__init__.py:1819 -+#: ../yum/__init__.py:1820 - #, python-format - msgid "Cannot remove %s file %s" - msgstr "Ei voida poistaa %s-tyyppistä tiedostoa %s" - --#: ../yum/__init__.py:1823 -+#: ../yum/__init__.py:1824 - #, python-format - msgid "%s file %s removed" - msgstr "%s-tyyppinen tiedosto %s on poistettu" - --#: ../yum/__init__.py:1825 -+#: ../yum/__init__.py:1826 - #, python-format - msgid "%d %s files removed" - msgstr "%d %s-tyyppistä tiedostoa on poistettu" - --#: ../yum/__init__.py:1894 -+#: ../yum/__init__.py:1895 - #, python-format - msgid "More than one identical match in sack for %s" - msgstr "Säkissä on useampi kuin yksi identtinen vastaavuus haulle %s" - --#: ../yum/__init__.py:1900 -+#: ../yum/__init__.py:1901 - #, python-format - msgid "Nothing matches %s.%s %s:%s-%s from update" - msgstr "Mikään ei vastaa päivityksen pakettia %s.%s %s:%s-%s" - --#: ../yum/__init__.py:2179 -+#: ../yum/__init__.py:2180 - msgid "" - "searchPackages() will go away in a future version of " - "Yum. Use searchGenerator() instead. \n" -@@ -2295,181 +2298,181 @@ msgstr "" - "searchPackages() poistetaan jossakin Yumin tulevassa versiossa. Käytä sen " - "sijaan searchGenerator()-metodia.\n" - --#: ../yum/__init__.py:2218 -+#: ../yum/__init__.py:2219 - #, python-format - msgid "Searching %d packages" - msgstr "Etsitään %d pakettia" - --#: ../yum/__init__.py:2222 -+#: ../yum/__init__.py:2223 - #, python-format - msgid "searching package %s" - msgstr "etsitään pakettia %s" - --#: ../yum/__init__.py:2234 -+#: ../yum/__init__.py:2235 - msgid "searching in file entries" - msgstr "etsitään tiedostoista" - --#: ../yum/__init__.py:2241 -+#: ../yum/__init__.py:2242 - msgid "searching in provides entries" - msgstr "etsitään tarjoajista" - --#: ../yum/__init__.py:2274 -+#: ../yum/__init__.py:2275 - #, python-format - msgid "Provides-match: %s" - msgstr "Tarjoajavastaavuus: %s" - --#: ../yum/__init__.py:2323 -+#: ../yum/__init__.py:2324 - msgid "No group data available for configured repositories" - msgstr "Asetetuille asennuslähteille ei ole saatavilla ryhmädataa" - --#: ../yum/__init__.py:2354 ../yum/__init__.py:2373 ../yum/__init__.py:2404 --#: ../yum/__init__.py:2410 ../yum/__init__.py:2492 ../yum/__init__.py:2496 --#: ../yum/__init__.py:2813 -+#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 -+#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 -+#: ../yum/__init__.py:2814 - #, python-format - msgid "No Group named %s exists" - msgstr "Ryhmää nimeltä %s ei ole olemassa" - --#: ../yum/__init__.py:2385 ../yum/__init__.py:2512 -+#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 - #, python-format - msgid "package %s was not marked in group %s" - msgstr "pakettia %s ei ollut merkitty kuuluvaksi ryhmään %s" - --#: ../yum/__init__.py:2432 -+#: ../yum/__init__.py:2433 - #, python-format - msgid "Adding package %s from group %s" - msgstr "Lisätään paketti %s ryhmästä %s" - --#: ../yum/__init__.py:2436 -+#: ../yum/__init__.py:2437 - #, python-format - msgid "No package named %s available to be installed" - msgstr "Pakettia nimeltä %s ei ole saatavilla asennusta varten" - --#: ../yum/__init__.py:2538 -+#: ../yum/__init__.py:2539 - #, python-format - msgid "Package tuple %s could not be found in packagesack" - msgstr "Paketti-tuplea %s ei löytynyt pakettisäkistä" - --#: ../yum/__init__.py:2557 -+#: ../yum/__init__.py:2558 - #, python-format - msgid "Package tuple %s could not be found in rpmdb" - msgstr "Paketti-tuplea %s ei löytynyt RPM-tietokannasta" - --#: ../yum/__init__.py:2613 ../yum/__init__.py:2663 -+#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 - msgid "Invalid version flag" - msgstr "Virheellinen versiolippu" - --#: ../yum/__init__.py:2633 ../yum/__init__.py:2638 -+#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 +-#: ../yum/__init__.py:2633 ../yum/__init__.py:2638 ++#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 #, python-format msgid "No Package found for %s" msgstr "Riippuvuudelle %s ei löytynyt pakettia" @@ -1350,13704 +701,22200 @@ index 4347eba..71c926d 100644 #, python-format msgid "Could not set cachedir: %s" msgstr "Välimuistihakemiston asettaminen epäonnistui %s" -diff --git a/po/pt_BR.po b/po/pt_BR.po -index 32a16af..91cea8f 100644 ---- a/po/pt_BR.po -+++ b/po/pt_BR.po -@@ -1,15 +1,15 @@ - # Brazilian Portuguese translation of Yum - # This file is distributed under the same license as the Yum package. - # Igor Pires Soares , 2007,2008,2009. --# -+# Taylon Silmer , 2010. - msgid "" - msgstr "" - "Project-Id-Version: Yum\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2009-10-15 15:45+0200\n" --"PO-Revision-Date: 2009-11-02 11:15-0300\n" --"Last-Translator: Igor Pires Soares \n" --"Language-Team: Brazilian Portuguese \n" -+"POT-Creation-Date: 2010-02-11 10:54-0500\n" -+"PO-Revision-Date: 2010-04-28 19:15-0300\n" -+"Last-Translator: Taylon Silmer \n" -+"Language-Team: Brazilian Portuguese \n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -@@ -17,49 +17,34 @@ msgstr "" - "X-Poedit-Language: Portuguese\n" - "X-Poedit-Country: BRAZIL\n" +-- +1.7.0.1 + + +From 2d8c8f210292766cc5389ac5700c3fa7fe1c8342 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Wed, 24 Mar 2010 18:25:35 +0200 +Subject: [PATCH 5] Fix syslog_indent and syslog_facility settings, improve syslog format. + +--- + yum/logginglevels.py | 22 +++++++++------------- + 1 files changed, 9 insertions(+), 13 deletions(-) + +diff --git a/yum/logginglevels.py b/yum/logginglevels.py +index 3d82b55..3a62945 100644 +--- a/yum/logginglevels.py ++++ b/yum/logginglevels.py +@@ -45,7 +45,7 @@ logging.addLevelName(DEBUG_4, "DEBUG_4") + __NO_LOGGING = 100 + logging.raiseExceptions = False --#: ../callback.py:48 --#: ../output.py:940 --#: ../yum/rpmtrans.py:71 -+#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 - msgid "Updating" - msgstr "Atualizando" +-import syslog as syslog_module ++from logging.handlers import SysLogHandler as syslog_module --#: ../callback.py:49 --#: ../yum/rpmtrans.py:72 -+#: ../callback.py:49 ../yum/rpmtrans.py:73 - msgid "Erasing" - msgstr "Apagando" + syslog = None --#: ../callback.py:50 --#: ../callback.py:51 --#: ../callback.py:53 --#: ../output.py:939 --#: ../yum/rpmtrans.py:73 --#: ../yum/rpmtrans.py:74 --#: ../yum/rpmtrans.py:76 -+#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 -+#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 -+#: ../yum/rpmtrans.py:77 - msgid "Installing" - msgstr "Instalando" +@@ -75,7 +75,7 @@ def syslogFacilityMap(facility): + elif (facility.upper().startswith("LOG_") and + facility[4:].upper() in _syslog_facility_map): + return _syslog_facility_map[facility[4:].upper()] +- return syslog_module.LOG_USER ++ return _syslog_facility_map["USER"] --#: ../callback.py:52 --#: ../callback.py:58 --#: ../yum/rpmtrans.py:75 -+#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 - msgid "Obsoleted" - msgstr "Obsoletos" - --#: ../callback.py:54 --#: ../output.py:1063 --#: ../output.py:1403 -+#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 - msgid "Updated" - msgstr "Atualizados" - --#: ../callback.py:55 --#: ../output.py:1399 -+#: ../callback.py:55 ../output.py:1438 - msgid "Erased" - msgstr "Removidos" - --#: ../callback.py:56 --#: ../callback.py:57 --#: ../callback.py:59 --#: ../output.py:1061 --#: ../output.py:1395 -+#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 -+#: ../output.py:1434 ../output.py:1646 - msgid "Installed" - msgstr "Instalados" - -@@ -81,73 +66,73 @@ msgstr "Erro: estado de saída inválido: %s de %s" - msgid "Erased: %s" - msgstr "Removidos: %s" - --#: ../callback.py:217 --#: ../output.py:941 -+#: ../callback.py:217 ../output.py:948 ../output.py:1648 - msgid "Removing" - msgstr "Removendo" - --#: ../callback.py:219 --#: ../yum/rpmtrans.py:77 -+#: ../callback.py:219 ../yum/rpmtrans.py:78 - msgid "Cleanup" - msgstr "Limpeza" + def logLevelFromErrorLevel(error_level): + """ Convert an old-style error logging level to the new style. """ +@@ -140,7 +140,6 @@ def doLoggingSetup(debuglevel, errorlevel, + return --#: ../cli.py:106 -+#: ../cli.py:107 - #, python-format - msgid "Command \"%s\" already defined" - msgstr "Comando \"%s\" já definido" + plainformatter = logging.Formatter("%(message)s") +- syslogformatter = logging.Formatter("yum: %(message)s") + + console_stdout = logging.StreamHandler(sys.stdout) + console_stdout.setFormatter(plainformatter) +@@ -158,20 +157,17 @@ def doLoggingSetup(debuglevel, errorlevel, + filelogger.setLevel(logging.INFO) + filelogger.propagate = False --#: ../cli.py:118 -+#: ../cli.py:119 - msgid "Setting up repositories" - msgstr "Configurando repositórios" +- log_dev = syslog_device + global syslog +- if os.path.exists(log_dev): ++ if os.path.exists(syslog_device): + try: +- syslog = logging.handlers.SysLogHandler(log_dev) +- syslog.setFormatter(syslogformatter) +- filelogger.addHandler(syslog) +- if syslog_ident is not None or syslog_facility is not None: +- ident = syslog_ident or '' +- facil = syslog_facility or 'LOG_USER' +- syslog_module.openlog(ident, 0, syslogFacilityMap(facil)) ++ facil = syslogFacilityMap(syslog_facility or "USER") ++ syslog = logging.handlers.SysLogHandler(syslog_device, facil) + except socket.error: + if syslog is not None: + syslog.close() ++ else: ++ setLoggingApp(syslog_ident or "yum") ++ filelogger.addHandler(syslog) + _added_handlers = True --#: ../cli.py:129 -+#: ../cli.py:130 - msgid "Reading repository metadata in from local files" - msgstr "Lendo metadados do repositório a partir dos arquivos locais" + if debuglevel is not None: +@@ -201,5 +197,5 @@ def setFileLog(uid, logfile): --#: ../cli.py:192 --#: ../utils.py:107 -+#: ../cli.py:194 ../utils.py:193 - #, python-format - msgid "Config Error: %s" - msgstr "Erro de configuração: %s" + def setLoggingApp(app): + if syslog: +- syslogformatter = logging.Formatter("yum(%s): "% (app,) + "%(message)s") ++ syslogformatter = logging.Formatter(app + "[%(process)d]: %(message)s") + syslog.setFormatter(syslogformatter) +-- +1.7.0.1 + + +From a479fa2fca23ca0173cc06f7e4e24305df0db3cc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Wed, 24 Mar 2010 19:19:30 +0200 +Subject: [PATCH 6] Add support for remote syslogs with host:port values for syslog_device. + +--- + yum/logginglevels.py | 27 +++++++++++++++++---------- + 1 files changed, 17 insertions(+), 10 deletions(-) + +diff --git a/yum/logginglevels.py b/yum/logginglevels.py +index 3a62945..1ab11db 100644 +--- a/yum/logginglevels.py ++++ b/yum/logginglevels.py +@@ -158,16 +158,23 @@ def doLoggingSetup(debuglevel, errorlevel, + filelogger.propagate = False --#: ../cli.py:195 --#: ../cli.py:1251 --#: ../utils.py:110 -+#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 - #, python-format - msgid "Options Error: %s" - msgstr "Erro nas opções: %s" + global syslog +- if os.path.exists(syslog_device): +- try: +- facil = syslogFacilityMap(syslog_facility or "USER") +- syslog = logging.handlers.SysLogHandler(syslog_device, facil) +- except socket.error: +- if syslog is not None: +- syslog.close() +- else: +- setLoggingApp(syslog_ident or "yum") +- filelogger.addHandler(syslog) ++ if syslog_device: ++ address = None ++ if ":" in syslog_device: ++ address = syslog_device.rsplit(":", 1) ++ address = (address[0], int(address[1])) ++ elif os.path.exists(syslog_device): ++ address = syslog_device ++ if address: ++ try: ++ facil = syslogFacilityMap(syslog_facility or "USER") ++ syslog = logging.handlers.SysLogHandler(address, facil) ++ except socket.error: ++ if syslog is not None: ++ syslog.close() ++ else: ++ setLoggingApp(syslog_ident or "yum") ++ filelogger.addHandler(syslog) + _added_handlers = True --#: ../cli.py:223 -+#: ../cli.py:227 - #, python-format - msgid " Installed: %s-%s at %s" - msgstr " Instalados: %s-%s em %s" + if debuglevel is not None: +-- +1.7.0.1 + + +From b9484bfd83e3c0f83389a649a4cfd7b50b8c2b8e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Wed, 24 Mar 2010 22:04:35 +0200 +Subject: [PATCH 7] Document syslog_ident and syslog_facility config parameters. + +--- + docs/yum.conf.5 | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index cca3db7..a4789da 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -304,11 +304,11 @@ on the command line (eg. "update foo bar baz quux"). None of the short options --#: ../cli.py:225 -+#: ../cli.py:229 - #, python-format - msgid " Built : %s at %s" - msgstr " Construídos : %s em %s" + .IP + \fBsyslog_ident \fR +-XXX not implemented yet ++Identification (program name) for syslog messages. --#: ../cli.py:227 -+#: ../cli.py:231 - #, python-format - msgid " Committed: %s at %s" - msgstr " Enviados: %s em %s" + .IP + \fBsyslog_facility \fR +-XXX not implemented yet ++Facility name for syslog messages, see syslog(3). Default is `LOG_USER'. --#: ../cli.py:266 -+#: ../cli.py:270 - msgid "You need to give some command" - msgstr "Você precisa dar algum comando" + .IP + \fBproxy \fR +-- +1.7.0.1 + + +From 311221f71bba055a623565996e981156265789ef Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Wed, 24 Mar 2010 23:31:28 +0200 +Subject: [PATCH 8] Make syslog_device configurable. + +--- + docs/yum.conf.5 | 6 ++++++ + yum/__init__.py | 7 +++++-- + yum/config.py | 1 + + 3 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index a4789da..cb6f340 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -311,6 +311,12 @@ Identification (program name) for syslog messages. + Facility name for syslog messages, see syslog(3). Default is `LOG_USER'. --#: ../cli.py:309 -+#: ../cli.py:284 -+#, python-format -+msgid "No such command: %s. Please use %s --help" -+msgstr "Comando não encontrado: %s. Por favor, utilize %s --help" + .IP ++\fBsyslog_device \fR ++Where to log syslog messages. Can be a local device (path) or a host:port ++string to use a remote syslog. If empty or points to a nonexistent device, ++syslog logging is disabled. Default is `/dev/log'. + -+#: ../cli.py:314 - msgid "Disk Requirements:\n" - msgstr "Requisitos de disco:\n" - --#: ../cli.py:311 -+#: ../cli.py:316 - #, python-format --msgid " At least %dMB needed on the %s filesystem.\n" --msgstr " Pelo menos %d MB são necessários no sistema de arquivos %s.\n" -+msgid " At least %dMB more space needed on the %s filesystem.\n" -+msgstr " Pelo menos mais %dMB são necessários no sistema de arquivos %s.\n" ++.IP + \fBproxy \fR + URL to the proxy server that yum should use. - #. TODO: simplify the dependency errors? - #. Fixup the summary --#: ../cli.py:316 -+#: ../cli.py:321 - msgid "" - "Error Summary\n" - "-------------\n" -@@ -155,266 +140,262 @@ msgstr "" - "Sumário de erros\n" - "-------------\n" +diff --git a/yum/__init__.py b/yum/__init__.py +index 0aaa819..7b84a61 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -102,7 +102,7 @@ class _YumPreBaseConf: + self.enabled_plugins = None + self.syslog_ident = None + self.syslog_facility = None +- self.syslog_device = '/dev/log' ++ self.syslog_device = None + self.arch = None + self.releasever = None + self.uuid = None +@@ -270,12 +270,15 @@ class YumBase(depsolve.Depsolve): + startupconf.syslog_ident = syslog_ident + if syslog_facility != None: + startupconf.syslog_facility = syslog_facility ++ if syslog_device != None: ++ startupconf.syslog_device = syslog_device + if releasever != None: + startupconf.releasever = releasever --#: ../cli.py:359 -+#: ../cli.py:364 - msgid "Trying to run the transaction but nothing to do. Exiting." - msgstr "Tentando executar a transação, mas não há nada a ser feito. Saindo." + self.doLoggingSetup(startupconf.debuglevel, startupconf.errorlevel, + startupconf.syslog_ident, +- startupconf.syslog_facility, syslog_device) ++ startupconf.syslog_facility, ++ startupconf.syslog_device) --#: ../cli.py:395 -+#: ../cli.py:403 - msgid "Exiting on user Command" - msgstr "Saindo pelo comando do usuário" + if init_plugins and startupconf.plugins: + self.doPluginSetup(optparser, plugin_types, startupconf.pluginpath, +diff --git a/yum/config.py b/yum/config.py +index cb01306..c82fabc 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -602,6 +602,7 @@ class StartupConf(BaseConfig): + gaftonmode = BoolOption(False) + syslog_ident = Option() + syslog_facility = Option('LOG_USER') ++ syslog_device = Option('/dev/log') + persistdir = Option('/var/lib/yum') + + class YumConf(StartupConf): +-- +1.7.0.1 + + +From 203a39125e1de20500739c94e7c92d074d19790f Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 4 Mar 2010 17:17:30 -0500 +Subject: [PATCH 9] Add distro-sync command, to "force update" to the latest versions. + + This should be safe to go in for 3.2.27, as it's an entirely self +contained command ... I've tried it here going on multiple directions, +and it WMF(tm). +--- + cli.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + yumcommands.py | 22 +++++++++++++++++++ + 2 files changed, 85 insertions(+), 0 deletions(-) + +diff --git a/cli.py b/cli.py +index f5ed53d..a34d205 100644 +--- a/cli.py ++++ b/cli.py +@@ -100,6 +100,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + self.registerCommand(yumcommands.VersionCommand()) + self.registerCommand(yumcommands.HistoryCommand()) + self.registerCommand(yumcommands.CheckRpmdbCommand()) ++ self.registerCommand(yumcommands.DistroSyncCommand()) --#: ../cli.py:399 -+#: ../cli.py:407 - msgid "Downloading Packages:" - msgstr "Baixando pacotes:" + def registerCommand(self, command): + for name in command.getNames(): +@@ -649,6 +650,68 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + else: + return 0, [_('No Packages marked for Update')] --#: ../cli.py:404 -+#: ../cli.py:412 - msgid "Error Downloading Packages:\n" - msgstr "Erro ao baixar pacotes:\n" - --#: ../cli.py:418 --#: ../yum/__init__.py:4014 -+#: ../cli.py:426 ../yum/__init__.py:4195 - msgid "Running rpm_check_debug" - msgstr "Executando o rpm_check_debug" - --#: ../cli.py:427 --#: ../yum/__init__.py:4023 -+#: ../cli.py:435 ../yum/__init__.py:4204 - msgid "ERROR You need to update rpm to handle:" - msgstr "ERRO. Você precisa atualizar o rpm para manipular:" ++ # Note that we aren't in __init__ yet for a couple of reasons, but we ++ # probably will get there for 3.2.28. ++ def distroSyncPkgs(self, userlist): ++ """ This does either upgrade/downgrade, depending on if the latest ++ installed version is older or newer. We allow "selection" but not ++ local packages (use tmprepo, or something). """ ++ ++ dupdates = [] ++ ipkgs = {} ++ for pkg in sorted(self.rpmdb.returnPackages(patterns=userlist)): ++ ipkgs[pkg.name] = pkg ++ ++ obsoletes = [] ++ if self.conf.obsoletes: ++ obsoletes = self.up.getObsoletesTuples(newest=1) ++ ++ for (obsoleting, installed) in obsoletes: ++ if installed[0] not in ipkgs: ++ continue ++ dupdates.extend(self.update(pkgtup=installed)) ++ for (obsoleting, installed) in obsoletes: ++ if installed[0] not in ipkgs: ++ continue ++ del ipkgs[installed[0]] ++ ++ apkgs = {} ++ for pkg in self.pkgSack.returnNewestByName(): ++ if pkg.name not in ipkgs: ++ continue ++ apkgs[pkg.name] = pkg ++ ++ for ipkgname in ipkgs: ++ if ipkgname not in apkgs: ++ continue ++ ++ ipkg = ipkgs[ipkgname] ++ apkg = apkgs[ipkgname] ++ if ipkg.verEQ(apkg): ++ continue ++ if self.allowedMultipleInstalls(apkg): ++ found = False ++ for napkg in self.rpmdb.searchNames([apkg.name]): ++ if napkg.verEQ(apkg): ++ found = True ++ elif napkg.verGT(apkg): ++ dupdates.extend(self.remove(po=napkg)) ++ if found: ++ continue ++ dupdates.extend(self.install(pattern=apkg.name)) ++ elif ipkg.verLT(apkg): ++ n,a,e,v,r = apkg.pkgtup ++ dupdates.extend(self.update(name=n, epoch=e, ver=v, rel=r)) ++ else: ++ n,a,e,v,r = apkg.pkgtup ++ dupdates.extend(self.downgrade(name=n, epoch=e, ver=v, rel=r)) ++ ++ if dupdates: ++ msg = _('%d packages marked for Distribution Synchronization') % len(dupdates) ++ return 2, [msg] ++ else: ++ return 0, [_('No Packages marked for Distribution Synchronization')] ++ + def erasePkgs(self, userlist): + """take user commands and populate a transaction wrapper with packages + to be erased/removed""" +diff --git a/yumcommands.py b/yumcommands.py +index 35bd97c..88c047f 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -205,6 +205,28 @@ class UpdateCommand(YumCommand): + except yum.Errors.YumBaseError, e: + return 1, [str(e)] --#: ../cli.py:429 --#: ../yum/__init__.py:4026 -+#: ../cli.py:437 ../yum/__init__.py:4207 - msgid "ERROR with rpm_check_debug vs depsolve:" - msgstr "Erro com o rpm_check_debug vs depsolve:" ++class DistroSyncCommand(YumCommand): ++ def getNames(self): ++ return ['distribution-synchronization', 'distro-sync'] ++ ++ def getUsage(self): ++ return _("[PACKAGE...]") ++ ++ def getSummary(self): ++ return _("Synchronize installed packages to the latest available versions") ++ ++ def doCheck(self, base, basecmd, extcmds): ++ checkRootUID(base) ++ checkGPGKey(base) ++ ++ def doCommand(self, base, basecmd, extcmds): ++ self.doneCommand(base, _("Setting up Distribution Synchronization Process")) ++ try: ++ base.conf.obsoletes = 1 ++ return base.distroSyncPkgs(extcmds) ++ except yum.Errors.YumBaseError, e: ++ return 1, [str(e)] ++ + def _add_pkg_simple_list_lens(data, pkg, indent=''): + """ Get the length of each pkg's column. Add that to data. + This "knows" about simpleList and printVer. """ +-- +1.7.0.1 + + +From cb59d97fba6765d03a908219d5258b3896f2ecb1 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 11 Mar 2010 11:54:41 -0500 +Subject: [PATCH 10] Add documentation for distro-sync command. + +--- + docs/yum.8 | 9 +++++++++ + 1 files changed, 9 insertions(+), 0 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index 8d42d9d..ff7ed8f 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -27,6 +27,8 @@ gnome\-packagekit application\&. + .br + .I \fR * upgrade [package1] [package2] [\&.\&.\&.] + .br ++.I \fR * distribution-synchronization [package1] [package2] [\&.\&.\&.] ++.br + .I \fR * remove | erase package1 [package2] [\&.\&.\&.] + .br + .I \fR * list [\&.\&.\&.] +@@ -119,6 +121,13 @@ Running in verbose mode also shows obsoletes. + Is the same as the update command with the \-\-obsoletes flag set. See update + for more details. + .IP ++.IP "\fBdistribution-synchronization\fP" "\fBdistro-sync\fP" ++Synchronizes the installed package set with the latest packages available, this ++is done by either obsoleting, upgrading or downgrading as appropriate. This will ++"normally" do the same thing as the upgrade command however if you have the ++package FOO installed at version 4, and the latest available is only ++version 3, then this command will \fBdowngrade\fP FOO to version 3. ++.IP + .IP "\fBremove\fP or \fBerase\fP" + Are used to remove the specified packages from the system + as well as removing any packages which depend on the package being +-- +1.7.0.1 + + +From a33aa64f23ac3c197871e9100c99e9cccc3f58b1 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 11 Mar 2010 11:47:33 -0500 +Subject: [PATCH 11] Add a little more documentation to get_applicable_notices() + +--- + yum/update_md.py | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +diff --git a/yum/update_md.py b/yum/update_md.py +index 54d4cd7..fc051b0 100644 +--- a/yum/update_md.py ++++ b/yum/update_md.py +@@ -335,13 +335,15 @@ class UpdateMetadata(object): + # has a BZ fix notice. All you can see is the BZ notice for the new "pkg-3" + # with the above. + # So now instead you lookup based on the _installed_ pkg.pkgtup, and get +- # two notices, in order: [(pkg-3, notice), (pkg-2, notice)] ++ # two notices, in order: [(pkgtup-3, notice), (pkgtup-2, notice)] + # the reason for the sorting order is that the first match will give you + # the minimum pkg you need to move to. + def get_applicable_notices(self, pkgtup): + """ + Retrieve any update notices which are newer than a + given std. pkgtup (name, arch, epoch, version, release) tuple. ++ Returns: list of (pkgtup, notice) that are newer than the given pkgtup, ++ in the order of newest pkgtups first. + """ + oldpkgtup = pkgtup + name = oldpkgtup[0] +-- +1.7.0.1 + + +From 008d74a13173bcb7005e7150ebc1367720078452 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 11 Mar 2010 14:47:40 -0500 +Subject: [PATCH 12] Return an error code if yum can't install any of the specified packages + + People want a bash scriptable way to say "X should be installed". So +with this patch: + +. If _any_ package specified: is installed already; or is found and will +be installed == yum returns 0 (or at least goes into depchecking etc.) + +. If _all_ package(s) are "not found", yum turns the message "Nothing to do" +into an error (returns 1, atm). + +...thus: + +1. yum install -y a b && echo worked + +This will echo "worked" if _either_ a or b is installed after yum +finishes, but tries to install both. + +2. yum install a && yum install b && echo worked + +This will echo "worked" if both are installed (and if a is not +available, b will not even try to be installed). +--- + cli.py | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/cli.py b/cli.py +index a34d205..cebbae3 100644 +--- a/cli.py ++++ b/cli.py +@@ -595,6 +595,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + + oldcount = len(self.tsInfo) + ++ done = False + for arg in userlist: + if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or + os.path.exists(arg))): +@@ -609,8 +610,13 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + self.term.MODE['bold'], arg, + self.term.MODE['normal']) + self._maybeYouMeant(arg) ++ else: ++ done = True + if len(self.tsInfo) > oldcount: + return 2, [_('Package(s) to install')] ++ ++ if not done: ++ return 1, [_('Nothing to do')] + return 0, [_('Nothing to do')] + + def updatePkgs(self, userlist, quiet=0): +-- +1.7.0.1 + + +From b3ca56aed8f2949b73d07bf3c1aa90ae20793848 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 16 Mar 2010 17:37:04 -0400 +Subject: [PATCH 13] Add the provides data for each pkg, to format_missing_requires. Add relations. + +--- + output.py | 38 +++++++++++++++++++++++++++++++++----- + 1 files changed, 33 insertions(+), 5 deletions(-) + +diff --git a/output.py b/output.py +index b09730a..aa5dc4d 100755 +--- a/output.py ++++ b/output.py +@@ -1660,24 +1660,52 @@ class DepSolveProgressCallBack: + if not yb: + return msg + ++ def _msg_pkg(action, pkg, needname): ++ " Add a package to the message, including any provides matches. " ++ msg = _('\n %s: %s (%s)') % (action, pkg, pkg.ui_from_repo) ++ needtup = (needname, None, (None, None, None)) ++ done = False ++ for pkgtup in pkg.matchingPrcos('provides', needtup): ++ done = True ++ msg += _('\n %s') % yum.misc.prco_tuple_to_string(pkgtup) ++ if not done: ++ msg += _('\n Not found') ++ return msg ++ + ipkgs = set() + for pkg in sorted(yb.rpmdb.getProvides(needname)): +- ipkgs.add(pkg.pkgtup) ++ nevr = (pkg.name, pkg.epoch, pkg.version, pkg.release) ++ ipkgs.add(nevr) + action = _('Installed') +- if yb.tsInfo.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES): ++ rmed = yb.tsInfo.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES) ++ if rmed: + action = _('Removing') +- msg += _('\n %s: %s (%s)') % (action, pkg, pkg.ui_from_repo) ++ msg += _msg_pkg(action, pkg, needname) ++ # These should be the only three things we care about: ++ relmap = {'updatedby' : _('Updated By'), ++ 'downgradedby' : _('Downgraded By'), ++ 'obsoletedby' : _('Obsoleted By'), ++ } ++ for txmbr in rmed: ++ for (rpkg, rtype) in txmbr.relatedto: ++ if rtype not in relmap: ++ continue ++ nevr = (rpkg.name, rpkg.epoch, rpkg.version, rpkg.release) ++ ipkgs.add(nevr) ++ msg += _msg_pkg(relmap[rtype], rpkg, needname) ++ + last = None + for pkg in sorted(yb.pkgSack.getProvides(needname)): + # We don't want to see installed packages, or N packages of the + # same version, from different repos. +- if pkg.pkgtup in ipkgs or pkg.verEQ(last): ++ nevr = (pkg.name, pkg.epoch, pkg.version, pkg.release) ++ if nevr in ipkgs or (pkg.verEQ(last) and pkg.arch == last.arch): + continue + last = pkg + action = _('Available') + if yb.tsInfo.getMembersWithState(pkg.pkgtup, TS_INSTALL_STATES): + action = _('Installing') +- msg += _('\n %s: %s (%s)') % (action, pkg, pkg.repoid) ++ msg += _msg_pkg(action, pkg, needname) + return msg + + def procConflict(self, name, confname): +-- +1.7.0.1 + + +From f2c3967ea8185541a3c68fad754d19b2dfd71d35 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 22 Mar 2010 14:21:11 -0400 +Subject: [PATCH 14] Don't traceback when we can't open the history DB (non-root users by default + now), BZ 575917. + Provide a .readable interface for callers to check. + +--- + yum/history.py | 34 ++++++++++++++++++++++++++++++++-- + 1 files changed, 32 insertions(+), 2 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index 2707cac..3ef5f74 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -178,6 +178,7 @@ class YumHistory: + self.conf = yum.misc.GenericHolder() + self.conf.db_path = os.path.normpath(root + '/' + db_path) + self.conf.writable = False ++ self.conf.readable = True --#: ../cli.py:435 -+#: ../cli.py:443 - msgid "RPM needs to be updated" - msgstr "O RPM precisa ser atualizado" + if not os.path.exists(self.conf.db_path): + try: +@@ -214,7 +215,15 @@ class YumHistory: --#: ../cli.py:436 -+#: ../cli.py:444 - #, python-format - msgid "Please report this error in %s" - msgstr "Por favor, relate esse erro em %s" - --#: ../cli.py:442 -+#: ../cli.py:450 - msgid "Running Transaction Test" - msgstr "Executando teste de transação" - --#: ../cli.py:458 --msgid "Finished Transaction Test" --msgstr "Teste de transação finalizado" -- --#: ../cli.py:460 -+#: ../cli.py:466 - msgid "Transaction Check Error:\n" - msgstr "Erro na verificação da transação:\n" - --#: ../cli.py:467 -+#: ../cli.py:473 - msgid "Transaction Test Succeeded" - msgstr "Teste de transação completo" - --#: ../cli.py:489 -+#: ../cli.py:495 - msgid "Running Transaction" - msgstr "Executando a transação" - --#: ../cli.py:519 -+#: ../cli.py:525 - msgid "" - "Refusing to automatically import keys when running unattended.\n" - "Use \"-y\" to override." - msgstr "" --"Recusa de importação automática das chaves ao executar de forma não assistida.\n" -+"Recusa de importação automática das chaves ao executar de forma não " -+"assistida.\n" - "Use \"-y\" para sobrescrever." - --#: ../cli.py:538 --#: ../cli.py:572 -+#: ../cli.py:544 ../cli.py:578 - msgid " * Maybe you meant: " - msgstr " * Talvez você queira dizer: " - --#: ../cli.py:555 --#: ../cli.py:563 -+#: ../cli.py:561 ../cli.py:569 - #, python-format - msgid "Package(s) %s%s%s available, but not installed." - msgstr "Pacotes %s%s%s disponíveis, mas já instalados." - --#: ../cli.py:569 --#: ../cli.py:600 --#: ../cli.py:678 -+#: ../cli.py:575 ../cli.py:607 ../cli.py:687 - #, python-format - msgid "No package %s%s%s available." - msgstr "Nenhum pacote %s%s%s disponível." + def _get_cursor(self): + if self._conn is None: +- self._conn = sqlite.connect(self._db_file) ++ if not self.conf.readable: ++ return None ++ ++ try: ++ self._conn = sqlite.connect(self._db_file) ++ except sqlite.OperationalError: ++ self.conf.readable = False ++ return None ++ + return self._conn.cursor() + def _commit(self): + return self._conn.commit() +@@ -291,6 +300,8 @@ class YumHistory: --#: ../cli.py:605 --#: ../cli.py:738 -+#: ../cli.py:612 ../cli.py:748 - msgid "Package(s) to install" - msgstr "Pacotes a serem instalados" + def trans_with_pid(self, pid): + cur = self._get_cursor() ++ if cur is None: ++ return None + res = executeSQL(cur, + """INSERT INTO trans_with_pkgs + (tid, pkgtupid) +@@ -302,6 +313,8 @@ class YumHistory: + if not hasattr(self, '_tid') or state is None: + return # Not configured to run + cur = self._get_cursor() ++ if cur is None: ++ return # Should never happen, due to above + res = executeSQL(cur, + """INSERT INTO trans_data_pkgs + (tid, pkgtupid, state) +@@ -313,6 +326,8 @@ class YumHistory: + return # Not configured to run --#: ../cli.py:606 --#: ../cli.py:684 --#: ../cli.py:717 --#: ../cli.py:739 --#: ../yumcommands.py:159 -+#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 -+#: ../yumcommands.py:160 - msgid "Nothing to do" - msgstr "Nada a ser feito" + cur = self._get_cursor() ++ if cur is None: ++ return # Should never happen, due to above + res = executeSQL(cur, + """UPDATE trans_data_pkgs SET done = ? + WHERE tid = ? AND pkgtupid = ? AND state = ? +@@ -322,6 +337,8 @@ class YumHistory: --#: ../cli.py:639 -+#: ../cli.py:647 - #, python-format - msgid "%d packages marked for Update" - msgstr "%d pacotes marcados para atualização" + def beg(self, rpmdb_version, using_pkgs, txmbrs): + cur = self._get_cursor() ++ if cur is None: ++ return + res = executeSQL(cur, + """INSERT INTO trans_beg + (timestamp, rpmdb_version, loginuid) +@@ -343,6 +360,8 @@ class YumHistory: --#: ../cli.py:642 -+#: ../cli.py:650 - msgid "No Packages marked for Update" - msgstr "Nenhum pacote marcado para atualização" + def _log_errors(self, errors): + cur = self._get_cursor() ++ if cur is None: ++ return + for error in errors: + error = to_unicode(error) + executeSQL(cur, +@@ -356,6 +375,8 @@ class YumHistory: + return # Not configured to run --#: ../cli.py:656 -+#: ../cli.py:664 - #, python-format - msgid "%d packages marked for removal" - msgstr "%d pacotes marcados para remoção" + cur = self._get_cursor() ++ if cur is None: ++ return # Should never happen, due to above + for error in msg.split('\n'): + error = to_unicode(error) + executeSQL(cur, +@@ -387,7 +408,11 @@ class YumHistory: --#: ../cli.py:659 -+#: ../cli.py:667 - msgid "No Packages marked for removal" - msgstr "Nenhum pacote marcado para remoção" + def end(self, rpmdb_version, return_code, errors=None): + assert return_code or not errors ++ if not hasattr(self, '_tid'): ++ return # Failed at beg() time + cur = self._get_cursor() ++ if cur is None: ++ return # Should never happen, due to above + res = executeSQL(cur, + """INSERT INTO trans_end + (tid, timestamp, rpmdb_version, return_code) +@@ -444,6 +469,8 @@ class YumHistory: + """ Return a list of the last transactions, note that this includes + partial transactions (ones without an end transaction). """ + cur = self._get_cursor() ++ if cur is None: ++ return [] + sql = """SELECT tid, + trans_beg.timestamp AS beg_ts, + trans_beg.rpmdb_version AS beg_rv, +@@ -551,6 +578,10 @@ class YumHistory: + packages al. la. "yum list". Returns transaction ids. """ + # Search packages ... kind of sucks that it's search not list, pkglist? --#: ../cli.py:683 -+#: ../cli.py:692 - msgid "Package(s) to downgrade" - msgstr "Pacote(s) a ser(em) retrocedido(s)" ++ cur = self._get_cursor() ++ if cur is None: ++ return set() ++ + data = _setupHistorySearchSQL(patterns, ignore_case) + (need_full, patterns, fields, names) = data --#: ../cli.py:707 -+#: ../cli.py:717 - #, python-format - msgid " (from %s)" - msgstr " (a partir de %s)" +@@ -559,7 +590,6 @@ class YumHistory: + for row in self._yieldSQLDataList(patterns, fields, ignore_case): + pkgtupids.add(row[0]) --#: ../cli.py:709 -+#: ../cli.py:719 - #, python-format - msgid "Installed package %s%s%s%s not available." - msgstr "O pacote instalado %s%s%s%s não está disponível." +- cur = self._get_cursor() + sql = """SELECT tid FROM trans_data_pkgs WHERE pkgtupid IN """ + sql += "(%s)" % ",".join(['?'] * len(pkgtupids)) + params = list(pkgtupids) +-- +1.7.0.1 + + +From 7d04b0e6816cfb27e769bb19f44811f88523ed2b Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 22 Mar 2010 17:43:25 -0400 +Subject: [PATCH 15] Minor description fixup + +--- + yum.spec | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum.spec b/yum.spec +index 29870e5..3a724cd 100644 +--- a/yum.spec ++++ b/yum.spec +@@ -29,7 +29,7 @@ Obsoletes: yum-plugin-allow-downgrade < 1.1.22-0 + %description + Yum is a utility that can check for and automatically download and + install updated RPM packages. Dependencies are obtained and downloaded +-automatically prompting the user as necessary. ++automatically, prompting the user for permission as necessary. --#: ../cli.py:716 -+#: ../cli.py:726 - msgid "Package(s) to reinstall" - msgstr "Pacote(s) a ser(em) reinstalado(s)" + %package updatesd + Summary: Update notification daemon +-- +1.7.0.1 + + +From 1c2b28e36ef1d7051428ea57446cf800b388f36e Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 25 Mar 2010 11:29:06 -0400 +Subject: [PATCH 16] Show if transactions have error output, in history list + +--- + docs/yum.8 | 2 ++ + output.py | 3 +++ + 2 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index ff7ed8f..00bfd53 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -289,6 +289,8 @@ if there was something not good with the transaction. + .br + .I \fB#\fR - The transaction completed, but with a non-zero status. + .br ++.I \fBE\fR - The transaction completed fine, but had warning/error output during the transaction. ++.br --#: ../cli.py:729 -+#: ../cli.py:739 - msgid "No Packages Provided" - msgstr "Nenhum pacote fornecido" + .IP + .IP "\fBcheck\fP" +diff --git a/output.py b/output.py +index aa5dc4d..c4fde7c 100755 +--- a/output.py ++++ b/output.py +@@ -1310,6 +1310,9 @@ to exit. + rmark = lmark = '*' + elif old.return_code: + rmark = lmark = '#' ++ # We don't check .errors, because return_code will be non-0 ++ elif old.output: ++ rmark = lmark = 'E' + if old.altered_lt_rpmdb: + rmark = '<' + if old.altered_gt_rpmdb: +-- +1.7.0.1 + + +From 5579a905155a6be3171f6968a24e691bafcac40b Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 25 Mar 2010 11:53:51 -0400 +Subject: [PATCH 17] Fix login user column output length, for history summary + +--- + output.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/output.py b/output.py +index c4fde7c..7b09695 100755 +--- a/output.py ++++ b/output.py +@@ -1590,7 +1590,7 @@ to exit. + count, uiacts = self._history_uiactions(hpkgs) + uperiod = _period2user[period] + # Should probably use columns here, esp. for uiacts? +- print fmt % (utf8_width_fill(name, 22, 22), ++ print fmt % (utf8_width_fill(name, 26, 26), + utf8_width_fill(uperiod, 19, 19), + utf8_width_fill(uiacts, 16, 16), count) --#: ../cli.py:813 -+#: ../cli.py:818 -+#, python-format -+msgid "Matched: %s" -+msgstr "Encontrado: %s" +-- +1.7.0.1 + + +From 9c3b0e9ae6b86cd96ee8751fc9e131e063724b23 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 25 Mar 2010 15:57:24 -0400 +Subject: [PATCH 18] Add groupremove_leaf_only option + +--- + docs/yum.8 | 3 +++ + docs/yum.conf.5 | 8 ++++++++ + output.py | 4 ++++ + yum/config.py | 1 + + yum/depsolve.py | 11 +++++++++++ + 5 files changed, 27 insertions(+), 0 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index 00bfd53..c6b8c42 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -189,6 +189,9 @@ Is used to remove all of the packages in a group, unlike "groupinstall" this + will remove everything regardless of group_package_types. It is worth pointing + out that packages can be in more than one group, so "groupinstall X Y" followed + by "groupremove Y" does not do give you the same result as "groupinstall X". + -+#: ../cli.py:825 - #, python-format - msgid "Warning: No matches found for: %s" - msgstr "Aviso: nenhum resultado para: %s" - --#: ../cli.py:816 -+#: ../cli.py:828 - msgid "No Matches found" - msgstr "Nenhum pacote localizado" - --#: ../cli.py:855 -+#: ../cli.py:868 - #, python-format - msgid "" - "Warning: 3.0.x versions of yum would erroneously match against filenames.\n" - " You can use \"%s*/%s%s\" and/or \"%s*bin/%s%s\" to get that behaviour" - msgstr "" --"Aviso: as versões 3.0.x do yum iriam corresponder erroneamente pelos nomes de arquivos.\n" --" Você pode usar \"%s*/%s%s\" e/ou \"%s*bin/%s%s\" para obter esse comportamento." -+"Aviso: as versões 3.0.x do yum iriam corresponder erroneamente pelos nomes " -+"de arquivos.\n" -+" Você pode usar \"%s*/%s%s\" e/ou \"%s*bin/%s%s\" para obter esse " -+"comportamento." - --#: ../cli.py:871 -+#: ../cli.py:884 - #, python-format - msgid "No Package Found for %s" - msgstr "Nenhum pacote localizado para %s" - --#: ../cli.py:883 -+#: ../cli.py:896 - msgid "Cleaning up Everything" - msgstr "Limpando tudo" - --#: ../cli.py:897 -+#: ../cli.py:912 - msgid "Cleaning up Headers" - msgstr "Limpando cabeçalhos" - --#: ../cli.py:900 -+#: ../cli.py:915 - msgid "Cleaning up Packages" - msgstr "Limpando pacotes" - --#: ../cli.py:903 -+#: ../cli.py:918 - msgid "Cleaning up xml metadata" - msgstr "Limpando metadados em xml" - --#: ../cli.py:906 -+#: ../cli.py:921 - msgid "Cleaning up database cache" - msgstr "Limpando cache do banco de dados" - --#: ../cli.py:909 -+#: ../cli.py:924 - msgid "Cleaning up expire-cache metadata" - msgstr "Limpando metadados expirados do cache" ++The groupremove_leaf_only configuration changes the behaviour of this command ++to only remove packages which aren't required by something else. + .IP + .IP "\fBgroupinfo\fP" + Is used to give the description and package list of a group (and which type +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index cb6f340..fe195af 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -167,6 +167,14 @@ repository will be used. If \fBoverwrite_groups\fR is `0' then the groups + from all matching repositories will be merged together as one large group. --#: ../cli.py:912 -+#: ../cli.py:927 -+msgid "Cleaning up cached rpmdb data" -+msgstr "Limpando dados rpmdb em cache" + .IP ++\fBgroupremove_leaf_only \fR ++Either `0' or `1'. Used to determine yum's behaviour when the groupremove ++command is run. If \fBgroupremove_leaf_only\fR is `0' (default) then ++all packages in the group will be removed. If \fBgroupremove_leaf_only\fR is ++`1' then only those packages in the group that aren't required by another ++package will be removed. + -+#: ../cli.py:930 - msgid "Cleaning up plugins" - msgstr "Limpando plugins" - --#: ../cli.py:937 -+#: ../cli.py:955 - msgid "Installed Groups:" - msgstr "Grupos instalados:" - --#: ../cli.py:949 -+#: ../cli.py:967 - msgid "Available Groups:" - msgstr "Grupos disponíveis:" - --#: ../cli.py:959 -+#: ../cli.py:977 - msgid "Done" - msgstr "Concluído" ++.IP + \fBenable_group_conditionals\fR + Either `0' or `1'. Determines whether yum will allow the use of conditionals + packages. Default is `1' (package conditionals are allowed). +diff --git a/output.py b/output.py +index 7b09695..452f8a2 100755 +--- a/output.py ++++ b/output.py +@@ -1642,6 +1642,10 @@ class DepSolveProgressCallBack: + _('--> Processing Dependency: %s for package: %s'), formatted_req, + po) + ++ def groupRemoveReq(self, po, hits): ++ self.verbose_logger.log(logginglevels.INFO_2, ++ _('---> Keeping package: %s'), po) ++ + def unresolved(self, msg): + self.verbose_logger.log(logginglevels.INFO_2, _('--> Unresolved Dependency: %s'), + msg) +diff --git a/yum/config.py b/yum/config.py +index c82fabc..e51e46f 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -657,6 +657,7 @@ class YumConf(StartupConf): + enabled = BoolOption(True) + enablegroups = BoolOption(True) + enable_group_conditionals = BoolOption(True) ++ groupremove_leaf_only = BoolOption(False) + group_package_types = ListOption(['mandatory', 'default']) + + timeout = FloatOption(30.0) # FIXME: Should use variation of SecondsOption +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 11c9f29..f654d84 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -886,6 +886,17 @@ class Depsolve(object): + # FIXME: This is probably the best place to fix the postfix rename + # problem long term (post .21) ... see compare_providers. + for pkg, hits in self.tsInfo.getRequires(*prov).iteritems(): ++ # See the docs, this is to make groupremove "more useful". ++ if (self.conf.groupremove_leaf_only and txmbr.groups and ++ txmbr.output_state == TS_ERASE): ++ cb = self.dsCallback ++ if cb and hasattr(cb, 'groupRemoveReq'): ++ cb.groupRemoveReq(pkg, hits) ++ # We don't undo anything else here ... hopefully that's ++ # fine. ++ self.tsInfo.remove(txmbr.pkgtup) ++ return [] ++ + for hit in hits: + # See if the update solves the problem... + found = False +-- +1.7.0.1 + + +From e0175dae0b4eb45f4c2b14f816f1145553ef0e1b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Fri, 26 Mar 2010 20:44:37 +0200 +Subject: [PATCH 19] Add distro-sync completion. + +--- + etc/yum.bash | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/etc/yum.bash b/etc/yum.bash +index 5dfdb64..c71344e 100644 +--- a/etc/yum.bash ++++ b/etc/yum.bash +@@ -82,12 +82,12 @@ _yum() + local cmds=( check check-update clean deplist downgrade groupinfo + groupinstall grouplist groupremove help history info install list + localinstall makecache provides reinstall remove repolist resolvedep +- search shell update upgrade version ) ++ search shell update upgrade version distro-sync ) --#: ../cli.py:970 --#: ../cli.py:988 --#: ../cli.py:994 --#: ../yum/__init__.py:2629 -+#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 - #, python-format - msgid "Warning: Group %s does not exist." - msgstr "Aviso: O grupo %s não existe." + local i c cmd + for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )) ; do + for c in ${cmds[@]} check-rpmdb erase groupupdate grouperase \ +- whatprovides ; do ++ whatprovides distribution-synchronization ; do + [ ${COMP_WORDS[i]} = $c ] && cmd=$c && break + done + [ -z $cmd ] || break +@@ -132,7 +132,7 @@ _yum() + return 0 + ;; --#: ../cli.py:998 -+#: ../cli.py:1016 - msgid "No packages in any requested group available to install or update" --msgstr "Nenhum pacote disponível para instalação ou atualização nos grupos requisitados" -+msgstr "" -+"Nenhum pacote disponível para instalação ou atualização nos grupos " -+"requisitados" +- erase|remove) ++ erase|remove|distro-sync|distribution-synchronization) + _yum_list installed "$cur" + return 0 + ;; +-- +1.7.0.1 + + +From 1f800dfd4b8c7adb96c653ebd41f7d6b3869d569 Mon Sep 17 00:00:00 2001 +From: Timur Malikin +Date: Sun, 28 Mar 2010 14:56:53 +0000 +Subject: [PATCH 20] l10n: Updates to Russian (ru) translation + +Transmitted-via: Transifex (www.transifex.net) +--- + po/ru.po | 12 ++++++------ + 1 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/po/ru.po b/po/ru.po +index a1b946e..7c5137d 100644 +--- a/po/ru.po ++++ b/po/ru.po +@@ -10,7 +10,7 @@ msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" + "POT-Creation-Date: 2010-02-11 10:54-0500\n" +-"PO-Revision-Date: 2010-03-15 21:44+0300\n" ++"PO-Revision-Date: 2010-03-28 18:55+0400\n" + "Last-Translator: Timur Malikin \n" + "Language-Team: ru \n" + "MIME-Version: 1.0\n" +@@ -1110,24 +1110,24 @@ msgstr "Более года назад" --#: ../cli.py:1000 -+#: ../cli.py:1018 - #, python-format - msgid "%d Package(s) to Install" - msgstr "%d pacote(s) a ser(em) instalado(s)" + #: ../output.py:1585 + msgid "installed" +-msgstr "Установлено" ++msgstr "установлено" --#: ../cli.py:1010 --#: ../yum/__init__.py:2641 -+#: ../cli.py:1028 ../yum/__init__.py:2800 - #, python-format - msgid "No group named %s exists" - msgstr "Nenhum grupo de nome %s existe" + #: ../output.py:1586 + msgid "updated" +-msgstr "Обновлено" ++msgstr "обновлен" --#: ../cli.py:1016 -+#: ../cli.py:1034 - msgid "No packages to remove from groups" - msgstr "Nenhum pacote a ser removido a partir dos grupos" + #: ../output.py:1587 + msgid "obsoleted" +-msgstr "Заменено" ++msgstr "заменён" --#: ../cli.py:1018 -+#: ../cli.py:1036 - #, python-format - msgid "%d Package(s) to remove" - msgstr "%d pacote(s) a ser(em) removido(s)" + #: ../output.py:1588 + msgid "erased" +-msgstr "удалено" ++msgstr "удалён" --#: ../cli.py:1060 -+#: ../cli.py:1078 + #: ../output.py:1592 #, python-format - msgid "Package %s is already installed, skipping" - msgstr "O pacote %s já está instalado, ignorando" + msgid "---> Package %s.%s %s:%s-%s set to be %s" +-msgstr "---> Пакет %s.%s %s:%s-%s должен %s" ++msgstr "---> Пакет %s.%s %s:%s-%s должен быть%s" --#: ../cli.py:1071 -+#: ../cli.py:1089 + #: ../output.py:1599 + msgid "--> Running transaction check" +-- +1.7.0.1 + + +From 305cb4c7c937dd2ea59180c4f08c0635c614e9c9 Mon Sep 17 00:00:00 2001 +From: Timur Malikin +Date: Sun, 28 Mar 2010 14:58:49 +0000 +Subject: [PATCH 21] l10n: Updates to Russian (ru) translation + +Transmitted-via: Transifex (www.transifex.net) +--- + po/ru.po | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/po/ru.po b/po/ru.po +index 7c5137d..44c4591 100644 +--- a/po/ru.po ++++ b/po/ru.po +@@ -10,7 +10,7 @@ msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" + "POT-Creation-Date: 2010-02-11 10:54-0500\n" +-"PO-Revision-Date: 2010-03-28 18:55+0400\n" ++"PO-Revision-Date: 2010-03-28 18:58+0400\n" + "Last-Translator: Timur Malikin \n" + "Language-Team: ru \n" + "MIME-Version: 1.0\n" +@@ -1127,7 +1127,7 @@ msgstr "удалён" + #: ../output.py:1592 #, python-format - msgid "Discarding non-comparable pkg %s.%s" - msgstr "Descartando pacote não comparável %s.%s" + msgid "---> Package %s.%s %s:%s-%s set to be %s" +-msgstr "---> Пакет %s.%s %s:%s-%s должен быть%s" ++msgstr "---> Пакет %s.%s %s:%s-%s должен быть %s" - #. we've not got any installed that match n or n+a --#: ../cli.py:1097 -+#: ../cli.py:1115 - #, python-format - msgid "No other %s installed, adding to list for potential install" --msgstr "Nenhum outro %s instalado, adicionado à lista para potencial instalação" -+msgstr "" -+"Nenhum outro %s instalado, adicionado à lista para potencial instalação" + #: ../output.py:1599 + msgid "--> Running transaction check" +-- +1.7.0.1 + + +From 32fa4bdafb9c820af8f6bbbbc75cea976725e247 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Mon, 29 Mar 2010 22:25:18 -0400 +Subject: [PATCH 22] add --setopt option to yum cli + +this allows setting any config option by name. Either globally or in +any repo config. +globally: --setopt=optname=value +repo: --setopt=repoid.optname=value +--- + cli.py | 49 +++++++++++++++++++++++++++++++++++++++++++++---- + docs/yum.8 | 5 +++++ + yum/__init__.py | 4 ++++ + 3 files changed, 54 insertions(+), 4 deletions(-) + +diff --git a/cli.py b/cli.py +index cebbae3..1678e65 100644 +--- a/cli.py ++++ b/cli.py +@@ -150,7 +150,34 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + usage += "%s\n" % command.getNames()[0] --#: ../cli.py:1117 -+#: ../cli.py:1135 - msgid "Plugin Options" - msgstr "Opções do plugin" - --#: ../cli.py:1125 -+#: ../cli.py:1143 - #, python-format - msgid "Command line error: %s" - msgstr "Erro na linha de comando: %s" + return usage +- ++ ++ def _parseSetOpts(self, setopts): ++ """parse the setopts list handed to us and saves the results as ++ repo_setopts and main_setopts in the yumbase object""" ++ ++ repoopts = {} ++ mainopts = yum.misc.GenericHolder() ++ mainopts.items = [] ++ ++ for item in setopts: ++ k,v = item.split('=') ++ period = k.find('.') ++ if period != -1: ++ repo = k[:period] ++ k = k[period+1:] ++ if repo not in repoopts: ++ repoopts[repo] = yum.misc.GenericHolder() ++ repoopts[repo].items = [] ++ setattr(repoopts[repo], k, v) ++ repoopts[repo].items.append(k) ++ else: ++ setattr(mainopts, k, v) ++ mainopts.items.append(k) ++ ++ self.main_setopts = mainopts ++ self.repo_setopts = repoopts ++ ++ + def getOptionsConfig(self, args): + """parses command line arguments, takes cli args: + sets up self.conf and self.cmds as well as logger objects +@@ -167,6 +194,13 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + opts.quiet = True + opts.verbose = False --#: ../cli.py:1138 -+#: ../cli.py:1156 - #, python-format - msgid "" - "\n" -@@ -425,106 +406,117 @@ msgstr "" - "\n" - "%s: a opção %s requer um argumento" ++ # go through all the setopts and set the global ones ++ self._parseSetOpts(opts.setopts) ++ ++ if self.main_setopts: ++ for opt in self.main_setopts.items: ++ setattr(opts, opt, getattr(self.main_setopts, opt)) ++ + # get the install root to use + root = self.optparser.getRoot(opts) --#: ../cli.py:1191 -+#: ../cli.py:1209 - msgid "--color takes one of: auto, always, never" - msgstr "--color aceita uma destas opções: auto, always, never" +@@ -190,7 +224,12 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + pc.enabled_plugins = self.optparser._splitArg(opts.enableplugins) + pc.releasever = opts.releasever + self.conf +- ++ ++ # now set all the non-first-start opts from main from our setopts ++ if self.main_setopts: ++ for opt in self.main_setopts.items: ++ setattr(self.conf, opt, getattr(self.main_setopts, opt)) ++ + except yum.Errors.ConfigError, e: + self.logger.critical(_('Config Error: %s'), e) + sys.exit(1) +@@ -1218,7 +1257,8 @@ class YumOptionParser(OptionParser): + args = _filtercmdline( + ('--noplugins','--version','-q', '-v', "--quiet", "--verbose"), + ('-c', '-d', '-e', '--installroot', +- '--disableplugin', '--enableplugin', '--releasever'), ++ '--disableplugin', '--enableplugin', '--releasever', ++ '--setopt'), + args) + except ValueError, arg: + self.base.usage() +@@ -1452,7 +1492,8 @@ class YumOptionParser(OptionParser): + help=_("control whether color is used")) + group.add_option("", "--releasever", dest="releasever", default=None, + help=_("set value of $releasever in yum config and repo files")) +- ++ group.add_option("", "--setopt", dest="setopts", default=[], ++ action="append", help=_("set arbitrary config and repo options")) --#: ../cli.py:1298 -+#: ../cli.py:1319 - msgid "show this help message and exit" - msgstr "mostrar essa mensagem ajuda e sai" + + def _filtercmdline(novalopts, valopts, args): +diff --git a/docs/yum.8 b/docs/yum.8 +index c6b8c42..d36b1cc 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -417,6 +417,11 @@ $releasever in your cachedir configuration to stop this). + .IP "\fB\-t, \-\-tolerant\fP" + This option currently does nothing. + .br ++.IP "\fB\-\-setopt=option=value\fP" ++Set any config option in yum config or repo files. For options in the global ++config just use: \-\-setopt=option=value for repo options use: \-\-setopt=repoid.option=value ++.PP ++ + .SH "LIST OPTIONS" + The following are the ways which you can invoke \fByum\fP in list + mode\&. Note that all \fBlist\fP commands include information on the +diff --git a/yum/__init__.py b/yum/__init__.py +index 7b84a61..88d4467 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -377,6 +377,10 @@ class YumBase(depsolve.Depsolve): + thisrepo.repo_config_age = repo_age + thisrepo.repofile = repofn --#: ../cli.py:1302 -+#: ../cli.py:1323 - msgid "be tolerant of errors" - msgstr "ser tolerante com os erros" ++ if thisrepo.id in self.repo_setopts: ++ for opt in self.repo_setopts[thisrepo.id].items: ++ setattr(thisrepo, opt, getattr(self.repo_setopts[thisrepo.id], opt)) ++ + if validate and not validate(thisrepo): + continue + +-- +1.7.0.1 + + +From d38a25828b7699a6ffdaaecb06ba223ff2d24edb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Tue, 30 Mar 2010 18:47:35 +0300 +Subject: [PATCH 23] Add --setopt to completions. + +--- + etc/yum.bash | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/etc/yum.bash b/etc/yum.bash +index c71344e..966e33a 100644 +--- a/etc/yum.bash ++++ b/etc/yum.bash +@@ -274,7 +274,7 @@ _yum() + ;; --#: ../cli.py:1304 --msgid "run entirely from cache, don't update cache" --msgstr "executar por completo a partir do cache, não atualiza o cache" -+#: ../cli.py:1326 -+msgid "run entirely from system cache, don't update cache" -+msgstr "" -+"executar por completo a partir do cache do sistema, não atualiza o cache" + -R|--randomwait|-x|--exclude|-h|--help|--version|--releasever|--cve|\ +- --bz|--advisory|--tmprepo|--verify-filenames) ++ --bz|--advisory|--tmprepo|--verify-filenames|--setopt) + return 0 + ;; --#: ../cli.py:1306 -+#: ../cli.py:1329 - msgid "config file location" - msgstr "configurar localização do arquivo" +@@ -302,7 +302,7 @@ _yum() + --quiet --verbose --assumeyes --version --installroot --enablerepo + --disablerepo --exclude --disableexcludes --obsoletes --noplugins + --nogpgcheck --disableplugin --enableplugin --skip-broken --color +- --releasever ${cmds[@]}' -- "$cur" ) ) ++ --releasever --setopt ${cmds[@]}' -- "$cur" ) ) + } && + complete -F _yum -o filenames yum yummain.py --#: ../cli.py:1308 -+#: ../cli.py:1332 - msgid "maximum command wait time" - msgstr "Tempo máximo de espera do comando" +-- +1.7.0.1 + + +From ecfd7b5e643bab7337d44c981157768b86cab439 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 30 Mar 2010 14:31:11 -0400 +Subject: [PATCH 24] Test for repo_setopts, only there for cli + +--- + yum/__init__.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 88d4467..f7dd8f2 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -377,7 +377,7 @@ class YumBase(depsolve.Depsolve): + thisrepo.repo_config_age = repo_age + thisrepo.repofile = repofn --#: ../cli.py:1310 -+#: ../cli.py:1334 - msgid "debugging output level" - msgstr "nível de depuração na saída" +- if thisrepo.id in self.repo_setopts: ++ if hasattr(self, 'repo_setopts') and thisrepo.id in self.repo_setopts: + for opt in self.repo_setopts[thisrepo.id].items: + setattr(thisrepo, opt, getattr(self.repo_setopts[thisrepo.id], opt)) + +-- +1.7.0.1 + + +From 3e1d76650dc1c5c6128a75230db80d50e56fde65 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Tue, 30 Mar 2010 14:39:34 -0400 +Subject: [PATCH 25] change out the repo_setopts fix so instead of hasattr'ing it - we + are adding an empty one. + +--- + yum/__init__.py | 5 ++++- + 1 files changed, 4 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index f7dd8f2..cbb0dfa 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -150,6 +150,9 @@ class YumBase(depsolve.Depsolve): + self.logger = logging.getLogger("yum.YumBase") + self.verbose_logger = logging.getLogger("yum.verbose.YumBase") + self._repos = RepoStorage(self) ++ self.repo_setopts = {} # since we have to use repo_setopts in base and ++ # not in cli - set it up as empty so no one ++ # trips over it later --#: ../cli.py:1314 -+#: ../cli.py:1338 - msgid "show duplicates, in repos, in list/search commands" - msgstr "mostrar duplicados em repos e em comandos de pesquisa/listagem" + # Start with plugins disabled + self.disablePlugins() +@@ -377,7 +380,7 @@ class YumBase(depsolve.Depsolve): + thisrepo.repo_config_age = repo_age + thisrepo.repofile = repofn --#: ../cli.py:1316 -+#: ../cli.py:1340 - msgid "error output level" - msgstr "nível de erro na saída" +- if hasattr(self, 'repo_setopts') and thisrepo.id in self.repo_setopts: ++ if thisrepo.id in self.repo_setopts: + for opt in self.repo_setopts[thisrepo.id].items: + setattr(thisrepo, opt, getattr(self.repo_setopts[thisrepo.id], opt)) + +-- +1.7.0.1 + + +From 4f267e0e7eca1898ff57a546e8daa9cf89450e20 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Tue, 30 Mar 2010 16:54:37 -0400 +Subject: [PATCH 26] minor change so that if there are any empty lines in the gpgkey file we're + checking that we don't traceback. + +We won't find a key, but at least we don't traceback b/c of it. +apparently this can happen if the key we're handed is only a subkey. +--- + yum/pgpmsg.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/pgpmsg.py b/yum/pgpmsg.py +index f8dccdb..454768a 100644 +--- a/yum/pgpmsg.py ++++ b/yum/pgpmsg.py +@@ -1214,7 +1214,7 @@ a PGP "certificate" includes a public key, user id(s), and signature. + continue + + # are we at the checksum line? +- if l[0] == '=' : ++ if l and l[0] == '=' : + # get the checksum number + csum = base64.decodestring(l[1:5]) + i = 0 +-- +1.7.0.1 + + +From 01c8ad02dedeb47842d4a01593abcdba3617904a Mon Sep 17 00:00:00 2001 +From: Misha Shnurapet +Date: Thu, 1 Apr 2010 17:49:34 +0000 +Subject: [PATCH 27] l10n: Updates to Russian (ru) translation + +Transmitted-via: Transifex (www.transifex.net) +--- + po/ru.po | 688 ++++++++++++++++++++++++++++++++++---------------------------- + 1 files changed, 373 insertions(+), 315 deletions(-) + +diff --git a/po/ru.po b/po/ru.po +index 44c4591..47cd5ba 100644 +--- a/po/ru.po ++++ b/po/ru.po +@@ -2,56 +2,76 @@ + # Copyright (C) 2010 yum's COPYRIGHT HOLDER + # This file is distributed under the same license as the yum package. + # +-# Vladimir Bormotov , 2002. +-# Grigory Bakunov , 2002,2003. +-# Timur Malikin , 2010. ++# Vladimir Bormotov , 2002 ++# Grigory Bakunov , 2002, 2003 ++# Timur Malikin , 2010 ++# Misha Shnurapet , 2010 + msgid "" + msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" + "POT-Creation-Date: 2010-02-11 10:54-0500\n" +-"PO-Revision-Date: 2010-03-28 18:58+0400\n" +-"Last-Translator: Timur Malikin \n" ++"PO-Revision-Date: 2010-04-02 02:48+0800\n" ++"Last-Translator: Misha Shnurapet \n" + "Language-Team: ru \n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Generated-By: pygettext.py 1.1\n" --#: ../cli.py:1319 -+#: ../cli.py:1343 -+msgid "debugging output level for rpm" -+msgstr "nível de depuração na saída para o rpm" -+ -+#: ../cli.py:1346 - msgid "quiet operation" - msgstr "operação discreta" +-#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 ++#: ../callback.py:48 ++#: ../output.py:947 ++#: ../yum/rpmtrans.py:72 + msgid "Updating" + msgstr "Обновление" --#: ../cli.py:1321 -+#: ../cli.py:1348 - msgid "verbose operation" - msgstr "operação detalhada" +-#: ../callback.py:49 ../yum/rpmtrans.py:73 ++#: ../callback.py:49 ++#: ../yum/rpmtrans.py:73 + msgid "Erasing" + msgstr "Удаление" --#: ../cli.py:1323 -+#: ../cli.py:1350 - msgid "answer yes for all questions" - msgstr "responder sim para todas as perguntas" - --#: ../cli.py:1325 -+#: ../cli.py:1352 - msgid "show Yum version and exit" - msgstr "mostrar versão do Yum ao sair" - --#: ../cli.py:1326 -+#: ../cli.py:1353 - msgid "set install root" - msgstr "definir raiz de instalação" - --#: ../cli.py:1330 -+#: ../cli.py:1357 - msgid "enable one or more repositories (wildcards allowed)" - msgstr "habilitar um ou mais repositórios (curingas são permitidos)" - --#: ../cli.py:1334 -+#: ../cli.py:1361 - msgid "disable one or more repositories (wildcards allowed)" - msgstr "desabilitar um ou mais repositórios (curingas são permitidos)" +-#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 +-#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 ++#: ../callback.py:50 ++#: ../callback.py:51 ++#: ../callback.py:53 ++#: ../output.py:946 ++#: ../output.py:1659 ++#: ../yum/rpmtrans.py:74 ++#: ../yum/rpmtrans.py:75 + #: ../yum/rpmtrans.py:77 + msgid "Installing" + msgstr "Установка" --#: ../cli.py:1337 -+#: ../cli.py:1364 - msgid "exclude package(s) by name or glob" - msgstr "excluir pacote(s) por nome ou glob" +-#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 ++#: ../callback.py:52 ++#: ../callback.py:58 ++#: ../output.py:1484 ++#: ../yum/rpmtrans.py:76 + msgid "Obsoleted" +-msgstr "Заменено" ++msgstr "Исключено" --#: ../cli.py:1339 -+#: ../cli.py:1366 - msgid "disable exclude from main, for a repo or for everything" --msgstr "desabilitar a exclusão a partir do principal, para um repositório ou para tudo" -+msgstr "" -+"desabilitar a exclusão a partir do principal, para um repositório ou para " -+"tudo" +-#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 ++#: ../callback.py:54 ++#: ../output.py:1070 ++#: ../output.py:1442 ++#: ../output.py:1491 + msgid "Updated" + msgstr "Обновлено" --#: ../cli.py:1342 -+#: ../cli.py:1369 - msgid "enable obsoletes processing during updates" - msgstr "Habilitar processo de obsolescência durante as atualizações" +-#: ../callback.py:55 ../output.py:1438 ++#: ../callback.py:55 ++#: ../output.py:1438 + msgid "Erased" + msgstr "Удалено" --#: ../cli.py:1344 -+#: ../cli.py:1371 - msgid "disable Yum plugins" - msgstr "desabilitar plugins do Yum" +-#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 +-#: ../output.py:1434 ../output.py:1646 ++#: ../callback.py:56 ++#: ../callback.py:57 ++#: ../callback.py:59 ++#: ../output.py:1068 ++#: ../output.py:1434 ++#: ../output.py:1646 + msgid "Installed" + msgstr "Установлено" --#: ../cli.py:1346 -+#: ../cli.py:1373 - msgid "disable gpg signature checking" - msgstr "desabilitar verificação de assinaturas gpg" + #: ../callback.py:130 + msgid "No header - huh?" +-msgstr "Нет заголовка?" ++msgstr "Заголовка нет — что?!" --#: ../cli.py:1348 -+#: ../cli.py:1375 - msgid "disable plugins by name" - msgstr "desabilitar plugins pelo nome" + #: ../callback.py:168 + msgid "Repackage" +@@ -67,11 +87,14 @@ msgstr "Ошибка: неверный выходной статус: %s для + msgid "Erased: %s" + msgstr "Удалено: %s" --#: ../cli.py:1351 -+#: ../cli.py:1378 - msgid "enable plugins by name" - msgstr "habilita plugins pelo nome" +-#: ../callback.py:217 ../output.py:948 ../output.py:1648 ++#: ../callback.py:217 ++#: ../output.py:948 ++#: ../output.py:1648 + msgid "Removing" + msgstr "Удаление" --#: ../cli.py:1354 -+#: ../cli.py:1381 - msgid "skip packages with depsolving problems" - msgstr "ignorar pacotes com problemas de solução de dependências" +-#: ../callback.py:219 ../yum/rpmtrans.py:78 ++#: ../callback.py:219 ++#: ../yum/rpmtrans.py:78 + msgid "Cleanup" + msgstr "Очистка" --#: ../cli.py:1356 -+#: ../cli.py:1383 - msgid "control whether color is used" - msgstr "controla o uso da cor" +@@ -86,14 +109,17 @@ msgstr "Настройка репозиториев" -+#: ../cli.py:1385 -+msgid "set value of $releasever in yum config and repo files" -+msgstr "defina o valor de $releasever nos arquivos repo e yum config" -+ - #: ../output.py:305 - msgid "Jan" - msgstr "Jan" -@@ -577,105 +569,104 @@ msgstr "Dez" - msgid "Trying other mirror." - msgstr "Tentando outro espelho." + #: ../cli.py:130 + msgid "Reading repository metadata in from local files" +-msgstr "Чтение метаданных репозиториев с локальных файлов " ++msgstr "Чтение локальных метаданных для репозиториев" --#: ../output.py:538 -+#: ../output.py:534 +-#: ../cli.py:194 ../utils.py:193 ++#: ../cli.py:194 ++#: ../utils.py:193 #, python-format - msgid "Name : %s%s%s" - msgstr "Nome : %s%s%s" + msgid "Config Error: %s" + msgstr "Ошибка конфигурации: %s" --#: ../output.py:539 -+#: ../output.py:535 +-#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 ++#: ../cli.py:197 ++#: ../cli.py:1272 ++#: ../utils.py:196 #, python-format - msgid "Arch : %s" - msgstr "Arq. : %s" + msgid "Options Error: %s" + msgstr "Ошибка опции: %s" +@@ -143,7 +169,7 @@ msgstr "" --#: ../output.py:541 -+#: ../output.py:537 - #, python-format - msgid "Epoch : %s" - msgstr "Período : %s" + #: ../cli.py:364 + msgid "Trying to run the transaction but nothing to do. Exiting." +-msgstr "Попытка запуска транзакции, но нет задач для выполнения. Выход." ++msgstr "Попытка предпринята, делать нечего. Завершение." --#: ../output.py:542 -+#: ../output.py:538 - #, python-format - msgid "Version : %s" - msgstr "Versão : %s" + #: ../cli.py:403 + msgid "Exiting on user Command" +@@ -157,21 +183,24 @@ msgstr "Загрузка пакетов:" + msgid "Error Downloading Packages:\n" + msgstr "Ошибка загрузки пакетов:\n" --#: ../output.py:543 -+#: ../output.py:539 - #, python-format - msgid "Release : %s" - msgstr "Lançamento : %s" +-#: ../cli.py:426 ../yum/__init__.py:4195 ++#: ../cli.py:426 ++#: ../yum/__init__.py:4195 + msgid "Running rpm_check_debug" + msgstr "Запуск rpm_check_debug" --#: ../output.py:544 -+#: ../output.py:540 - #, python-format - msgid "Size : %s" - msgstr "Tamanho : %s" +-#: ../cli.py:435 ../yum/__init__.py:4204 ++#: ../cli.py:435 ++#: ../yum/__init__.py:4204 + msgid "ERROR You need to update rpm to handle:" + msgstr "ОШИБКА Вам необходимо обновить пакет вручную" --#: ../output.py:545 -+#: ../output.py:541 - #, python-format - msgid "Repo : %s" - msgstr "Repo : %s" +-#: ../cli.py:437 ../yum/__init__.py:4207 ++#: ../cli.py:437 ++#: ../yum/__init__.py:4207 + msgid "ERROR with rpm_check_debug vs depsolve:" + msgstr "ОШИБКА rpm_check_debug и разрешение зависимостей:" --#: ../output.py:547 -+#: ../output.py:543 - #, python-format - msgid "From repo : %s" - msgstr "Do repositório: %s" + #: ../cli.py:443 + msgid "RPM needs to be updated" +-msgstr "RPM пакет должен быть обновлён" ++msgstr "RPM пакет должен быть обновлен" --#: ../output.py:549 -+#: ../output.py:545 + #: ../cli.py:444 #, python-format - msgid "Committer : %s" - msgstr "Enviado por : %s" +@@ -180,19 +209,19 @@ msgstr "Пожалуйста, сообщите об этой ошибке %s" --#: ../output.py:550 -+#: ../output.py:546 - #, python-format - msgid "Committime : %s" - msgstr "Horário do envio : %s" + #: ../cli.py:450 + msgid "Running Transaction Test" +-msgstr "Проверка транзакций" ++msgstr "Проверяем сценарий..." --#: ../output.py:551 -+#: ../output.py:547 - #, python-format - msgid "Buildtime : %s" - msgstr "Horário da construção : %s" + #: ../cli.py:466 + msgid "Transaction Check Error:\n" +-msgstr "Ошибка проверки транзакции:\n" ++msgstr "Завершено с ошибкой:\n" --#: ../output.py:553 -+#: ../output.py:549 - #, python-format - msgid "Installtime: %s" - msgstr "Horário da instalação: %s" + #: ../cli.py:473 + msgid "Transaction Test Succeeded" +-msgstr "Проверка прошла успешно" ++msgstr "Успешно." --#: ../output.py:554 -+#: ../output.py:550 - msgid "Summary : " - msgstr "Sumário : " + #: ../cli.py:495 + msgid "Running Transaction" +-msgstr "Запуск транзакции" ++msgstr "Выполняем команды" --#: ../output.py:556 -+#: ../output.py:552 + #: ../cli.py:525 + msgid "" +@@ -202,25 +231,33 @@ msgstr "" + "Отмена автоматического импорта ключей во время запуска без контроля.\n" + "Используйте \"-y\" для игнорирования." + +-#: ../cli.py:544 ../cli.py:578 ++#: ../cli.py:544 ++#: ../cli.py:578 + msgid " * Maybe you meant: " + msgstr "* Возможно вы имели в виду:" + +-#: ../cli.py:561 ../cli.py:569 ++#: ../cli.py:561 ++#: ../cli.py:569 #, python-format - msgid "URL : %s" - msgstr "URL : %s" + msgid "Package(s) %s%s%s available, but not installed." + msgstr "Пакет(ы) %s%s%s доступны, но не установлены." --#: ../output.py:557 --#, python-format --msgid "License : %s" --msgstr "Licença : %s" -+#: ../output.py:553 -+msgid "License : " -+msgstr "Licença : " +-#: ../cli.py:575 ../cli.py:607 ../cli.py:687 ++#: ../cli.py:575 ++#: ../cli.py:607 ++#: ../cli.py:687 + #, python-format + msgid "No package %s%s%s available." + msgstr "Пакет %s%s%s недоступен." --#: ../output.py:558 -+#: ../output.py:554 - msgid "Description: " - msgstr "Descrição: " +-#: ../cli.py:612 ../cli.py:748 ++#: ../cli.py:612 ++#: ../cli.py:748 + msgid "Package(s) to install" + msgstr "Пакет(ы) для установки" --#: ../output.py:626 -+#: ../output.py:622 - msgid "y" - msgstr "s" +-#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 ++#: ../cli.py:613 ++#: ../cli.py:693 ++#: ../cli.py:727 ++#: ../cli.py:749 + #: ../yumcommands.py:160 + msgid "Nothing to do" + msgstr "Нечего выполнять" +@@ -232,7 +269,7 @@ msgstr "%d пакеты отмечены для обновления" --#: ../output.py:626 -+#: ../output.py:622 - msgid "yes" - msgstr "sim" + #: ../cli.py:650 + msgid "No Packages marked for Update" +-msgstr "Нет пакетов отмеченных для обновления" ++msgstr "Нет пакетов, отмеченных для обновления" --#: ../output.py:627 -+#: ../output.py:623 - msgid "n" - msgstr "n" + #: ../cli.py:664 + #, python-format +@@ -241,11 +278,11 @@ msgstr "%d пакеты отмечены для удаления" --#: ../output.py:627 -+#: ../output.py:623 - msgid "no" - msgstr "não" + #: ../cli.py:667 + msgid "No Packages marked for removal" +-msgstr "Нет пакетов отмеченных для удаления" ++msgstr "Нет пакетов, отмеченных для удаления" --#: ../output.py:631 -+#: ../output.py:627 - msgid "Is this ok [y/N]: " - msgstr "Correto? [s/N]:" + #: ../cli.py:692 + msgid "Package(s) to downgrade" +-msgstr "Пакет(ы) для возврата к предыдущей версии" ++msgstr "Пакет(ы) для отката версии" --#: ../output.py:722 -+#: ../output.py:715 + #: ../cli.py:717 #, python-format - msgid "" - "\n" -@@ -684,151 +675,151 @@ msgstr "" - "\n" - "Grupo: %s" - --#: ../output.py:726 -+#: ../output.py:719 +@@ -273,7 +310,7 @@ msgstr "Совпадений: %s" + #: ../cli.py:825 #, python-format - msgid " Group-Id: %s" - msgstr " Group-Id: %s" + msgid "Warning: No matches found for: %s" +-msgstr "Внимание: Нет совпадений для: %s" ++msgstr "Внимание: совпадений для %s не найдено" --#: ../output.py:731 -+#: ../output.py:724 - #, python-format - msgid " Description: %s" - msgstr " Descrição: %s" + #: ../cli.py:828 + msgid "No Matches found" +@@ -324,42 +361,46 @@ msgstr "Очистка кэша данных базы RPM" --#: ../output.py:733 -+#: ../output.py:726 - msgid " Mandatory Packages:" - msgstr " Pacotes obrigatórios:" + #: ../cli.py:930 + msgid "Cleaning up plugins" +-msgstr "Очистка плагинов" ++msgstr "Сброс модулей" --#: ../output.py:734 -+#: ../output.py:727 - msgid " Default Packages:" - msgstr " Pacotes padrão:" + #: ../cli.py:955 + msgid "Installed Groups:" +-msgstr "Установлены группы: " ++msgstr "Установлены коллекции: " --#: ../output.py:735 -+#: ../output.py:728 - msgid " Optional Packages:" - msgstr " Pacotes opcionais:" + #: ../cli.py:967 + msgid "Available Groups:" +-msgstr "Доступные группы:" ++msgstr "Доступные коллекции:" --#: ../output.py:736 -+#: ../output.py:729 - msgid " Conditional Packages:" - msgstr " Pacotes condicionais:" + #: ../cli.py:977 + msgid "Done" + msgstr "Выполнено" --#: ../output.py:756 -+#: ../output.py:749 +-#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 ++#: ../cli.py:988 ++#: ../cli.py:1006 ++#: ../cli.py:1012 ++#: ../yum/__init__.py:2788 #, python-format - msgid "package: %s" - msgstr "pacote: %s" + msgid "Warning: Group %s does not exist." +-msgstr "Внимание: группа %s не существует." ++msgstr "Внимание: коллекции %s не существует." --#: ../output.py:758 -+#: ../output.py:751 - msgid " No dependencies for this package" - msgstr " Nenhuma dependência para este pacote" + #: ../cli.py:1016 + msgid "No packages in any requested group available to install or update" +-msgstr "В запрашиваемых группах недоступны пакеты для обновления или установки" ++msgstr "Во всех указанных коллекциях пакеты для установки или обновления отсутствуют" --#: ../output.py:763 -+#: ../output.py:756 + #: ../cli.py:1018 #, python-format - msgid " dependency: %s" - msgstr " dependência: %s" - --#: ../output.py:765 -+#: ../output.py:758 - msgid " Unsatisfied dependency" - msgstr " Dependência não satisfeita" + msgid "%d Package(s) to Install" + msgstr "%d Пакет(ы) для установки" --#: ../output.py:837 -+#: ../output.py:830 +-#: ../cli.py:1028 ../yum/__init__.py:2800 ++#: ../cli.py:1028 ++#: ../yum/__init__.py:2800 #, python-format - msgid "Repo : %s" - msgstr "Repo : %s" - --#: ../output.py:838 -+#: ../output.py:831 - msgid "Matched from:" - msgstr "Resultado a partir de:" + msgid "No group named %s exists" +-msgstr "Группы с именем %s не существует" ++msgstr "Коллекции с названием %s не существует" --#: ../output.py:847 -+#: ../output.py:840 - msgid "Description : " - msgstr "Descrição : " + #: ../cli.py:1034 + msgid "No packages to remove from groups" +-msgstr "Нет пакетов для удаления с групп" ++msgstr "Нет пакетов для удаления из коллекций" --#: ../output.py:850 -+#: ../output.py:843 + #: ../cli.py:1036 #, python-format - msgid "URL : %s" - msgstr "URL : %s" - --#: ../output.py:853 -+#: ../output.py:846 +@@ -369,7 +410,7 @@ msgstr "%d Пакет(ы) для удаления" + #: ../cli.py:1078 #, python-format - msgid "License : %s" - msgstr "Licença : %s" + msgid "Package %s is already installed, skipping" +-msgstr "Пакет %s уже установлен, пропуск" ++msgstr "Пакет %s уже установлен, пропускаем" --#: ../output.py:856 -+#: ../output.py:849 + #: ../cli.py:1089 #, python-format - msgid "Filename : %s" - msgstr "Nome de arquivo : %s" - --#: ../output.py:860 -+#: ../output.py:853 - msgid "Other : " - msgstr "Outro : " +@@ -380,11 +421,11 @@ msgstr "Исключение несовместимого пакета %s.%s" + #: ../cli.py:1115 + #, python-format + msgid "No other %s installed, adding to list for potential install" +-msgstr "Другое %s не установлено, добавляем в список потенциальных установок" ++msgstr "Других %s не установлено, добавляем в список для возможной установки" --#: ../output.py:893 -+#: ../output.py:896 - msgid "There was an error calculating total download size" - msgstr "Houve um erro no cálculo do tamanho total do download" + #: ../cli.py:1135 + msgid "Plugin Options" +-msgstr "Опции плагина" ++msgstr "Опции модуля" --#: ../output.py:898 -+#: ../output.py:901 + #: ../cli.py:1143 #, python-format - msgid "Total size: %s" - msgstr "Tamanho total: %s" +@@ -416,7 +457,7 @@ msgstr "игнорировать ошибки" --#: ../output.py:901 -+#: ../output.py:904 - #, python-format - msgid "Total download size: %s" - msgstr "Tamanho total do download: %s" + #: ../cli.py:1326 + msgid "run entirely from system cache, don't update cache" +-msgstr "запуск только из системного кэша, не обновляйте кэш" ++msgstr "брать полностью из системного кэша, не обновлять его" --#: ../output.py:942 -+#: ../output.py:908 -+#, python-format -+msgid "Installed size: %s" -+msgstr "Tamanho depois de instalado: %s" -+ -+#: ../output.py:949 - msgid "Reinstalling" - msgstr "Reinstalando" - --#: ../output.py:943 -+#: ../output.py:950 - msgid "Downgrading" - msgstr "Desatualizando" + #: ../cli.py:1329 + msgid "config file location" +@@ -464,13 +505,11 @@ msgstr "настройка корневой папки" --#: ../output.py:944 -+#: ../output.py:951 - msgid "Installing for dependencies" - msgstr "Instalando para as dependências" + #: ../cli.py:1357 + msgid "enable one or more repositories (wildcards allowed)" +-msgstr "" +-"включение одного и более репозиториев (поиск по шаблону поддерживается)" ++msgstr "включение одного и более репозиториев (поиск по шаблону поддерживается)" --#: ../output.py:945 -+#: ../output.py:952 - msgid "Updating for dependencies" - msgstr "Atualizando para as dependências" + #: ../cli.py:1361 + msgid "disable one or more repositories (wildcards allowed)" +-msgstr "" +-"выключение одного и более репозиториев (поиск по шаблону поддерживается)" ++msgstr "выключение одного и более репозиториев (поиск по шаблону поддерживается)" --#: ../output.py:946 -+#: ../output.py:953 - msgid "Removing for dependencies" - msgstr "Removendo para as dependências" + #: ../cli.py:1364 + msgid "exclude package(s) by name or glob" +@@ -482,11 +521,11 @@ msgstr "отключает исключения для конкретного р --#: ../output.py:953 --#: ../output.py:1065 -+#: ../output.py:960 ../output.py:1072 - msgid "Skipped (dependency problems)" - msgstr "Ignorado (problemas de dependências)" + #: ../cli.py:1369 + msgid "enable obsoletes processing during updates" +-msgstr "включить процесс замены во время обновления" ++msgstr "включить обработку недействительных во время обновления" --#: ../output.py:976 -+#: ../output.py:983 - msgid "Package" - msgstr "Pacote" + #: ../cli.py:1371 + msgid "disable Yum plugins" +-msgstr "отключить плагины Yum" ++msgstr "отключить модули Yum" --#: ../output.py:976 -+#: ../output.py:983 - msgid "Arch" - msgstr "Arq." + #: ../cli.py:1373 + msgid "disable gpg signature checking" +@@ -494,11 +533,11 @@ msgstr "отключить проверку подписи gpg" --#: ../output.py:977 -+#: ../output.py:984 - msgid "Version" - msgstr "Versão" + #: ../cli.py:1375 + msgid "disable plugins by name" +-msgstr "отключить плагин по имени" ++msgstr "отключить модуль по названию" --#: ../output.py:977 -+#: ../output.py:984 - msgid "Repository" - msgstr "Repo" + #: ../cli.py:1378 + msgid "enable plugins by name" +-msgstr "включить плагин по имени" ++msgstr "включить модуль по названию" --#: ../output.py:978 -+#: ../output.py:985 - msgid "Size" - msgstr "Tam." + #: ../cli.py:1381 + msgid "skip packages with depsolving problems" +@@ -510,9 +549,7 @@ msgstr "Использовать ли цветовые схемы" --#: ../output.py:990 -+#: ../output.py:997 - #, python-format --msgid "" --" replacing %s%s%s.%s %s\n" --"\n" + #: ../cli.py:1385 + msgid "set value of $releasever in yum config and repo files" -msgstr "" --" substituindo %s%s%s.%s %s\n" --"\n" -+msgid " replacing %s%s%s.%s %s\n" -+msgstr " substituindo %s%s%s.%s %s\n" +-"установите значение $releasever в конфигурационном файле yum и в файлах " +-"репозиториев (repo)" ++msgstr "установите значение $releasever в конфигурационном файле yum и в файлах репозиториев (repo)" --#: ../output.py:999 -+#: ../output.py:1006 + #: ../output.py:305 + msgid "Jan" +@@ -661,7 +698,7 @@ msgstr "Нет" + + #: ../output.py:627 + msgid "Is this ok [y/N]: " +-msgstr "Выполнить [y/N]: " ++msgstr "Продолжить? [y/N]: " + + #: ../output.py:715 #, python-format - msgid "" +@@ -670,12 +707,12 @@ msgid "" + "Group: %s" + msgstr "" "\n" -@@ -839,7 +830,7 @@ msgstr "" - "Resumo da transação\n" - "%s\n" +-"Группа: %s" ++"Коллекция: %s" --#: ../output.py:1006 -+#: ../output.py:1013 + #: ../output.py:719 #, python-format - msgid "" - "Install %5.5s Package(s)\n" -@@ -848,7 +839,7 @@ msgstr "" - "Instalar %5.5s Pacote(s)\n" - "Atualizar %5.5s Pacote(s)\n" + msgid " Group-Id: %s" +-msgstr " Идентификатор группы: %s" ++msgstr "Код коллекции: %s" --#: ../output.py:1015 -+#: ../output.py:1022 + #: ../output.py:724 #, python-format - msgid "" - "Remove %5.5s Package(s)\n" -@@ -859,32 +850,32 @@ msgstr "" - "Reinstalar %5.5s Pacote(s)\n" - "Desatualizar %5.5s Pacote(s)\n" +@@ -750,7 +787,7 @@ msgstr "Другое:" --#: ../output.py:1059 -+#: ../output.py:1066 - msgid "Removed" - msgstr "Removido(s)" + #: ../output.py:896 + msgid "There was an error calculating total download size" +-msgstr "Произошла ошибка при подсчёте общего объёма загрузки" ++msgstr "Произошла ошибка при подсчете общего объема загрузки" --#: ../output.py:1060 -+#: ../output.py:1067 - msgid "Dependency Removed" - msgstr "Dependência(s) removida(s)" + #: ../output.py:901 + #, python-format +@@ -760,20 +797,20 @@ msgstr "Общий размер: %s" + #: ../output.py:904 + #, python-format + msgid "Total download size: %s" +-msgstr "Общий объем загрузки: %s" ++msgstr "Объем загрузки: %s" --#: ../output.py:1062 -+#: ../output.py:1069 - msgid "Dependency Installed" - msgstr "Dependência(s) instalada(s)" + #: ../output.py:908 + #, python-format + msgid "Installed size: %s" +-msgstr "установленный размер: %s" ++msgstr "Будет установлено: %s" --#: ../output.py:1064 -+#: ../output.py:1071 - msgid "Dependency Updated" - msgstr "Dependência(s) atualizada(s)" + #: ../output.py:949 + msgid "Reinstalling" +-msgstr "Переустановка:" ++msgstr "Переустановка" --#: ../output.py:1066 -+#: ../output.py:1073 - msgid "Replaced" - msgstr "Substituído(s)" + #: ../output.py:950 + msgid "Downgrading" +-msgstr "Возврат к предыдущей версии" ++msgstr "Откат версии" --#: ../output.py:1067 -+#: ../output.py:1074 - msgid "Failed" - msgstr "Falhou" + #: ../output.py:951 + msgid "Installing for dependencies" +@@ -787,7 +824,8 @@ msgstr "Обновление зависимостей" + msgid "Removing for dependencies" + msgstr "Удаление зависимостей" - #. Delta between C-c's so we treat as exit --#: ../output.py:1133 -+#: ../output.py:1140 - msgid "two" - msgstr "dois" +-#: ../output.py:960 ../output.py:1072 ++#: ../output.py:960 ++#: ../output.py:1072 + msgid "Skipped (dependency problems)" + msgstr "Пропущено (ошибка зависимостей)" -@@ -892,227 +883,380 @@ msgstr "dois" - #. Current download cancelled, interrupt (ctrl-c) again within two seconds - #. to exit. - #. Where "interupt (ctrl-c) again" and "two" are highlighted. --#: ../output.py:1144 -+#: ../output.py:1151 +@@ -824,7 +862,7 @@ msgid "" + "%s\n" + msgstr "" + "\n" +-"Итог\n" ++"Результат операции\n" + "%s\n" + + #: ../output.py:1013 +@@ -845,7 +883,7 @@ msgid "" + msgstr "" + "Удаление %5.5s пакет(ов)\n" + "Переустановка %5.5s пакета(ов)\n" +-"Возврат к предыдущей версии %5.5s пакета(ов)\n" ++"Откат версии %5.5s пакета(ов)\n" + + #: ../output.py:1066 + msgid "Removed" +@@ -884,13 +922,11 @@ msgstr "два" #, python-format msgid "" "\n" --" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s seconds\n" -+" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s " -+"seconds\n" +-" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s " +-"seconds\n" ++" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s seconds\n" "to exit.\n" msgstr "" "\n" --" Download atual cancelado, %sinterrompa com (ctrl-c) novamente%s dentro de %s%s%s segundos\n" -+" Download atual cancelado, %sinterrompa com (ctrl-c) novamente%s dentro de %s" -+"%s%s segundos\n" - "para sair.\n" +-"Текущая закачка отменена, %sвызвано (ctrl-c) повторите %s в течении%s%s%s " +-"секунд\n" ++"Текущая закачка отменена, %sвызвано (ctrl-c) повторите %s в течении%s%s%s секунд\n" + "для выхода.\n" --#: ../output.py:1155 -+#: ../output.py:1162 - msgid "user interrupt" - msgstr "interrupção do usuário" + #: ../output.py:1162 +@@ -935,13 +971,14 @@ msgstr "Система" --#: ../output.py:1173 -+#: ../output.py:1180 - msgid "Total" - msgstr "Total" + #: ../output.py:1254 + msgid "Bad transaction IDs, or package(s), given" +-msgstr "Передан плохой идентификатор транзакции или пакет(ы)" ++msgstr "Передан(ы) неверный код действий или пакет(ы)" -+#: ../output.py:1202 -+msgid "I" -+msgstr "I" -+ - #: ../output.py:1203 -+msgid "O" -+msgstr "O" -+ -+#: ../output.py:1204 -+msgid "E" -+msgstr "E" -+ -+#: ../output.py:1205 -+msgid "R" -+msgstr "R" -+ -+#: ../output.py:1206 -+msgid "D" -+msgstr "D" -+ -+#: ../output.py:1207 -+msgid "U" -+msgstr "U" -+ -+#: ../output.py:1217 - msgid "" - msgstr "" + #: ../output.py:1266 + msgid "ID" + msgstr "ID" --#: ../output.py:1204 -+#: ../output.py:1218 - msgid "System" - msgstr "Sistema" +-#: ../output.py:1267 ../output.py:1520 ++#: ../output.py:1267 ++#: ../output.py:1520 + msgid "Login user" + msgstr "Вход пользователя" --#: ../output.py:1240 -+#: ../output.py:1254 - msgid "Bad transaction IDs, or package(s), given" - msgstr "IDs de transação ou pacote(s) fornecido(s) inválido(s)" +@@ -949,43 +986,46 @@ msgstr "Вход пользователя" + msgid "Date and time" + msgstr "Дата и время" --#: ../output.py:1284 --#: ../yumcommands.py:1149 --#: ../yum/__init__.py:1067 --msgid "Warning: RPMDB has been altered since the last yum transaction." --msgstr "Aviso: o RPMDB foi alterado desde a última transação do yum." -+#: ../output.py:1266 -+msgid "ID" -+msgstr "ID" -+ -+#: ../output.py:1267 ../output.py:1520 -+msgid "Login user" -+msgstr "Usuário de login" -+ -+#: ../output.py:1268 -+msgid "Date and time" -+msgstr "Data e hora" -+ -+#: ../output.py:1269 ../output.py:1522 -+msgid "Action(s)" -+msgstr "Ação(ões)" +-#: ../output.py:1269 ../output.py:1522 ++#: ../output.py:1269 ++#: ../output.py:1522 + msgid "Action(s)" + msgstr "Действия" --#: ../output.py:1289 -+#: ../output.py:1270 ../output.py:1523 -+msgid "Altered" -+msgstr "Alterado" -+ -+#: ../output.py:1310 +-#: ../output.py:1270 ../output.py:1523 ++#: ../output.py:1270 ++#: ../output.py:1523 + msgid "Altered" + msgstr "Изменено" + + #: ../output.py:1310 msgid "No transaction ID given" - msgstr "Nenhum ID de transação fornecido" +-msgstr "Идентификатор транзакции недоступен" ++msgstr "Код действия не задан" --#: ../output.py:1297 -+#: ../output.py:1336 + #: ../output.py:1336 msgid "Bad transaction ID given" - msgstr "O ID de transação fornecido é inválido" +-msgstr "Плохой идентификатор транзакции" ++msgstr "Код действия неверен" --#: ../output.py:1302 -+#: ../output.py:1341 + #: ../output.py:1341 msgid "Not found given transaction ID" - msgstr "O ID de transação dado não foi localizado" +-msgstr "Не найден данный ID транзакции" ++msgstr "Указанный код действия не найден" --#: ../output.py:1310 -+#: ../output.py:1349 + #: ../output.py:1349 msgid "Found more than one transaction ID!" - msgstr "Foi localizado mais de um ID de transação!" +-msgstr "Найдено более одного ID транзакции!" ++msgstr "Указано более одной операции!" --#: ../output.py:1331 -+#: ../output.py:1370 + #: ../output.py:1370 msgid "No transaction ID, or package, given" - msgstr "Nenhum ID de transação ou pacote fornecido" +-msgstr "Нет данного ID транзакции или пакета" ++msgstr "Не задан код действия или пакет" --#: ../output.py:1357 -+#: ../output.py:1396 + #: ../output.py:1396 msgid "Transaction ID :" - msgstr "ID de transação:" +-msgstr "Идентификатор транзакции:" ++msgstr "Код операции:" --#: ../output.py:1359 -+#: ../output.py:1398 + #: ../output.py:1398 msgid "Begin time :" - msgstr "Horário de início:" + msgstr "Время начала:" --#: ../output.py:1362 --#: ../output.py:1364 -+#: ../output.py:1401 ../output.py:1403 +-#: ../output.py:1401 ../output.py:1403 ++#: ../output.py:1401 ++#: ../output.py:1403 msgid "Begin rpmdb :" - msgstr "Início do rpmdb:" - --#: ../output.py:1378 -+#: ../output.py:1417 - #, python-format - msgid "(%s seconds)" - msgstr "(%s segundos)" + msgstr "Начало базы данных RPM:" --#: ../output.py:1379 -+#: ../output.py:1418 +@@ -998,7 +1038,8 @@ msgstr "(%s секунд)" msgid "End time :" - msgstr "Horário do fim:" + msgstr "Конечное время:" --#: ../output.py:1382 --#: ../output.py:1384 -+#: ../output.py:1421 ../output.py:1423 +-#: ../output.py:1421 ../output.py:1423 ++#: ../output.py:1421 ++#: ../output.py:1423 msgid "End rpmdb :" - msgstr "Fim do rpmdb:" + msgstr "Конец базы данных RPM:" --#: ../output.py:1385 -+#: ../output.py:1424 +@@ -1006,7 +1047,9 @@ msgstr "Конец базы данных RPM:" msgid "User :" - msgstr "Usuário:" - --#: ../output.py:1387 --#: ../output.py:1389 --#: ../output.py:1391 -+#: ../output.py:1426 ../output.py:1428 ../output.py:1430 - msgid "Return-Code :" - msgstr "Código de retorno:" + msgstr "Пользователь:" --#: ../output.py:1387 +-#: ../output.py:1426 ../output.py:1428 ../output.py:1430 +#: ../output.py:1426 - msgid "Aborted" - msgstr "Interrompido" - --#: ../output.py:1389 +#: ../output.py:1428 - msgid "Failure:" - msgstr "Falha:" - --#: ../output.py:1391 +#: ../output.py:1430 - msgid "Success" - msgstr "Sucesso" + msgid "Return-Code :" + msgstr "Код возврата:" --#: ../output.py:1392 -+#: ../output.py:1431 +@@ -1024,11 +1067,12 @@ msgstr "Успешно" + + #: ../output.py:1431 msgid "Transaction performed with:" - msgstr "Transação realizada com:" +-msgstr "Транзакция выполняется с:" ++msgstr "Действие выполнено:" --#: ../output.py:1405 -+#: ../output.py:1444 ../output.py:1489 +-#: ../output.py:1444 ../output.py:1489 ++#: ../output.py:1444 ++#: ../output.py:1489 msgid "Downgraded" - msgstr "Desatualizados" +-msgstr "Возвращено к предыдущей версии" ++msgstr "Откат версии" #. multiple versions installed, both older and newer --#: ../output.py:1407 -+#: ../output.py:1446 - msgid "Weird" - msgstr "Estranho" + #: ../output.py:1446 +@@ -1047,7 +1091,8 @@ msgstr "Вывод сценария:" + msgid "Errors:" + msgstr "Ошибки:" --#: ../output.py:1409 -+#: ../output.py:1448 - msgid "Packages Altered:" - msgstr "Pacotes alterados:" +-#: ../output.py:1481 ../output.py:1482 ++#: ../output.py:1481 ++#: ../output.py:1482 + msgid "Install" + msgstr "Установка " --#: ../output.py:1412 -+#: ../output.py:1451 - msgid "Scriptlet output:" - msgstr "Saída do scriptlet:" +@@ -1057,7 +1102,7 @@ msgstr "Установка зависимостей" --#: ../output.py:1418 -+#: ../output.py:1457 - msgid "Errors:" - msgstr "Erros:" + #: ../output.py:1485 + msgid "Obsoleting" +-msgstr "Замена" ++msgstr "Исключаем" --#: ../output.py:1489 -+#: ../output.py:1481 ../output.py:1482 -+msgid "Install" -+msgstr "Instalar" -+ -+#: ../output.py:1483 -+msgid "Dep-Install" -+msgstr "Dep-Install" -+ -+#: ../output.py:1485 -+msgid "Obsoleting" -+msgstr "Obsoletos" -+ -+#: ../output.py:1486 -+msgid "Erase" -+msgstr "Apagar" -+ -+#: ../output.py:1487 -+msgid "Reinstall" -+msgstr "Reinstalar" -+ -+#: ../output.py:1488 -+#, fuzzy -+msgid "Downgrade" -+msgstr "Regredir" -+ -+#: ../output.py:1490 -+msgid "Update" -+msgstr "Atualizar" -+ -+#: ../output.py:1521 -+msgid "Time" -+msgstr "Hora" -+ -+#: ../output.py:1547 - msgid "Last day" - msgstr "Ontem" - --#: ../output.py:1490 -+#: ../output.py:1548 - msgid "Last week" - msgstr "Uma semana atrás" - --#: ../output.py:1491 -+#: ../output.py:1549 - msgid "Last 2 weeks" - msgstr "2 semanas atrás" - - #. US default :p --#: ../output.py:1492 -+#: ../output.py:1550 - msgid "Last 3 months" - msgstr "3 meses atrás" - --#: ../output.py:1493 -+#: ../output.py:1551 - msgid "Last 6 months" - msgstr "6 meses atrás" + #: ../output.py:1486 + msgid "Erase" +@@ -1069,7 +1114,7 @@ msgstr "Переустановка" --#: ../output.py:1494 -+#: ../output.py:1552 - msgid "Last year" - msgstr "Ano passado" + #: ../output.py:1488 + msgid "Downgrade" +-msgstr "Возврат к предыдущей версии" ++msgstr "Откат версии" --#: ../output.py:1495 -+#: ../output.py:1553 - msgid "Over a year ago" - msgstr "Há mais de um ano" + #: ../output.py:1490 + msgid "Update" +@@ -1110,38 +1155,39 @@ msgstr "Более года назад" --#: ../output.py:1524 -+#: ../output.py:1585 + #: ../output.py:1585 msgid "installed" - msgstr "instalado" +-msgstr "установлено" ++msgstr "для установки" --#: ../output.py:1525 -+#: ../output.py:1586 + #: ../output.py:1586 msgid "updated" - msgstr "atualizado" +-msgstr "обновлен" ++msgstr "для обновления" --#: ../output.py:1526 -+#: ../output.py:1587 + #: ../output.py:1587 msgid "obsoleted" - msgstr "obsoleto" +-msgstr "заменён" ++msgstr "как недействительный" --#: ../output.py:1527 -+#: ../output.py:1588 + #: ../output.py:1588 msgid "erased" - msgstr "removido" +-msgstr "удалён" ++msgstr "для удаления" --#: ../output.py:1531 -+#: ../output.py:1592 + #: ../output.py:1592 #, python-format msgid "---> Package %s.%s %s:%s-%s set to be %s" - msgstr "---> Pacote %s.%s %s:%s-%s definido para ser %s" +-msgstr "---> Пакет %s.%s %s:%s-%s должен быть %s" ++msgstr "---> Пакет %s.%s %s:%s-%s помечен %s" --#: ../output.py:1538 -+#: ../output.py:1599 + #: ../output.py:1599 msgid "--> Running transaction check" - msgstr "--> Executando verificação da transação" +-msgstr "--> Запуск проверки транзакции" ++msgstr "--> Проверка сценария" --#: ../output.py:1543 -+#: ../output.py:1604 + #: ../output.py:1604 msgid "--> Restarting Dependency Resolution with new changes." - msgstr "--> Reiniciando resolução de dependências com as novas alterações." +-msgstr "--> Перезапуск разрешения зависимостей с новыми параметрами." ++msgstr "--> Перепроверка зависимостей с новыми параметрами." --#: ../output.py:1548 -+#: ../output.py:1609 + #: ../output.py:1609 msgid "--> Finished Dependency Resolution" - msgstr "--> Resolução de dependências finalizada" +-msgstr "--> Окончание разрешения зависимостей" ++msgstr "--> Проверка зависимостей окончена" --#: ../output.py:1553 --#: ../output.py:1558 -+#: ../output.py:1614 ../output.py:1619 +-#: ../output.py:1614 ../output.py:1619 ++#: ../output.py:1614 ++#: ../output.py:1619 #, python-format msgid "--> Processing Dependency: %s for package: %s" - msgstr "--> Processando dependência: %s para o pacote: %s" - --#: ../output.py:1562 -+#: ../output.py:1623 + msgstr "--> Обработка зависимостей: %s для пакета: %s" +@@ -1149,7 +1195,7 @@ msgstr "--> Обработка зависимостей: %s для пакета: + #: ../output.py:1623 #, python-format msgid "--> Unresolved Dependency: %s" - msgstr "--> Dependência não resolvida: %s" +-msgstr "--> Неразрешённая зависимость: %s" ++msgstr "--> Неразрешенная зависимость: %s" --#: ../output.py:1568 --#: ../output.py:1573 -+#: ../output.py:1634 -+#, python-format -+msgid "Package: %s" -+msgstr "Pacote: %s" -+ -+#: ../output.py:1636 -+#, python-format -+msgid "" -+"\n" -+" Requires: %s" -+msgstr "" -+"\n" -+" Requer: %s" -+ -+#: ../output.py:1649 ../output.py:1660 -+#, python-format -+msgid "" -+"\n" -+" %s: %s (%s)" -+msgstr "" -+"\n" -+" %s: %s (%s)" -+ -+#: ../output.py:1657 -+msgid "Available" -+msgstr "Disponível" -+ -+#: ../output.py:1665 ../output.py:1670 + #: ../output.py:1634 + #, python-format +@@ -1165,7 +1211,8 @@ msgstr "" + "\n" + " Необходимо: %s" + +-#: ../output.py:1649 ../output.py:1660 ++#: ../output.py:1649 ++#: ../output.py:1660 + #, python-format + msgid "" + "\n" +@@ -1178,20 +1225,20 @@ msgstr "" + msgid "Available" + msgstr "Доступно" + +-#: ../output.py:1665 ../output.py:1670 ++#: ../output.py:1665 ++#: ../output.py:1670 #, python-format msgid "--> Processing Conflict: %s conflicts %s" - msgstr "--> Processando conflito: %s conflita com %s" +-msgstr "--> Конфликт обработки: %s конфликтует %s" ++msgstr "--> Обработка конфликта: %s конфликтует с %s" --#: ../output.py:1577 -+#: ../output.py:1674 + #: ../output.py:1674 msgid "--> Populating transaction set with selected packages. Please wait." --msgstr "--> Construindo conjunto de transações com os pacotes selecionados. Por favor aguarde." -+msgstr "" -+"--> Construindo conjunto de transações com os pacotes selecionados. Por " -+"favor aguarde." +-msgstr "" +-"--> Формирование транзакций для выбранных пакетов. Пожалуйста подождите." ++msgstr "--> Заполнение списка действий выбранными пакетами. Подождите, пожалуйста." --#: ../output.py:1581 -+#: ../output.py:1678 + #: ../output.py:1678 #, python-format msgid "---> Downloading header for %s to pack into transaction set." - msgstr "--> Baixando cabeçalho do %s para inclusão no conjunto de transações." +-msgstr "-- > Загрузка заголовков %s для создания набора транзакций" ++msgstr "---> Загрузка заголовка %s для включения в список." --#: ../utils.py:137 --#: ../yummain.py:42 -+#: ../utils.py:93 -+msgid "Running" -+msgstr "Executando" -+ -+#: ../utils.py:94 -+msgid "Sleeping" -+msgstr "Dormindo" -+ -+#: ../utils.py:95 -+msgid "Uninterruptible" -+msgstr "Ininterrompível" -+ -+#: ../utils.py:96 -+msgid "Zombie" -+msgstr "Zumbi" -+ -+#: ../utils.py:97 -+msgid "Traced/Stopped" -+msgstr "Rastreado/Parado" -+ -+#: ../utils.py:98 ../yumcommands.py:917 -+msgid "Unknown" -+msgstr "Desconhecido" -+ -+#: ../utils.py:109 -+msgid " The other application is: PackageKit" -+msgstr " O outro aplicativo é: PackageKit" -+ -+#: ../utils.py:111 -+#, python-format -+msgid " The other application is: %s" -+msgstr " O outro aplicativo é: %s" -+ -+#: ../utils.py:114 -+#, python-format -+msgid " Memory : %5s RSS (%5sB VSZ)" -+msgstr " Memória: %5s RSS (%5sB VSZ)" -+ -+#: ../utils.py:119 -+#, python-format -+msgid " Started: %s - %s ago" -+msgstr " Iniciado: %s - %s atrás" -+ -+#: ../utils.py:121 -+#, python-format -+msgid " State : %s, pid: %d" -+msgstr " Estado: %s, pid: %d" -+ -+#: ../utils.py:199 -+#, python-format -+msgid "PluginExit Error: %s" -+msgstr "Erro PluginExit: %s" -+ -+#: ../utils.py:202 -+#, python-format -+msgid "Yum Error: %s" -+msgstr "Error do Yum: %s" -+ -+#: ../utils.py:235 ../yummain.py:42 - msgid "" - "\n" - "\n" -@@ -1122,8 +1266,7 @@ msgstr "" - "\n" - "Saindo pelo cancelamento do usuário" + #: ../utils.py:93 + msgid "Running" +@@ -1213,7 +1260,8 @@ msgstr "Зомби" + msgid "Traced/Stopped" + msgstr "Трассировано/Остановлено" --#: ../utils.py:143 --#: ../yummain.py:48 -+#: ../utils.py:241 ../yummain.py:48 - msgid "" - "\n" - "\n" -@@ -1133,8 +1276,7 @@ msgstr "" - "\n" - "Saindo por um pipe defeituoso" +-#: ../utils.py:98 ../yumcommands.py:917 ++#: ../utils.py:98 ++#: ../yumcommands.py:917 + msgid "Unknown" + msgstr "Неизвестно" --#: ../utils.py:145 --#: ../yummain.py:50 -+#: ../utils.py:243 ../yummain.py:50 +@@ -1234,7 +1282,7 @@ msgstr " Память: %5s RSS (%5sB VSZ)" + #: ../utils.py:119 + #, python-format + msgid " Started: %s - %s ago" +-msgstr " Запущено: %s - %s назад" ++msgstr " Запущено: %s — %s назад" + + #: ../utils.py:121 + #, python-format +@@ -1244,14 +1292,15 @@ msgstr " Статус: %s, pid: %d" + #: ../utils.py:199 + #, python-format + msgid "PluginExit Error: %s" +-msgstr "Ошибка выхода плагина: %s" ++msgstr "Ошибка PluginExit: %s" + + #: ../utils.py:202 #, python-format + msgid "Yum Error: %s" + msgstr "Ошибка Yum: %s" + +-#: ../utils.py:235 ../yummain.py:42 ++#: ../utils.py:235 ++#: ../yummain.py:42 msgid "" "\n" -@@ -1145,20 +1287,20 @@ msgstr "" + "\n" +@@ -1261,7 +1310,8 @@ msgstr "" + "\n" + "Выход по запросу пользователя" + +-#: ../utils.py:241 ../yummain.py:48 ++#: ../utils.py:241 ++#: ../yummain.py:48 + msgid "" + "\n" + "\n" +@@ -1271,7 +1321,8 @@ msgstr "" + "\n" + "Выход из-за разрыва связи" + +-#: ../utils.py:243 ../yummain.py:50 ++#: ../utils.py:243 ++#: ../yummain.py:50 + #, python-format + msgid "" + "\n" +@@ -1282,9 +1333,10 @@ msgstr "" "\n" "%s" --#: ../utils.py:184 --#: ../yummain.py:273 -+#: ../utils.py:282 ../yummain.py:211 +-#: ../utils.py:282 ../yummain.py:211 ++#: ../utils.py:282 ++#: ../yummain.py:211 msgid "Complete!" - msgstr "Concluído!" +-msgstr "Выполнено!" ++msgstr "Готово!" --#: ../yumcommands.py:42 -+#: ../yumcommands.py:43 + #: ../yumcommands.py:43 msgid "You need to be root to perform this command." - msgstr "Você precisa ser root para executar este comando." - --#: ../yumcommands.py:49 -+#: ../yumcommands.py:50 +@@ -1294,8 +1346,7 @@ msgstr "Необходимы привилегии суперпользовате msgid "" "\n" "You have enabled checking of packages via GPG keys. This is a good thing. \n" --"However, you do not have any GPG public keys installed. You need to download\n" -+"However, you do not have any GPG public keys installed. You need to " -+"download\n" +-"However, you do not have any GPG public keys installed. You need to " +-"download\n" ++"However, you do not have any GPG public keys installed. You need to download\n" "the keys for packages you wish to install and install them.\n" "You can do that by running the command:\n" " rpm --import public.gpg.key\n" -@@ -1171,8 +1313,10 @@ msgid "" - "For more information contact your distribution or package provider.\n" - msgstr "" - "\n" --"Você habilitou a verificação de pacotes através de chaves GPG. Isso é uma boa coisa.\n" --"Entretanto, você não tem nenhuma chave GPG pública instalada. Você precisa baixar\n" -+"Você habilitou a verificação de pacotes através de chaves GPG. Isso é uma " -+"boa coisa.\n" -+"Entretanto, você não tem nenhuma chave GPG pública instalada. Você precisa " -+"baixar\n" - "e instalar essas chaves para os pacotes que deseja instalar.\n" - "Você pode fazer isso executando o comando:\n" - " rpm --import public.gpg.key\n" -@@ -1182,345 +1326,338 @@ msgstr "" - " do repositório, a url da chave que você gostaria de usar\n" - "para ele e o yum irá instalá-la para você.\n" +@@ -1319,8 +1370,7 @@ msgstr "" + "для репозитория. Опция \"gpgkey\" в секции репозитория и Yum\n" + "установит его.\n" "\n" --"Para mais informações contate o fornecedor da sua distribuição ou do pacote.\n" -+"Para mais informações contate o fornecedor da sua distribuição ou do " -+"pacote.\n" +-"Чтобы узнать больше, пожалуйста, свяжитесь с поставщиком дистрибутива или " +-"пакета.\n" ++"Чтобы узнать больше, пожалуйста, свяжитесь с поставщиком дистрибутива или пакета.\n" --#: ../yumcommands.py:69 -+#: ../yumcommands.py:70 + #: ../yumcommands.py:70 #, python-format - msgid "Error: Need to pass a list of pkgs to %s" - msgstr "Erro: É necessário passar uma lista de pacotes para %s" - --#: ../yumcommands.py:75 -+#: ../yumcommands.py:76 - msgid "Error: Need an item to match" - msgstr "Erro: É necessário um item para corresponder" +@@ -1333,7 +1383,7 @@ msgstr "Ошибка: Необходим параметр для соответ --#: ../yumcommands.py:81 -+#: ../yumcommands.py:82 + #: ../yumcommands.py:82 msgid "Error: Need a group or list of groups" - msgstr "Erro: É necessário um grupo ou uma lista de grupos" - --#: ../yumcommands.py:90 -+#: ../yumcommands.py:91 - #, python-format - msgid "Error: clean requires an option: %s" - msgstr "Erro: a limpeza requer uma opção: %s" - --#: ../yumcommands.py:95 -+#: ../yumcommands.py:96 - #, python-format - msgid "Error: invalid clean argument: %r" - msgstr "Erro: argumento de limpeza inválido: %r" - --#: ../yumcommands.py:108 -+#: ../yumcommands.py:109 - msgid "No argument to shell" - msgstr "Nenhum argumento para o shell" +-msgstr "Ошибка: Необходима группа или список групп" ++msgstr "Ошибка: нужна коллекция или список групп" --#: ../yumcommands.py:110 -+#: ../yumcommands.py:111 + #: ../yumcommands.py:91 #, python-format - msgid "Filename passed to shell: %s" - msgstr "Nome de arquivo passado para o shell: %s" - --#: ../yumcommands.py:114 -+#: ../yumcommands.py:115 +@@ -1357,14 +1407,11 @@ msgstr "Имя файла принятое для командной оболо + #: ../yumcommands.py:115 #, python-format msgid "File %s given as argument to shell does not exist." - msgstr "O arquivo %s, passado como um argumento para o shell, não existe." +-msgstr "" +-"Файл %s переданный в качестве аргумента для командной оболочки не существует." ++msgstr "Файл %s переданный в качестве аргумента для командной оболочки не существует." --#: ../yumcommands.py:120 -+#: ../yumcommands.py:121 + #: ../yumcommands.py:121 msgid "Error: more than one file given as argument to shell." - msgstr "Erro: mais de um arquivo passado como argumento para o shell." +-msgstr "" +-"Ошибка: более чем один файл указан в качестве аргумента для командной " +-"оболочки." ++msgstr "Ошибка: более чем один файл указан в качестве аргумента для командной оболочки." --#: ../yumcommands.py:169 -+#: ../yumcommands.py:170 + #: ../yumcommands.py:170 msgid "PACKAGE..." - msgstr "PACOTE..." +@@ -1372,11 +1419,11 @@ msgstr "ПАКЕТ..." --#: ../yumcommands.py:172 -+#: ../yumcommands.py:173 + #: ../yumcommands.py:173 msgid "Install a package or packages on your system" - msgstr "Instala um ou mais pacotes no seu sistema" +-msgstr "Установка пакета(пакетов) в вашей системе" ++msgstr "Установка пакета(ов) в систему" --#: ../yumcommands.py:180 -+#: ../yumcommands.py:181 + #: ../yumcommands.py:181 msgid "Setting up Install Process" - msgstr "Configurando o processo de instalação" +-msgstr "Настройка процесса установки" ++msgstr "Подготовка к установке" --#: ../yumcommands.py:191 -+#: ../yumcommands.py:192 + #: ../yumcommands.py:192 msgid "[PACKAGE...]" - msgstr "[PACOTE...]" +@@ -1384,15 +1431,15 @@ msgstr "[ПАКЕТ...]" --#: ../yumcommands.py:194 -+#: ../yumcommands.py:195 + #: ../yumcommands.py:195 msgid "Update a package or packages on your system" - msgstr "Atualiza um ou mais pacotes do seu sistema" +-msgstr "Обновление пакета(ов) в вашей системе" ++msgstr "Обновление пакета(ов) в системе" --#: ../yumcommands.py:201 -+#: ../yumcommands.py:202 + #: ../yumcommands.py:202 msgid "Setting up Update Process" - msgstr "Configurando o processo de atualização" +-msgstr "Настройка процесса обновления" ++msgstr "Подготовка к обновлению" --#: ../yumcommands.py:246 -+#: ../yumcommands.py:244 + #: ../yumcommands.py:244 msgid "Display details about a package or group of packages" - msgstr "Mostra detalhes sobre um pacote ou grupos de pacotes" +-msgstr "Отобразить подробности о пакете или о группе пакетов" ++msgstr "Отобразить информацию о пакете или о коллекции пакетов" --#: ../yumcommands.py:295 -+#: ../yumcommands.py:293 + #: ../yumcommands.py:293 msgid "Installed Packages" - msgstr "Pacotes instalados" - --#: ../yumcommands.py:303 -+#: ../yumcommands.py:301 - msgid "Available Packages" - msgstr "Pacotes disponíveis" - --#: ../yumcommands.py:307 -+#: ../yumcommands.py:305 - msgid "Extra Packages" - msgstr "Pacotes extras" +@@ -1408,12 +1455,14 @@ msgstr "Дополнительные пакеты" --#: ../yumcommands.py:311 -+#: ../yumcommands.py:309 + #: ../yumcommands.py:309 msgid "Updated Packages" - msgstr "Pacotes atualizados" +-msgstr "Обновлённые пакеты" ++msgstr "Обновленные пакеты" #. This only happens in verbose mode --#: ../yumcommands.py:319 --#: ../yumcommands.py:326 --#: ../yumcommands.py:603 -+#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 +-#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 ++#: ../yumcommands.py:317 ++#: ../yumcommands.py:324 ++#: ../yumcommands.py:601 msgid "Obsoleting Packages" - msgstr "Tornando pacotes obsoletos" +-msgstr "Заменённые пакеты" ++msgstr "Исключенные пакеты" --#: ../yumcommands.py:328 -+#: ../yumcommands.py:326 + #: ../yumcommands.py:326 msgid "Recently Added Packages" - msgstr "Pacotes adicionados recentemente" +@@ -1421,43 +1470,43 @@ msgstr "Недавно добавленные пакеты" --#: ../yumcommands.py:335 -+#: ../yumcommands.py:333 + #: ../yumcommands.py:333 msgid "No matching Packages to list" - msgstr "Nenhum pacote correspondente a ser listado" +-msgstr "Нет совпадений с списком пакетов" ++msgstr "Совпадений среди пакетов не найдено" --#: ../yumcommands.py:349 -+#: ../yumcommands.py:347 + #: ../yumcommands.py:347 msgid "List a package or groups of packages" - msgstr "Lista um pacote ou grupos de pacotes" +-msgstr "Список пакетов или группы пакетов" ++msgstr "Вывести список пакетов или коллекций пакетов" --#: ../yumcommands.py:361 -+#: ../yumcommands.py:359 + #: ../yumcommands.py:359 msgid "Remove a package or packages from your system" - msgstr "Remove um ou mais pacotes do seu sistema" +-msgstr "Удаление пакета(пакетов) с вашей системы" ++msgstr "Удаление пакета(ов) из системы" --#: ../yumcommands.py:368 -+#: ../yumcommands.py:366 + #: ../yumcommands.py:366 msgid "Setting up Remove Process" - msgstr "Configurando o processo de remoção" +-msgstr "Настройка процесса удаления" ++msgstr "Подготовка к удалению" --#: ../yumcommands.py:382 -+#: ../yumcommands.py:380 + #: ../yumcommands.py:380 msgid "Setting up Group Process" - msgstr "Configurando o processo de grupos" +-msgstr "Настройка группового процесса" ++msgstr "Подготовка к обработке коллекции" --#: ../yumcommands.py:388 -+#: ../yumcommands.py:386 + #: ../yumcommands.py:386 msgid "No Groups on which to run command" - msgstr "Não há grupos nos quais executar o comando" +-msgstr "Нет групп для запуска команды" ++msgstr "Коллекций пакетов к обработке нет" --#: ../yumcommands.py:401 -+#: ../yumcommands.py:399 + #: ../yumcommands.py:399 msgid "List available package groups" - msgstr "Lista os grupos de pacotes disponíveis" +-msgstr "Список доступных групп пакетов" ++msgstr "Список доступных коллекций пакетов" --#: ../yumcommands.py:418 -+#: ../yumcommands.py:416 + #: ../yumcommands.py:416 msgid "Install the packages in a group on your system" - msgstr "Instala pacotes em um grupo ou no seu sistema" +-msgstr "Установка пакетов из группы в вашу систему" ++msgstr "Установка коллекции пакетов в систему" --#: ../yumcommands.py:440 -+#: ../yumcommands.py:438 + #: ../yumcommands.py:438 msgid "Remove the packages in a group from your system" - msgstr "Remove pacotes de um grupo ou do seu sistema" +-msgstr "Удаление пакета(пакетов) с вашей системы из группы" ++msgstr "Удаление коллекции пакета(ов) из системы" --#: ../yumcommands.py:467 -+#: ../yumcommands.py:465 + #: ../yumcommands.py:465 msgid "Display details about a package group" - msgstr "Mostra detalhes sobre um grupo de pacotes" +-msgstr "Отображение подробностей о группе пакетов" ++msgstr "Показать информацию о коллекции пакетов" --#: ../yumcommands.py:491 -+#: ../yumcommands.py:489 + #: ../yumcommands.py:489 msgid "Generate the metadata cache" - msgstr "Gera o cache de metadados" - --#: ../yumcommands.py:497 -+#: ../yumcommands.py:495 - msgid "Making cache files for all metadata files." - msgstr "Realizando cache de arquivos para todos os metadados." +@@ -1469,7 +1518,7 @@ msgstr "Создание кэша для всех метаданных файл --#: ../yumcommands.py:498 -+#: ../yumcommands.py:496 + #: ../yumcommands.py:496 msgid "This may take a while depending on the speed of this computer" - msgstr "Isso pode demorar um pouco, dependendo da velocidade deste computador" +-msgstr "Это займёт немного времени, в зависимости от скорости компьютера" ++msgstr "Это займет немного времени, в зависимости от скорости компьютера" --#: ../yumcommands.py:519 -+#: ../yumcommands.py:517 + #: ../yumcommands.py:517 msgid "Metadata Cache Created" - msgstr "Cache de metadados criado" - --#: ../yumcommands.py:533 -+#: ../yumcommands.py:531 - msgid "Remove cached data" - msgstr "Remove os dados do cache" - --#: ../yumcommands.py:553 -+#: ../yumcommands.py:551 - msgid "Find what package provides the given value" - msgstr "Localiza qual pacote fornece o valor dado" - --#: ../yumcommands.py:573 -+#: ../yumcommands.py:571 - msgid "Check for available package updates" - msgstr "Verifica por atualizações de pacotes disponíveis" - --#: ../yumcommands.py:623 -+#: ../yumcommands.py:621 - msgid "Search package details for the given string" - msgstr "Pesquisa detalhes do pacote para a string fornecida" - --#: ../yumcommands.py:629 -+#: ../yumcommands.py:627 - msgid "Searching Packages: " - msgstr "Pesquisando por pacotes:" +@@ -1497,7 +1546,7 @@ msgstr "Поиск пакетов:" --#: ../yumcommands.py:646 -+#: ../yumcommands.py:644 + #: ../yumcommands.py:644 msgid "Update packages taking obsoletes into account" - msgstr "Atualiza pacotes levando em conta os obsoletos" +-msgstr "Обновить пакеты, учитывая замены" ++msgstr "Обновить пакеты, учитывая недействительные" --#: ../yumcommands.py:654 -+#: ../yumcommands.py:652 + #: ../yumcommands.py:652 msgid "Setting up Upgrade Process" - msgstr "Configurando o processo de atualização" - --#: ../yumcommands.py:668 -+#: ../yumcommands.py:666 - msgid "Install a local RPM" - msgstr "Instala um RPM local" +@@ -1509,7 +1558,7 @@ msgstr "Установка локального пакета" --#: ../yumcommands.py:676 -+#: ../yumcommands.py:674 + #: ../yumcommands.py:674 msgid "Setting up Local Package Process" - msgstr "Configurando o processo de pacote local" +-msgstr "Настройка процесса для локального пакета" ++msgstr "Подготовка действий с локальным пакетом" --#: ../yumcommands.py:695 -+#: ../yumcommands.py:693 + #: ../yumcommands.py:693 msgid "Determine which package provides the given dependency" - msgstr "Determina qual pacote fornece a dependência dada" - --#: ../yumcommands.py:698 -+#: ../yumcommands.py:696 - msgid "Searching Packages for Dependency:" - msgstr "Pesquisando pacotes por dependência:" - --#: ../yumcommands.py:712 -+#: ../yumcommands.py:710 - msgid "Run an interactive yum shell" - msgstr "Executa um shell interativo do yum" - --#: ../yumcommands.py:718 -+#: ../yumcommands.py:716 - msgid "Setting up Yum Shell" - msgstr "Configurando o shell do Yum" - --#: ../yumcommands.py:736 -+#: ../yumcommands.py:734 - msgid "List a package's dependencies" - msgstr "Lista as dependências de um pacote" - --#: ../yumcommands.py:742 -+#: ../yumcommands.py:740 - msgid "Finding dependencies: " - msgstr "Localizando dependências:" - --#: ../yumcommands.py:758 -+#: ../yumcommands.py:756 +@@ -1539,17 +1588,19 @@ msgstr "Поиск зависимостей:" msgid "Display the configured software repositories" - msgstr "Exibe os repositórios de software configurados" + msgstr "Отобразить сконфигурированные репозитории ПО" --#: ../yumcommands.py:810 --#: ../yumcommands.py:811 -+#: ../yumcommands.py:822 ../yumcommands.py:823 +-#: ../yumcommands.py:822 ../yumcommands.py:823 ++#: ../yumcommands.py:822 ++#: ../yumcommands.py:823 msgid "enabled" - msgstr "habilitado" + msgstr "включено" --#: ../yumcommands.py:819 --#: ../yumcommands.py:820 -+#: ../yumcommands.py:849 ../yumcommands.py:850 +-#: ../yumcommands.py:849 ../yumcommands.py:850 ++#: ../yumcommands.py:849 ++#: ../yumcommands.py:850 msgid "disabled" - msgstr "desabilitado" + msgstr "отключено" --#: ../yumcommands.py:834 -+#: ../yumcommands.py:866 + #: ../yumcommands.py:866 msgid "Repo-id : " - msgstr "Repo-id : " +-msgstr "Идентификатор репозитория:" ++msgstr "Код репозитория:" --#: ../yumcommands.py:835 -+#: ../yumcommands.py:867 + #: ../yumcommands.py:867 msgid "Repo-name : " - msgstr "Repo-name : " +@@ -1557,7 +1608,7 @@ msgstr "Имя репозитория:" --#: ../yumcommands.py:836 -+#: ../yumcommands.py:870 + #: ../yumcommands.py:870 msgid "Repo-status : " - msgstr "Repo-status : " +-msgstr "Статус репозитория:" ++msgstr "Состояние репозитория:" --#: ../yumcommands.py:838 -+#: ../yumcommands.py:873 + #: ../yumcommands.py:873 msgid "Repo-revision: " - msgstr "Repo-revision: " - --#: ../yumcommands.py:842 -+#: ../yumcommands.py:877 - msgid "Repo-tags : " - msgstr "Repo-tags : " - --#: ../yumcommands.py:848 -+#: ../yumcommands.py:883 - msgid "Repo-distro-tags: " - msgstr "Repo-distro-tags: " +@@ -1573,7 +1624,7 @@ msgstr "Метки репозитория дистрибутива:" --#: ../yumcommands.py:853 -+#: ../yumcommands.py:888 + #: ../yumcommands.py:888 msgid "Repo-updated : " - msgstr "Repo-updated : " +-msgstr "Репозиторий обновлён:" ++msgstr "Репозиторий обновлен:" --#: ../yumcommands.py:855 -+#: ../yumcommands.py:890 + #: ../yumcommands.py:890 msgid "Repo-pkgs : " - msgstr "Repo-pkgs : " - --#: ../yumcommands.py:856 -+#: ../yumcommands.py:891 - msgid "Repo-size : " - msgstr "Repo-size : " - --#: ../yumcommands.py:863 -+#: ../yumcommands.py:898 - msgid "Repo-baseurl : " - msgstr "Repo-baseurl : " +@@ -1632,21 +1683,24 @@ msgstr "Исключено из репозитория:" --#: ../yumcommands.py:871 -+#: ../yumcommands.py:906 - msgid "Repo-metalink: " - msgstr "Repo-metalink: " + #. Work out the first (id) and last (enabled/disalbed/count), + #. then chop the middle (name)... +-#: ../yumcommands.py:951 ../yumcommands.py:980 ++#: ../yumcommands.py:951 ++#: ../yumcommands.py:980 + msgid "repo id" + msgstr "Идентификатор репозитория" --#: ../yumcommands.py:875 -+#: ../yumcommands.py:910 - msgid " Updated : " - msgstr " Atualizados :" +-#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 ++#: ../yumcommands.py:968 ++#: ../yumcommands.py:969 ++#: ../yumcommands.py:987 + msgid "status" +-msgstr "статус" ++msgstr "состояние" --#: ../yumcommands.py:878 -+#: ../yumcommands.py:913 - msgid "Repo-mirrors : " - msgstr "Repo-mirrors : " + #: ../yumcommands.py:981 + msgid "repo name" +-msgstr "имя репозитория" ++msgstr "репозиторий" --#: ../yumcommands.py:882 --#: ../yummain.py:133 --msgid "Unknown" --msgstr "Desconhecido" -- --#: ../yumcommands.py:888 -+#: ../yumcommands.py:923 - #, python-format - msgid "Never (last: %s)" - msgstr "Nunca (último: %s)" + #: ../yumcommands.py:1018 + msgid "Display a helpful usage message" +-msgstr "Отобразить сообщение помощи" ++msgstr "Отобразить подсказку к использованию" --#: ../yumcommands.py:890 -+#: ../yumcommands.py:925 + #: ../yumcommands.py:1052 #, python-format - msgid "Instant (last: %s)" - msgstr "Instante (último: %s)" +@@ -1675,19 +1729,19 @@ msgstr "" --#: ../yumcommands.py:893 -+#: ../yumcommands.py:928 - #, python-format - msgid "%s second(s) (last: %s)" - msgstr "%s segundo(s) (último: %s)" - --#: ../yumcommands.py:895 -+#: ../yumcommands.py:930 - msgid "Repo-expire : " - msgstr "Repo-expire : " - --#: ../yumcommands.py:898 -+#: ../yumcommands.py:933 - msgid "Repo-exclude : " - msgstr "Repo-exclude : " - --#: ../yumcommands.py:902 -+#: ../yumcommands.py:937 - msgid "Repo-include : " - msgstr "Repo-include : " - -+#: ../yumcommands.py:941 -+msgid "Repo-excluded: " -+msgstr "Repo-excluded: " -+ - #. Work out the first (id) and last (enabled/disalbed/count), - #. then chop the middle (name)... --#: ../yumcommands.py:912 --#: ../yumcommands.py:938 -+#: ../yumcommands.py:951 ../yumcommands.py:980 - msgid "repo id" - msgstr "id do repo" - --#: ../yumcommands.py:926 --#: ../yumcommands.py:927 --#: ../yumcommands.py:941 -+#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 - msgid "status" - msgstr "status" - --#: ../yumcommands.py:939 -+#: ../yumcommands.py:981 - msgid "repo name" - msgstr "nome do repo" - --#: ../yumcommands.py:965 -+#: ../yumcommands.py:1018 - msgid "Display a helpful usage message" - msgstr "Exibe uma mensagem de uso para ajuda" - --#: ../yumcommands.py:999 -+#: ../yumcommands.py:1052 - #, python-format - msgid "No help available for %s" - msgstr "Nenhuma ajuda disponível para %s" - --#: ../yumcommands.py:1004 -+#: ../yumcommands.py:1057 - msgid "" - "\n" - "\n" -@@ -1530,7 +1667,7 @@ msgstr "" - "\n" - "apelidos: " - --#: ../yumcommands.py:1006 -+#: ../yumcommands.py:1059 - msgid "" - "\n" - "\n" -@@ -1540,143 +1677,99 @@ msgstr "" - "\n" - "apelido: " - --#: ../yumcommands.py:1034 -+#: ../yumcommands.py:1087 + #: ../yumcommands.py:1087 msgid "Setting up Reinstall Process" - msgstr "Configurando o processo de reinstalação" +-msgstr "Настройка процесса переустановки" ++msgstr "Подготовка к повторной установке" --#: ../yumcommands.py:1042 -+#: ../yumcommands.py:1095 + #: ../yumcommands.py:1095 msgid "reinstall a package" - msgstr "reinstala um pacote" +-msgstr "Переустановка пакета" ++msgstr "переустановка пакета" --#: ../yumcommands.py:1060 -+#: ../yumcommands.py:1113 + #: ../yumcommands.py:1113 msgid "Setting up Downgrade Process" - msgstr "Configurando o processo de retrocesso" +-msgstr "Настройка процесса возврата к предыдущей версии" ++msgstr "Подготовка к откату версии" --#: ../yumcommands.py:1067 -+#: ../yumcommands.py:1120 + #: ../yumcommands.py:1120 msgid "downgrade a package" - msgstr "retrocedendo um pacote" +-msgstr "Возврат к предыдущей версии пакета" ++msgstr "откат к предыдущей версии пакета" --#: ../yumcommands.py:1081 -+#: ../yumcommands.py:1134 + #: ../yumcommands.py:1134 msgid "Display a version for the machine and/or available repos." - msgstr "Exibe uma versão para a máquina e/ou os repositórios disponíveis." - --#: ../yumcommands.py:1111 -+#: ../yumcommands.py:1173 - msgid " Yum version groups:" - msgstr " Grupos da versão do Yum:" +@@ -1699,7 +1753,7 @@ msgstr " Группы версий Yum:" --#: ../yumcommands.py:1121 -+#: ../yumcommands.py:1183 + #: ../yumcommands.py:1183 msgid " Group :" - msgstr " Grupo:" +-msgstr " Группа:" ++msgstr "Коллекция:" --#: ../yumcommands.py:1122 -+#: ../yumcommands.py:1184 + #: ../yumcommands.py:1184 msgid " Packages:" - msgstr " Pacotes:" +@@ -1707,44 +1761,45 @@ msgstr " Пакеты:" --#: ../yumcommands.py:1152 -+#: ../yumcommands.py:1213 + #: ../yumcommands.py:1213 msgid "Installed:" - msgstr "Instalados:" +-msgstr "Установлено: " ++msgstr "Установлен(ы):" --#: ../yumcommands.py:1157 -+#: ../yumcommands.py:1218 + #: ../yumcommands.py:1218 msgid "Group-Installed:" - msgstr "Grupos instalados:" +-msgstr "Группа установленных:" ++msgstr "Установлены коллекцей:" --#: ../yumcommands.py:1166 -+#: ../yumcommands.py:1227 + #: ../yumcommands.py:1227 msgid "Available:" - msgstr "Disponíveis:" +-msgstr "Доступно:" ++msgstr "Доступен(ы):" --#: ../yumcommands.py:1172 -+#: ../yumcommands.py:1233 + #: ../yumcommands.py:1233 msgid "Group-Available:" - msgstr "Grupos disponíveis:" +-msgstr "Группа доступных:" ++msgstr "Доступны коллекцией:" --#: ../yumcommands.py:1211 -+#: ../yumcommands.py:1272 + #: ../yumcommands.py:1272 msgid "Display, or use, the transaction history" - msgstr "Exibir ou usar o histórico de transações" +-msgstr "Отображать или использовать историю транзакций" ++msgstr "Отобразить (или использовать) журнал операций" --#: ../yumcommands.py:1239 -+#: ../yumcommands.py:1300 + #: ../yumcommands.py:1300 #, python-format msgid "Invalid history sub-command, use: %s." - msgstr "Subcomando de histórico inválido, use: %s." +-msgstr "Неверная субкоманда истории, используйте:%s." ++msgstr "Неверная подкоманда журнала, используйте: %s." --#: ../yummain.py:128 --msgid "Running" --msgstr "Executando" -- --#: ../yummain.py:129 --msgid "Sleeping" --msgstr "Dormindo" -- --#: ../yummain.py:130 --msgid "Uninteruptable" --msgstr "Ininterrompível" -- --#: ../yummain.py:131 --msgid "Zombie" --msgstr "Zumbi" -- --#: ../yummain.py:132 --msgid "Traced/Stopped" --msgstr "Rastreado/Parado" -- --#: ../yummain.py:137 --msgid " The other application is: PackageKit" --msgstr " O outro aplicativo é: PackageKit" -- --#: ../yummain.py:139 --#, python-format --msgid " The other application is: %s" --msgstr " O outro aplicativo é: %s" -- --#: ../yummain.py:142 --#, python-format --msgid " Memory : %5s RSS (%5sB VSZ)" --msgstr " Memória: %5s RSS (%5sB VSZ)" -- --#: ../yummain.py:146 --#, python-format --msgid " Started: %s - %s ago" --msgstr " Iniciado: %s - %s atrás" -- --#: ../yummain.py:148 --#, python-format --msgid " State : %s, pid: %d" --msgstr " Estado: %s, pid: %d" -+#: ../yumcommands.py:1345 -+msgid "Check for problems in the rpmdb" -+msgstr "Procurar por problemas no rpmdb" + #: ../yumcommands.py:1345 + msgid "Check for problems in the rpmdb" + msgstr "Проверка проблем в базе данных RPM" --#: ../yummain.py:173 --msgid "Another app is currently holding the yum lock; waiting for it to exit..." --msgstr "Outro aplicativo está retendo o bloqueio do yum; esperando por ele para sair..." -+#: ../yummain.py:102 -+msgid "" -+"Another app is currently holding the yum lock; waiting for it to exit..." -+msgstr "" -+"Outro aplicativo está retendo o bloqueio do yum; esperando por ele para " -+"sair..." + #: ../yummain.py:102 +-msgid "" +-"Another app is currently holding the yum lock; waiting for it to exit..." ++msgid "Another app is currently holding the yum lock; waiting for it to exit..." + msgstr "Еще одно приложение, в настоящее время блокирует Yum. Подождите..." --#: ../yummain.py:201 --#: ../yummain.py:240 -+#: ../yummain.py:130 ../yummain.py:169 +-#: ../yummain.py:130 ../yummain.py:169 ++#: ../yummain.py:130 ++#: ../yummain.py:169 #, python-format msgid "Error: %s" - msgstr "Error: %s" + msgstr "Ошибка: %s" --#: ../yummain.py:211 --#: ../yummain.py:253 -+#: ../yummain.py:140 ../yummain.py:182 +-#: ../yummain.py:140 ../yummain.py:182 ++#: ../yummain.py:140 ++#: ../yummain.py:182 #, python-format msgid "Unknown Error(s): Exit Code: %d:" - msgstr "Erro(s) desconhecido(s): código de saída: %d:" + msgstr "Неизвестная ошибка(ошибки): Код выхода:%d:" +@@ -1758,7 +1813,8 @@ msgstr "Разрешение зависимостей" + msgid " You could try using --skip-broken to work around the problem" + msgstr " Вы можете попробовать --skip-broken чтобы обойти проблему." - #. Depsolve stage --#: ../yummain.py:218 -+#: ../yummain.py:147 - msgid "Resolving Dependencies" - msgstr "Resolvendo dependências" +-#: ../yummain.py:175 ../yummain.py:208 ++#: ../yummain.py:175 ++#: ../yummain.py:208 + msgid " You could try running: rpm -Va --nofiles --nodigest" + msgstr " Вы можете попробовать запустить: rpm -Va --nofiles --nodigest" --#: ../yummain.py:242 -+#: ../yummain.py:173 - msgid " You could try using --skip-broken to work around the problem" --msgstr " Você pode tentar usar o parâmetro --skip-broken para contornar o problema" -- --#: ../yummain.py:243 --msgid "" --" You could try running: package-cleanup --problems\n" --" package-cleanup --dupes\n" --" rpm -Va --nofiles --nodigest" - msgstr "" --" Você pode tentar executar: package-cleanup --problems\n" --" package-cleanup --dupes\n" --" rpm -Va --nofiles --nodigest" -+" Você pode tentar usar o parâmetro --skip-broken para contornar o problema" -+ -+#: ../yummain.py:175 ../yummain.py:208 -+msgid " You could try running: rpm -Va --nofiles --nodigest" -+msgstr " Você pode tentar executar: rpm -Va --nofiles --nodigest" - --#: ../yummain.py:259 -+#: ../yummain.py:188 - msgid "" - "\n" - "Dependencies Resolved" -@@ -1684,7 +1777,7 @@ msgstr "" - "\n" - "Dependências resolvidas" +@@ -1782,11 +1838,11 @@ msgstr "" --#: ../yummain.py:326 -+#: ../yummain.py:265 - msgid "" - "\n" - "\n" -@@ -1700,7 +1793,8 @@ msgstr "doTsSetup() será removida em uma futura versão do Yum.\n" + #: ../yum/depsolve.py:82 + msgid "doTsSetup() will go away in a future version of Yum.\n" +-msgstr "doTsSetup() будет устранён в следующей версии Yum\n" ++msgstr "doTsSetup() будет устранен в следующей версии Yum\n" #: ../yum/depsolve.py:97 msgid "Setting up TransactionSets before config class is up" --msgstr "Configurando TransactionSets antes da ativação da classe de configuração" -+msgstr "" -+"Configurando TransactionSets antes da ativação da classe de configuração" +-msgstr "Настройка набора транзакций до включения класса конфигурации" ++msgstr "Составление списка действий до включения класса конфигурации" #: ../yum/depsolve.py:148 #, python-format -@@ -1722,173 +1816,165 @@ msgstr "Correspondência potencial para o %s a partir de %s" - msgid "Matched %s to require for %s" - msgstr "%s encontrado para solicitar o %s" - --#: ../yum/depsolve.py:224 -+#: ../yum/depsolve.py:225 - #, python-format - msgid "Member: %s" - msgstr "Membro: %s" - --#: ../yum/depsolve.py:238 --#: ../yum/depsolve.py:749 -+#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 +@@ -1801,22 +1857,23 @@ msgstr "Поиск набора пакетов для зависимости: %s + #: ../yum/depsolve.py:175 #, python-format - msgid "%s converted to install" - msgstr "%s convertido para instalar" + msgid "Potential match for %s from %s" +-msgstr "Потенциальное совпадение для %s из %s" ++msgstr "Возможное совпадение для %s из %s" --#: ../yum/depsolve.py:245 -+#: ../yum/depsolve.py:246 + #: ../yum/depsolve.py:183 #, python-format - msgid "Adding Package %s in mode %s" - msgstr "Adicionando pacote %s no modo %s" + msgid "Matched %s to require for %s" +-msgstr "%s подходит в качестве требования для %s" ++msgstr "%s подходит как требуемый для %s" --#: ../yum/depsolve.py:255 -+#: ../yum/depsolve.py:256 + #: ../yum/depsolve.py:225 #, python-format - msgid "Removing Package %s" - msgstr "Removendo pacote %s" + msgid "Member: %s" + msgstr "Член: %s" --#: ../yum/depsolve.py:277 -+#: ../yum/depsolve.py:278 +-#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 ++#: ../yum/depsolve.py:239 ++#: ../yum/depsolve.py:754 #, python-format - msgid "%s requires: %s" - msgstr "%s requer: %s" - --#: ../yum/depsolve.py:335 -+#: ../yum/depsolve.py:319 -+#, python-format -+msgid "%s requires %s" -+msgstr "%s requer %s" -+ -+#: ../yum/depsolve.py:346 - msgid "Needed Require has already been looked up, cheating" - msgstr "O requerimento necessário já foi localizado, enganando" + msgid "%s converted to install" +-msgstr "%s сконвертировано для установки" ++msgstr "%s преобразован для установки" --#: ../yum/depsolve.py:345 -+#: ../yum/depsolve.py:356 + #: ../yum/depsolve.py:246 #, python-format - msgid "Needed Require is not a package name. Looking up: %s" - msgstr "O requerimento necessário não é o nome de um pacote. Localizando: %s" - --#: ../yum/depsolve.py:352 -+#: ../yum/depsolve.py:363 +@@ -1850,7 +1907,7 @@ msgstr "Требуемая зависимость не является имен + #: ../yum/depsolve.py:363 #, python-format msgid "Potential Provider: %s" - msgstr "Fornecedor em potencial: %s" - --#: ../yum/depsolve.py:375 -+#: ../yum/depsolve.py:386 - #, python-format - msgid "Mode is %s for provider of %s: %s" - msgstr "O modo é %s para o fornecedor do %s: %s" - --#: ../yum/depsolve.py:379 -+#: ../yum/depsolve.py:390 - #, python-format - msgid "Mode for pkg providing %s: %s" - msgstr "Modo para o pacote que fornece o %s: %s" +-msgstr "Потенциальный поставщик:%s" ++msgstr "Возможный поставщик:%s" --#: ../yum/depsolve.py:383 -+#: ../yum/depsolve.py:394 + #: ../yum/depsolve.py:386 #, python-format - msgid "TSINFO: %s package requiring %s marked as erase" - msgstr "TSINFO: o pacote %s que requer o %s foi marcado para remoção" - --#: ../yum/depsolve.py:396 -+#: ../yum/depsolve.py:407 +@@ -1870,8 +1927,7 @@ msgstr "TSINFO: %s пакет необходимый для %s был помеч + #: ../yum/depsolve.py:407 #, python-format msgid "TSINFO: Obsoleting %s with %s to resolve dep." - msgstr "TSINFO: Tornando %s obsoleto com o %s para resolver a dependência." +-msgstr "" +-"TSINFO: Замена устаревшего %s пакета пакетом %s чтобы разрешить зависимости." ++msgstr "TSINFO: Замена устаревшего %s пакета пакетом %s чтобы разрешить зависимости." --#: ../yum/depsolve.py:399 -+#: ../yum/depsolve.py:410 + #: ../yum/depsolve.py:410 #, python-format - msgid "TSINFO: Updating %s to resolve dep." - msgstr "TSINFO: Atualizando %s para resolver a dependência." - --#: ../yum/depsolve.py:407 -+#: ../yum/depsolve.py:418 +@@ -1881,7 +1937,7 @@ msgstr "TSINFO: Обновление %s для разрешения зависи + #: ../yum/depsolve.py:418 #, python-format msgid "Cannot find an update path for dep for: %s" --msgstr "Não foi possível encontrar um caminho de atualização para a dep. para: %s" -- --#: ../yum/depsolve.py:417 --#, python-format --msgid "Unresolvable requirement %s for %s" --msgstr "Requerimento %s insolúvel para o %s" -+msgstr "" -+"Não foi possível encontrar um caminho de atualização para a dep. para: %s" - --#: ../yum/depsolve.py:440 -+#: ../yum/depsolve.py:449 - #, python-format - msgid "Quick matched %s to require for %s" - msgstr "%s localizado rapidamente a ser requerido por %s" +-msgstr "Не удаётся найти путь обновления зависимости для: %s" ++msgstr "Не удается найти путь обновления зависимости для: %s" - #. is it already installed? --#: ../yum/depsolve.py:482 -+#: ../yum/depsolve.py:491 + #: ../yum/depsolve.py:449 #, python-format - msgid "%s is in providing packages but it is already installed, removing." - msgstr "%s está nos pacotes fornecedores mas já está instalado, removendo." - --#: ../yum/depsolve.py:498 -+#: ../yum/depsolve.py:507 +@@ -1897,19 +1953,17 @@ msgstr "Зависимый пакет %s уже установлен и буде + #: ../yum/depsolve.py:507 #, python-format msgid "Potential resolving package %s has newer instance in ts." - msgstr "O pacote de solução em potencial %s tem uma instância mais nova no ct." +-msgstr "" +-"Пакет %s новой версии, потенциально разрешающий, находится в составе " +-"транзакции." ++msgstr "Пакет %s в сценарии новее доступного" --#: ../yum/depsolve.py:509 -+#: ../yum/depsolve.py:518 + #: ../yum/depsolve.py:518 #, python-format msgid "Potential resolving package %s has newer instance installed." --msgstr "O pacote de solução em potencial %s tem uma instância mais nova instalada." -- --#: ../yum/depsolve.py:517 --#: ../yum/depsolve.py:563 --#, python-format --msgid "Missing Dependency: %s is needed by package %s" --msgstr "Dependência faltando: %s é requerido pelo pacote %s" -+msgstr "" -+"O pacote de solução em potencial %s tem uma instância mais nova instalada." +-msgstr "Пакет %s ,потенциально разрешающий, установлен новой версии." ++msgstr "Более новый пакет %s уже установлен в систему" --#: ../yum/depsolve.py:530 -+#: ../yum/depsolve.py:536 + #: ../yum/depsolve.py:536 #, python-format msgid "%s already in ts, skipping this one" - msgstr "%s já está no ct, pulando esse" - --#: ../yum/depsolve.py:573 -+#: ../yum/depsolve.py:578 - #, python-format - msgid "TSINFO: Marking %s as update for %s" - msgstr "TSINFO: Marcando %s como uma atualização para o %s" +-msgstr "%s уже находится в наборе транзакций, пропуск" ++msgstr "%s уже в списке к действию, пропускаем его" --#: ../yum/depsolve.py:581 -+#: ../yum/depsolve.py:586 + #: ../yum/depsolve.py:578 #, python-format +@@ -1921,11 +1975,13 @@ msgstr "TSINFO: %s отмечен как обновление для %s" msgid "TSINFO: Marking %s as install for %s" - msgstr "TSINFO: Marcando %s como uma instalação para o %s" + msgstr "TSINFO: Отмечен %s чтобы установить %s" --#: ../yum/depsolve.py:685 --#: ../yum/depsolve.py:767 -+#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 +-#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 ++#: ../yum/depsolve.py:690 ++#: ../yum/depsolve.py:781 msgid "Success - empty transaction" - msgstr "Sucesso - transação vazia" +-msgstr "Успех - пустая транзакция" ++msgstr "Успешно — холостое задание" --#: ../yum/depsolve.py:724 --#: ../yum/depsolve.py:739 -+#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 +-#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 ++#: ../yum/depsolve.py:729 ++#: ../yum/depsolve.py:744 msgid "Restarting Loop" - msgstr "Reiniciando o loop" - --#: ../yum/depsolve.py:755 -+#: ../yum/depsolve.py:760 - msgid "Dependency Process ending" - msgstr "Término do processo de dependências" + msgstr "Перезапуск петли" --#: ../yum/depsolve.py:761 -+#: ../yum/depsolve.py:774 - #, python-format - msgid "%s from %s has depsolving problems" - msgstr "%s a partir de %s tem problemas de resolução de dependências" +@@ -1940,7 +1996,7 @@ msgstr "%s из %s имеет проблемы с разрешением зав --#: ../yum/depsolve.py:768 -+#: ../yum/depsolve.py:782 + #: ../yum/depsolve.py:782 msgid "Success - deps resolved" - msgstr "Sucesso - dependências resolvidas" - --#: ../yum/depsolve.py:782 -+#: ../yum/depsolve.py:796 - #, python-format - msgid "Checking deps for %s" - msgstr "Verificando dependências para %s" - --#: ../yum/depsolve.py:865 -+#: ../yum/depsolve.py:874 - #, python-format - msgid "looking for %s as a requirement of %s" - msgstr "procurando por %s como um requerimento do %s" +-msgstr "Успешно - зависимости разрешены" ++msgstr "Успешно — зависимости разрешены" --#: ../yum/depsolve.py:1007 -+#: ../yum/depsolve.py:1090 + #: ../yum/depsolve.py:796 #, python-format +@@ -1957,7 +2013,8 @@ msgstr "поиск %s требуется для %s" msgid "Running compare_providers() for %s" - msgstr "Executando compare_providers() para %s" + msgstr "Запуск compare_providers() для %s" --#: ../yum/depsolve.py:1041 --#: ../yum/depsolve.py:1047 -+#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 +-#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 ++#: ../yum/depsolve.py:1117 ++#: ../yum/depsolve.py:1123 #, python-format msgid "better arch in po %s" - msgstr "melhor arquitetura no po %s" - --#: ../yum/depsolve.py:1142 -+#: ../yum/depsolve.py:1218 + msgstr "Лучший архив в %s" +@@ -1965,7 +2022,7 @@ msgstr "Лучший архив в %s" + #: ../yum/depsolve.py:1218 #, python-format msgid "%s obsoletes %s" - msgstr "%s torna %s obsoleto" - --#: ../yum/depsolve.py:1154 -+#: ../yum/depsolve.py:1230 - #, python-format - msgid "" - "archdist compared %s to %s on %s\n" -@@ -1897,117 +1983,141 @@ msgstr "" - "archdist comparou %s com %s em %s\n" - " Vencedor: %s" - --#: ../yum/depsolve.py:1161 -+#: ../yum/depsolve.py:1237 - #, python-format - msgid "common sourcerpm %s and %s" - msgstr "Sourcerpm comum %s e %s" - --#: ../yum/depsolve.py:1167 -+#: ../yum/depsolve.py:1241 -+#, python-format -+msgid "base package %s is installed for %s" -+msgstr "o pacote base %s está instalado para o %s" -+ -+#: ../yum/depsolve.py:1247 - #, python-format - msgid "common prefix of %s between %s and %s" - msgstr "prefixo comum de %s entre %s e %s" +-msgstr "%s заменяет %s" ++msgstr "%s исключает %s" --#: ../yum/depsolve.py:1175 -+#: ../yum/depsolve.py:1256 + #: ../yum/depsolve.py:1230 #, python-format - msgid "Best Order: %s" - msgstr "Melhor ordem: %s" +@@ -1998,7 +2055,7 @@ msgstr "Лучший выбор: %s" --#: ../yum/__init__.py:187 -+#: ../yum/__init__.py:192 + #: ../yum/__init__.py:192 msgid "doConfigSetup() will go away in a future version of Yum.\n" - msgstr "doConfigSetup() será removida em uma futura versão do Yum.\n" +-msgstr "doConfigSetup() будет устранён в следующей версии Yum.\n" ++msgstr "doConfigSetup() будет устранен в следующей версии Yum.\n" --#: ../yum/__init__.py:412 -+#: ../yum/__init__.py:424 + #: ../yum/__init__.py:424 #, python-format - msgid "Repository %r is missing name in configuration, using id" - msgstr "O repositório %r não tem nome na configuração, usando o id" +@@ -2007,11 +2064,11 @@ msgstr "Хранилище %r не имеет названия в конфиг --#: ../yum/__init__.py:450 -+#: ../yum/__init__.py:462 + #: ../yum/__init__.py:462 msgid "plugins already initialised" - msgstr "plugins já inicializados" +-msgstr "плагин уже инициализирован" ++msgstr "модули уже загружены" --#: ../yum/__init__.py:457 -+#: ../yum/__init__.py:469 + #: ../yum/__init__.py:469 msgid "doRpmDBSetup() will go away in a future version of Yum.\n" - msgstr "doRpmDBSetup() será removida em uma futura versão do Yum.\n" +-msgstr "doRpmDBSetup() будет устранён в следующей версии Yum.\n" ++msgstr "doRpmDBSetup() будет устранен в следующей версии Yum.\n" --#: ../yum/__init__.py:468 -+#: ../yum/__init__.py:480 + #: ../yum/__init__.py:480 msgid "Reading Local RPMDB" - msgstr "Lendo RPMDB local" +@@ -2019,11 +2076,11 @@ msgstr "Чтение локальной базы данных RPM" --#: ../yum/__init__.py:489 -+#: ../yum/__init__.py:504 + #: ../yum/__init__.py:504 msgid "doRepoSetup() will go away in a future version of Yum.\n" - msgstr "doRepoSetup() será removida em uma futura versão do Yum.\n" +-msgstr "doRepoSetup() будет устранён в следующей версии Yum.\n" ++msgstr "doRepoSetup() будет устранен в следующей версии Yum.\n" --#: ../yum/__init__.py:509 -+#: ../yum/__init__.py:524 + #: ../yum/__init__.py:524 msgid "doSackSetup() will go away in a future version of Yum.\n" - msgstr "doSackSetup() será removida em uma futura versão do Yum.\n" +-msgstr "doSackSetup() будет устранён в следующей версии Yum.\n" ++msgstr "doSackSetup() будет устранен в следующей версии Yum.\n" --#: ../yum/__init__.py:539 -+#: ../yum/__init__.py:554 + #: ../yum/__init__.py:554 msgid "Setting up Package Sacks" - msgstr "Configurando sacos de pacotes" - --#: ../yum/__init__.py:584 -+#: ../yum/__init__.py:599 - #, python-format - msgid "repo object for repo %s lacks a _resetSack method\n" - msgstr "o objeto de repositório para o %s necessita de um método _resetSack\n" - --#: ../yum/__init__.py:585 -+#: ../yum/__init__.py:600 - msgid "therefore this repo cannot be reset.\n" - msgstr "conseqüentemente este repo não pode ser restaurado.\n" +@@ -2040,7 +2097,7 @@ msgstr "поэтому этот репозиторий не может быть --#: ../yum/__init__.py:590 -+#: ../yum/__init__.py:605 + #: ../yum/__init__.py:605 msgid "doUpdateSetup() will go away in a future version of Yum.\n" - msgstr "doUpdateSetup() será removida em uma futura versão do Yum.\n" +-msgstr "doUpdateSetup() будет устранён в следующей версии Yum.\n" ++msgstr "doUpdateSetup() будет устранен в следующей версии Yum.\n" --#: ../yum/__init__.py:602 -+#: ../yum/__init__.py:617 + #: ../yum/__init__.py:617 msgid "Building updates object" - msgstr "Construindo objeto de atualizações" +@@ -2048,25 +2105,25 @@ msgstr "Построение объекта обновлений" --#: ../yum/__init__.py:637 -+#: ../yum/__init__.py:652 + #: ../yum/__init__.py:652 msgid "doGroupSetup() will go away in a future version of Yum.\n" - msgstr "doGroupSetup() será removida em uma futura versão do Yum.\n" +-msgstr "doGroupSetup() будет устранён в следующей версии Yum.\n" ++msgstr "doGroupSetup() будет устранен в следующей версии Yum.\n" --#: ../yum/__init__.py:662 -+#: ../yum/__init__.py:677 + #: ../yum/__init__.py:677 msgid "Getting group metadata" - msgstr "Obtendo metadados do grupo" +-msgstr "Получение метаданных групп" ++msgstr "Получение метаданных коллекции" --#: ../yum/__init__.py:688 -+#: ../yum/__init__.py:703 + #: ../yum/__init__.py:703 #, python-format msgid "Adding group file from repository: %s" - msgstr "Adicionando arquivo de grupo a partir do repositório: %s" +-msgstr "Добавление файла групп из репозитория: %s" ++msgstr "Добавление файла коллекций из репозитория: %s" --#: ../yum/__init__.py:697 -+#: ../yum/__init__.py:712 + #: ../yum/__init__.py:712 #, python-format msgid "Failed to add groups file for repository: %s - %s" - msgstr "Falha ao adicionar o arquivo de grupos para o repositório: %s - %s" +-msgstr "Ошибка добавления файла групп для репозитория: %s - %s" ++msgstr "Ошибка добавления файла коллекций для репозитория: %s — %s" --#: ../yum/__init__.py:703 -+#: ../yum/__init__.py:718 + #: ../yum/__init__.py:718 msgid "No Groups Available in any repository" - msgstr "Nenhum grupo disponível em nenhum repositório" +-msgstr "Нет доступных групп в любом репозитории" ++msgstr "Ни в одном репозитории нет доступных коллекций" --#: ../yum/__init__.py:763 -+#: ../yum/__init__.py:730 -+msgid "Getting pkgtags metadata" -+msgstr "Obtendo metadados do pkgtags" -+ -+#: ../yum/__init__.py:740 -+#, python-format -+msgid "Adding tags from repository: %s" -+msgstr "Adicionando tags do repositório: %s" -+ -+#: ../yum/__init__.py:749 -+#, python-format -+msgid "Failed to add Pkg Tags for repository: %s - %s" -+msgstr "Falha ao adicionar as Pkg Tags para o repositório: %s - %s" -+ -+#: ../yum/__init__.py:827 - msgid "Importing additional filelist information" - msgstr "Importando informações adicionais da lista de arquivos" + #: ../yum/__init__.py:730 + msgid "Getting pkgtags metadata" +@@ -2075,12 +2132,12 @@ msgstr "Загрузка метаданных меток пакета " + #: ../yum/__init__.py:740 + #, python-format + msgid "Adding tags from repository: %s" +-msgstr "Добавление меток с репозитория: %s" ++msgstr "Добавление меток из репозитория: %s" --#: ../yum/__init__.py:777 -+#: ../yum/__init__.py:841 + #: ../yum/__init__.py:749 #, python-format - msgid "The program %s%s%s is found in the yum-utils package." - msgstr "O programa %s%s%s está localizado no pacote yum-utils." + msgid "Failed to add Pkg Tags for repository: %s - %s" +-msgstr "Ошибка добавление меток пакета для репозитория: %s - %s" ++msgstr "Ошибка добавление меток пакета для репозитория: %s — %s" --#: ../yum/__init__.py:785 --msgid "There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them." --msgstr "Há transações não finalizadas restantes. Você pode considerar executar o yum-complete-transaction primeiro para finalizá-las." -+#: ../yum/__init__.py:849 -+msgid "" -+"There are unfinished transactions remaining. You might consider running yum-" -+"complete-transaction first to finish them." -+msgstr "" -+"Há transações não finalizadas restantes. Você pode considerar executar o yum-" -+"complete-transaction primeiro para finalizá-las." + #: ../yum/__init__.py:827 + msgid "Importing additional filelist information" +@@ -2092,23 +2149,19 @@ msgid "The program %s%s%s is found in the yum-utils package." + msgstr "Программа %s%s%s найдена в пакете yum-utils." --#: ../yum/__init__.py:853 -+#. Kind of hacky -+#: ../yum/__init__.py:922 + #: ../yum/__init__.py:849 +-msgid "" +-"There are unfinished transactions remaining. You might consider running yum-" +-"complete-transaction first to finish them." +-msgstr "" +-"Присутствуют незавершённые транзакции. Вы можете запустить команду yum-" +-"complete-transaction для их завершения." ++msgid "There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them." ++msgstr "Остались незавершенные действия. Возможно, сначала следует выполнить yum-complete-transaction для их завершения." + + #. Kind of hacky + #: ../yum/__init__.py:922 #, python-format msgid "Skip-broken round %i" - msgstr "Rodada de ignoração de dependências quebradas %i" +-msgstr "Раунд %i пропуская поврежденные" ++msgstr "Пропуск %i разрушенной связи" --#: ../yum/__init__.py:906 -+#: ../yum/__init__.py:975 + #: ../yum/__init__.py:975 #, python-format msgid "Skip-broken took %i rounds " - msgstr "A ignoração de dependências quebradas levou %i rodadas" +-msgstr "Раунд пропуская повреждённые прошло%i " ++msgstr "Разрушено %i связей" --#: ../yum/__init__.py:907 -+#: ../yum/__init__.py:976 + #: ../yum/__init__.py:976 msgid "" - "\n" - "Packages skipped because of dependency problems:" -@@ -2015,76 +2125,93 @@ msgstr "" - "\n" - "Pacotes ignorados devido a problemas de dependências:" +@@ -2136,16 +2189,13 @@ msgid "installed conflict" + msgstr "установлен в конфликте" --#: ../yum/__init__.py:911 -+#: ../yum/__init__.py:980 + #: ../yum/__init__.py:1180 +-msgid "" +-"Warning: scriptlet or other non-fatal errors occurred during transaction." +-msgstr "" +-"Внимание: во время транзакции была вызвана ошибка сценария или произошла\n" +-" иная не критичная ошибка" ++msgid "Warning: scriptlet or other non-fatal errors occurred during transaction." ++msgstr "Внимание: в ходе операции возникли некоторые некритические ошибки." + + #: ../yum/__init__.py:1198 #, python-format - msgid " %s from %s" - msgstr " %s a partir de %s" + msgid "Failed to remove transaction file %s" +-msgstr "Невозможно удалить файл транзакции %s" ++msgstr "Невозможно удалить маркер %s" --#: ../yum/__init__.py:1083 --msgid "Warning: scriptlet or other non-fatal errors occurred during transaction." --msgstr "Aviso: scriptlet ou outros erros não fatais ocorreram durante a transação." -+#: ../yum/__init__.py:1121 -+msgid "Warning: RPMDB altered outside of yum." -+msgstr "Aviso: o RPMDB foi alterado de fora do yum." + #. maybe a file log here, too + #. but raising an exception is not going to do any good +@@ -2159,7 +2209,7 @@ msgstr "%s должен был быть установлен, но не был + #: ../yum/__init__.py:1266 + #, python-format + msgid "%s was supposed to be removed but is not!" +-msgstr "%s должен был быть удалён, но не был удалён!" ++msgstr "%s должен был быть удален, но не был удален!" --#: ../yum/__init__.py:1101 -+#: ../yum/__init__.py:1126 -+msgid "missing requires" -+msgstr "faltando exigências" -+ -+#: ../yum/__init__.py:1127 -+msgid "installed conflict" -+msgstr "conflito instalado" -+ -+#: ../yum/__init__.py:1180 -+msgid "" -+"Warning: scriptlet or other non-fatal errors occurred during transaction." -+msgstr "" -+"Aviso: scriptlet ou outros erros não fatais ocorreram durante a transação." -+ -+#: ../yum/__init__.py:1198 - #, python-format - msgid "Failed to remove transaction file %s" - msgstr "Falha ao remover o arquivo de transação %s" + #. Whoa. What the heck happened? + #: ../yum/__init__.py:1386 +@@ -2180,11 +2230,8 @@ msgid "Could not create lock at %s: %s " + msgstr "Вы не можете создать блокировку %s: %s" - #. maybe a file log here, too - #. but raising an exception is not going to do any good --#: ../yum/__init__.py:1130 -+#: ../yum/__init__.py:1227 - #, python-format - msgid "%s was supposed to be installed but is not!" - msgstr "%s deveria ter sido instalado mas não foi!" + #: ../yum/__init__.py:1470 +-msgid "" +-"Package does not match intended download. Suggestion: run yum clean metadata" +-msgstr "" +-"Пакет не соответствует предназначенному для загрузки. Предложение: " +-"Пожалуйста, запустите yum clean metadata" ++msgid "Package does not match intended download. Suggestion: run yum clean metadata" ++msgstr "Пакет не соответствует предназначенному для загрузки. Предложение: Пожалуйста, запустите yum clean metadata" - #. maybe a file log here, too - #. but raising an exception is not going to do any good --#: ../yum/__init__.py:1169 -+#: ../yum/__init__.py:1266 - #, python-format - msgid "%s was supposed to be removed but is not!" - msgstr "%s deveria ter sido removido mas não foi!" + #: ../yum/__init__.py:1486 + msgid "Could not perform checksum" +@@ -2199,7 +2246,8 @@ msgstr "Пакет не совпадает с контрольной суммо + msgid "package fails checksum but caching is enabled for %s" + msgstr "проверка контрольной суммы неудачна, но кэширование включено для %s" - #. Whoa. What the heck happened? --#: ../yum/__init__.py:1289 -+#: ../yum/__init__.py:1386 +-#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 ++#: ../yum/__init__.py:1534 ++#: ../yum/__init__.py:1563 #, python-format - msgid "Unable to check if PID %s is active" - msgstr "Não foi possível verificar se o PID %s está ativo" + msgid "using local copy of %s" + msgstr "использование локальной копии %s" +@@ -2221,11 +2269,8 @@ msgstr "Заголовок не готов." - #. Another copy seems to be running. --#: ../yum/__init__.py:1293 -+#: ../yum/__init__.py:1390 + #: ../yum/__init__.py:1661 #, python-format - msgid "Existing lock %s: another copy is running as pid %s." - msgstr "Bloqueio existente em %s: outra cópia está em execução com o pid %s." +-msgid "" +-"Header not in local cache and caching-only mode enabled. Cannot download %s" +-msgstr "" +-"Заголовок не в локальном кэше. Включён режим только из кэша. Невозможно " +-"загрузить %s" ++msgid "Header not in local cache and caching-only mode enabled. Cannot download %s" ++msgstr "Заголовок не в локальном кэше. Включен режим только из кэша. Невозможно загрузить %s" - #. Whoa. What the heck happened? --#: ../yum/__init__.py:1328 -+#: ../yum/__init__.py:1425 + #: ../yum/__init__.py:1716 #, python-format - msgid "Could not create lock at %s: %s " - msgstr "Não foi possível criar um bloqueio em %s: %s" +@@ -2283,12 +2328,8 @@ msgid "Nothing matches %s.%s %s:%s-%s from update" + msgstr "Совпадений не найдено %s.%s %s:%s-%s из обновлений" --#: ../yum/__init__.py:1373 --msgid "Package does not match intended download" --msgstr "O pacote não corresponde ao download pretendido" -+#: ../yum/__init__.py:1470 -+msgid "" -+"Package does not match intended download. Suggestion: run yum clean metadata" -+msgstr "" -+"O pacote não corresponde ao download pretendido. Sugestão: execute yum clean " -+"metadata" + #: ../yum/__init__.py:2180 +-msgid "" +-"searchPackages() will go away in a future version of " +-"Yum. Use searchGenerator() instead. \n" +-msgstr "" +-"searchPackages() будет убрано в следующей версии Yum. Используйте " +-"searchGenerator() взамен. \n" ++msgid "searchPackages() will go away in a future version of Yum. Use searchGenerator() instead. \n" ++msgstr "searchPackages() будет убрано в следующей версии Yum. Используйте searchGenerator() взамен. \n" --#: ../yum/__init__.py:1388 -+#: ../yum/__init__.py:1486 - msgid "Could not perform checksum" - msgstr "Não foi possível realizar a soma de verificação" + #: ../yum/__init__.py:2219 + #, python-format +@@ -2315,24 +2356,29 @@ msgstr "Результат совпадений: %s" --#: ../yum/__init__.py:1391 -+#: ../yum/__init__.py:1489 - msgid "Package does not match checksum" - msgstr "O pacote não corresponde à soma de verificação" + #: ../yum/__init__.py:2324 + msgid "No group data available for configured repositories" +-msgstr "Нет доступных данных групп для настроеных репозиториев" +- +-#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 +-#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 ++msgstr "Для настроеных репозиториев данных коллекций нет" ++ ++#: ../yum/__init__.py:2355 ++#: ../yum/__init__.py:2374 ++#: ../yum/__init__.py:2405 ++#: ../yum/__init__.py:2411 ++#: ../yum/__init__.py:2493 ++#: ../yum/__init__.py:2497 + #: ../yum/__init__.py:2814 + #, python-format + msgid "No Group named %s exists" +-msgstr "Группы с именем %s не существует" ++msgstr "Коллекции с названием %s не существует" --#: ../yum/__init__.py:1433 -+#: ../yum/__init__.py:1531 +-#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 ++#: ../yum/__init__.py:2386 ++#: ../yum/__init__.py:2513 #, python-format - msgid "package fails checksum but caching is enabled for %s" --msgstr "o pacote falhou na soma de verificação mas o cache está habilitado para o %s" -+msgstr "" -+"o pacote falhou na soma de verificação mas o cache está habilitado para o %s" + msgid "package %s was not marked in group %s" +-msgstr "пакет %s не отмечен в группе %s" ++msgstr "пакет %s не отмечен в коллекции %s" --#: ../yum/__init__.py:1436 --#: ../yum/__init__.py:1465 -+#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 + #: ../yum/__init__.py:2433 #, python-format - msgid "using local copy of %s" - msgstr "usando cópia local do %s" + msgid "Adding package %s from group %s" +-msgstr "Добавление пакета %s из группы %s" ++msgstr "Добавление пакета %s из коллекции %s" --#: ../yum/__init__.py:1477 -+#: ../yum/__init__.py:1575 + #: ../yum/__init__.py:2437 #, python-format - msgid "" - "Insufficient space in download directory %s\n" -@@ -2095,419 +2222,423 @@ msgstr "" - " * livre %s\n" - " * necessário %s" +@@ -2349,11 +2395,13 @@ msgstr "Кортеж пакетов %s не найден в наборе пак + msgid "Package tuple %s could not be found in rpmdb" + msgstr "Кортеж пакетов %s не найден в базе RPM" --#: ../yum/__init__.py:1526 -+#: ../yum/__init__.py:1624 - msgid "Header is not complete." - msgstr "O cabeçalho não está completo." +-#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 ++#: ../yum/__init__.py:2614 ++#: ../yum/__init__.py:2664 + msgid "Invalid version flag" + msgstr "Hеверная версия флага %s" --#: ../yum/__init__.py:1563 -+#: ../yum/__init__.py:1661 +-#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 ++#: ../yum/__init__.py:2634 ++#: ../yum/__init__.py:2639 #, python-format --msgid "Header not in local cache and caching-only mode enabled. Cannot download %s" --msgstr "O cabeçalho não está no cache local e o modo de somente cache está habilitado. Não foi possível baixar o %s." -+msgid "" -+"Header not in local cache and caching-only mode enabled. Cannot download %s" -+msgstr "" -+"O cabeçalho não está no cache local e o modo de somente cache está " -+"habilitado. Não foi possível baixar o %s." + msgid "No Package found for %s" + msgstr "Пакет %s не найден" +@@ -2366,12 +2414,15 @@ msgstr "Объект пакета не являлся экземпляром о + msgid "Nothing specified to install" + msgstr "Ничего не отмечено для установки" --#: ../yum/__init__.py:1618 -+#: ../yum/__init__.py:1716 +-#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 ++#: ../yum/__init__.py:2875 ++#: ../yum/__init__.py:3652 #, python-format - msgid "Public key for %s is not installed" - msgstr "A chave pública para o %s não está instalada" + msgid "Checking for virtual provide or file-provide for %s" + msgstr "Проверка виртуального провайдера или файлового провайдера для %s" --#: ../yum/__init__.py:1622 -+#: ../yum/__init__.py:1720 +-#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 ++#: ../yum/__init__.py:2881 ++#: ../yum/__init__.py:3197 ++#: ../yum/__init__.py:3365 + #: ../yum/__init__.py:3658 #, python-format - msgid "Problem opening package %s" - msgstr "Problema ao abrir o pacote %s" - --#: ../yum/__init__.py:1630 -+#: ../yum/__init__.py:1728 + msgid "No Match for argument: %s" +@@ -2389,17 +2440,17 @@ msgstr "Нет доступных для установки пакетов" + #: ../yum/__init__.py:2972 #, python-format - msgid "Public key for %s is not trusted" - msgstr "A chave pública para o %s não é confiável" + msgid "Package: %s - already in transaction set" +-msgstr "Пакет: %s - уже включён в транзакцию" ++msgstr "Пакет: %s — уже в списке к действию" --#: ../yum/__init__.py:1634 -+#: ../yum/__init__.py:1732 + #: ../yum/__init__.py:2998 #, python-format - msgid "Package %s is not signed" - msgstr "O pacote %s não está assinado" + msgid "Package %s is obsoleted by %s which is already installed" +-msgstr "Пакет %s был заменён на %s и он уже установлен" ++msgstr "Пакет %s недействителен из-за установленного %s" --#: ../yum/__init__.py:1672 -+#: ../yum/__init__.py:1770 + #: ../yum/__init__.py:3001 #, python-format - msgid "Cannot remove %s" - msgstr "Não foi possível remover %s" + msgid "Package %s is obsoleted by %s, trying to install %s instead" +-msgstr "Пакет %s был заменён на %s, попытка установки %s взамен" ++msgstr "Пакет %s недействителен из-за %s, попытка установки %s взамен" --#: ../yum/__init__.py:1676 -+#: ../yum/__init__.py:1774 + #: ../yum/__init__.py:3009 #, python-format - msgid "%s removed" - msgstr "%s removido" +@@ -2416,13 +2467,16 @@ msgstr "Пакет %s уже установлен.Проверка для обн + msgid "Updating Everything" + msgstr "Полное обновление" --#: ../yum/__init__.py:1712 -+#: ../yum/__init__.py:1820 +-#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 ++#: ../yum/__init__.py:3147 ++#: ../yum/__init__.py:3262 ++#: ../yum/__init__.py:3289 + #: ../yum/__init__.py:3315 #, python-format - msgid "Cannot remove %s file %s" - msgstr "Não foi possível remover %s arquivo %s" + msgid "Not Updating Package that is already obsoleted: %s.%s %s:%s-%s" +-msgstr "Пакет не обновляется, уже заменён: %s.%s %s:%s-%s" ++msgstr "Устаревший и уже необновляемый пакет: %s.%s %s:%s-%s" --#: ../yum/__init__.py:1716 -+#: ../yum/__init__.py:1824 +-#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 ++#: ../yum/__init__.py:3182 ++#: ../yum/__init__.py:3362 #, python-format - msgid "%s file %s removed" - msgstr "%s arquivo %s removido" - --#: ../yum/__init__.py:1718 -+#: ../yum/__init__.py:1826 + msgid "%s" + msgstr "%s" +@@ -2430,17 +2484,18 @@ msgstr "%s" + #: ../yum/__init__.py:3253 #, python-format - msgid "%d %s files removed" - msgstr "%d %s arquivos removidos" + msgid "Package is already obsoleted: %s.%s %s:%s-%s" +-msgstr "Пакет был заменён:%s.%s %s:%s-%s" ++msgstr "Пакет уже недействителен:%s.%s %s:%s-%s" --#: ../yum/__init__.py:1787 -+#: ../yum/__init__.py:1895 + #: ../yum/__init__.py:3284 #, python-format - msgid "More than one identical match in sack for %s" - msgstr "Mais de uma correspondência idêntica no saco para %s" + msgid "Not Updating Package that is obsoleted: %s" +-msgstr "Пакет не обновляется, заменён: %s" ++msgstr "Устаревший необновляемый пакет: %s" --#: ../yum/__init__.py:1793 -+#: ../yum/__init__.py:1901 +-#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 ++#: ../yum/__init__.py:3293 ++#: ../yum/__init__.py:3319 #, python-format - msgid "Nothing matches %s.%s %s:%s-%s from update" - msgstr "Nada corresponde ao %s.%s %s:%s-%s a partir da atualização" + msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s" +-msgstr "Уже обновленный пакет не обновляется: %s.%s %s:%s-%s" ++msgstr "Необновленный пакет, который был обновлен ранее: %s.%s %s:%s-%s" --#: ../yum/__init__.py:2026 --msgid "searchPackages() will go away in a future version of Yum. Use searchGenerator() instead. \n" --msgstr "searchPackages() será removida em uma futura versão do Yum. Ao invés disso, use a searchGenerator().\n" -+#: ../yum/__init__.py:2180 -+msgid "" -+"searchPackages() will go away in a future version of " -+"Yum. Use searchGenerator() instead. \n" -+msgstr "" -+"searchPackages() será removida em uma futura versão do Yum. Ao invés disso, " -+"use a searchGenerator().\n" + #: ../yum/__init__.py:3378 + msgid "No package matched to remove" +@@ -2451,27 +2506,28 @@ msgstr "Нет пакетов для удаления" + msgid "Cannot open: %s. Skipping." + msgstr "Невозможно открыть: %s. Пропуск." --#: ../yum/__init__.py:2065 -+#: ../yum/__init__.py:2219 +-#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 ++#: ../yum/__init__.py:3415 ++#: ../yum/__init__.py:3514 ++#: ../yum/__init__.py:3598 #, python-format - msgid "Searching %d packages" - msgstr "Pesquisando por %d pacotes" + msgid "Examining %s: %s" + msgstr "Проверка %s: %s" --#: ../yum/__init__.py:2069 -+#: ../yum/__init__.py:2223 +-#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 ++#: ../yum/__init__.py:3423 ++#: ../yum/__init__.py:3517 ++#: ../yum/__init__.py:3601 #, python-format - msgid "searching package %s" - msgstr "pesquisando pelo pacote %s" - --#: ../yum/__init__.py:2081 -+#: ../yum/__init__.py:2235 - msgid "searching in file entries" - msgstr "pesquisando nas entradas do arquivo" - --#: ../yum/__init__.py:2088 -+#: ../yum/__init__.py:2242 - msgid "searching in provides entries" - msgstr "pesquisando nas entradas dos fornecimentos" + msgid "Cannot add package %s to transaction. Not a compatible architecture: %s" +-msgstr "" +-"Невозможно добавить пакет %s в транзакцию. Несовместимая архитектура: %s" ++msgstr "Невозможно добавить пакет %s в список действий. Несовместимая архитектура: %s" --#: ../yum/__init__.py:2121 -+#: ../yum/__init__.py:2275 + #: ../yum/__init__.py:3431 #, python-format - msgid "Provides-match: %s" - msgstr "Fornecimento combina com: %s" +-msgid "" +-"Package %s not installed, cannot update it. Run yum install to install it " +-"instead." +-msgstr "" +-"Пакет %s не установлен, невозможно обновить его. Запустите yum для установки " +-"заместо обновления." ++msgid "Package %s not installed, cannot update it. Run yum install to install it instead." ++msgstr "Пакет %s не установлен, невозможно обновить его. Запустите yum для установки заместо обновления." --#: ../yum/__init__.py:2170 -+#: ../yum/__init__.py:2324 - msgid "No group data available for configured repositories" - msgstr "Nenhum dado de grupos disponível para os repositório configurados" +-#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 ++#: ../yum/__init__.py:3460 ++#: ../yum/__init__.py:3522 ++#: ../yum/__init__.py:3606 + #, python-format + msgid "Excluding %s" + msgstr "Удаление %s" +@@ -2491,7 +2547,8 @@ msgstr "%s отмечен как обновление для %s" + msgid "%s: does not update installed package." + msgstr "%s: не обновляет установленный пакет" --#: ../yum/__init__.py:2201 --#: ../yum/__init__.py:2220 --#: ../yum/__init__.py:2251 --#: ../yum/__init__.py:2257 --#: ../yum/__init__.py:2336 --#: ../yum/__init__.py:2340 --#: ../yum/__init__.py:2655 -+#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 -+#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 -+#: ../yum/__init__.py:2814 +-#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 ++#: ../yum/__init__.py:3511 ++#: ../yum/__init__.py:3595 #, python-format - msgid "No Group named %s exists" - msgstr "Não existe nenhum grupo de nome %s" + msgid "Cannot open file: %s. Skipping." + msgstr "Невозможно открыть файл %s. Пропуск." +@@ -2500,7 +2557,8 @@ msgstr "Невозможно открыть файл %s. Пропуск." + msgid "Problem in reinstall: no package matched to remove" + msgstr "Проблема при переустановке: не найден пакет для удаления" --#: ../yum/__init__.py:2232 --#: ../yum/__init__.py:2353 -+#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 +-#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 ++#: ../yum/__init__.py:3554 ++#: ../yum/__init__.py:3686 #, python-format - msgid "package %s was not marked in group %s" - msgstr "o pacote %s não foi marcado no grupo %s" + msgid "Package %s is allowed multiple installs, skipping" + msgstr "Пакет %s может быть повторно установлен, пропуск" +@@ -2512,7 +2570,7 @@ msgstr "Проблема при переустановке: пакет %s не --#: ../yum/__init__.py:2279 -+#: ../yum/__init__.py:2433 + #: ../yum/__init__.py:3678 + msgid "No package(s) available to downgrade" +-msgstr "Нет доступных пакетов для перехода к предыдущей версии" ++msgstr "Пакеты для отката версии отсутствуют" + + #: ../yum/__init__.py:3731 #, python-format - msgid "Adding package %s from group %s" - msgstr "Adicionando o pacote %s do grupo %s" +@@ -2524,10 +2582,11 @@ msgstr "Пакеты недоступны: %s" + msgid "Only Upgrade available on package: %s" + msgstr "Только переход к следующей версии доступен для пакета: : %s" --#: ../yum/__init__.py:2283 -+#: ../yum/__init__.py:2437 +-#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 ++#: ../yum/__init__.py:3808 ++#: ../yum/__init__.py:3845 #, python-format - msgid "No package named %s available to be installed" - msgstr "Nenhum pacote de nome %s disponível para ser instalado" + msgid "Failed to downgrade: %s" +-msgstr "Ошибка возврата к предыдущей версии: %s" ++msgstr "Ошибка отката версии: %s" --#: ../yum/__init__.py:2380 -+#: ../yum/__init__.py:2539 + #: ../yum/__init__.py:3877 #, python-format - msgid "Package tuple %s could not be found in packagesack" - msgstr "A tupla %s do pacote não pôde ser encontrada no packagesack" +@@ -2554,7 +2613,8 @@ msgid "GPG key at %s (0x%s) is already installed" + msgstr "GPG ключ %s (0x%s) уже установлен" --#: ../yum/__init__.py:2399 -+#: ../yum/__init__.py:2558 + #. Try installing/updating GPG key +-#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 ++#: ../yum/__init__.py:3949 ++#: ../yum/__init__.py:4011 #, python-format - msgid "Package tuple %s could not be found in rpmdb" - msgstr "A tupla %s do pacote não pôde ser localizada no rpmdb" + msgid "Importing GPG key 0x%s \"%s\" from %s" + msgstr "Импорт GPG ключа 0x%s \"%s\" из %s" +@@ -2568,21 +2628,20 @@ msgstr "Не установлен ключ" + msgid "Key import failed (code %d)" + msgstr "Неудача импорта ключа (code %d)" --#: ../yum/__init__.py:2455 --#: ../yum/__init__.py:2505 -+#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 - msgid "Invalid version flag" - msgstr "Sinalizador de versão inválido" +-#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 ++#: ../yum/__init__.py:3973 ++#: ../yum/__init__.py:4032 + msgid "Key imported successfully" + msgstr "Импорт ключа успешно завершен" --#: ../yum/__init__.py:2475 --#: ../yum/__init__.py:2480 -+#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 +-#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 ++#: ../yum/__init__.py:3978 ++#: ../yum/__init__.py:4037 #, python-format - msgid "No Package found for %s" - msgstr "Nenhum pacote encontrado para %s" + msgid "" +-"The GPG keys listed for the \"%s\" repository are already installed but they " +-"are not correct for this package.\n" ++"The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" + "Check that the correct key URLs are configured for this repository." + msgstr "" +-"GPG ключи включены для репозитория \"%s\", но они не является правильными " +-"для данного пакета.\n" +-"Пожалуйста, проверьте правильно ли настроены URL ключи для данного " +-"репозитория." ++"GPG ключи включены для репозитория \"%s\", но они не является правильными для данного пакета.\n" ++"Пожалуйста, проверьте правильно ли настроены URL ключи для данного репозитория." --#: ../yum/__init__.py:2696 -+#: ../yum/__init__.py:2855 - msgid "Package Object was not a package object instance" - msgstr "O pacote de objeto não era uma instância de pacote de objeto" + #: ../yum/__init__.py:3987 + msgid "Import of key(s) didn't help, wrong key(s)?" +@@ -2600,11 +2659,11 @@ msgstr "Ключ для репозитория %s не установлен." --#: ../yum/__init__.py:2700 -+#: ../yum/__init__.py:2859 - msgid "Nothing specified to install" - msgstr "Nada especificado para instalar" + #: ../yum/__init__.py:4031 + msgid "Key import failed" +-msgstr "Импорт ключа не успешен" ++msgstr "Импорт ключа неудачен" --#: ../yum/__init__.py:2716 --#: ../yum/__init__.py:3489 -+#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 - #, python-format - msgid "Checking for virtual provide or file-provide for %s" - msgstr "Verificando por fornecimento virtual ou de arquivo para %s" + #: ../yum/__init__.py:4157 + msgid "Unable to find a suitable mirror." +-msgstr "Не удаётся найти подходящее зеркало" ++msgstr "Не удается найти подходящее зеркало" --#: ../yum/__init__.py:2722 --#: ../yum/__init__.py:3037 --#: ../yum/__init__.py:3205 --#: ../yum/__init__.py:3495 -+#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 -+#: ../yum/__init__.py:3658 - #, python-format - msgid "No Match for argument: %s" - msgstr "Nenhuma correspondência para o argumento: %s" + #: ../yum/__init__.py:4159 + msgid "Errors were encountered while downloading packages." +@@ -2617,56 +2676,54 @@ msgstr "Пожалуйста, сообщите об этой ошибке в %s" --#: ../yum/__init__.py:2798 -+#: ../yum/__init__.py:2957 - #, python-format - msgid "Package %s installed and not available" - msgstr "Pacote %s instalado, mas não disponível" + #: ../yum/__init__.py:4233 + msgid "Test Transaction Errors: " +-msgstr "Ошибки теста транзакции:" ++msgstr "Ошибки проверки сценария:" --#: ../yum/__init__.py:2801 -+#: ../yum/__init__.py:2960 - msgid "No package(s) available to install" - msgstr "Nenhum pacote disponível para instalar" - --#: ../yum/__init__.py:2813 -+#: ../yum/__init__.py:2972 + #: ../yum/__init__.py:4334 #, python-format - msgid "Package: %s - already in transaction set" - msgstr "Pacote: %s - já está no conjunto de transações" + msgid "Could not set cachedir: %s" +-msgstr "Невозможно установить директорию кэша: %s" ++msgstr "Невозможно задать кэш-папку: %s" --#: ../yum/__init__.py:2839 -+#: ../yum/__init__.py:2998 - #, python-format - msgid "Package %s is obsoleted by %s which is already installed" - msgstr "O pacote %s foi tornado obsoleto pelo %s, o qual já está instalado" + #. Mostly copied from YumOutput._outKeyValFill() + #: ../yum/plugins.py:202 + msgid "Loaded plugins: " +-msgstr "Загруженные плагины:" ++msgstr "Загружены модули:" --#: ../yum/__init__.py:2842 -+#: ../yum/__init__.py:3001 +-#: ../yum/plugins.py:216 ../yum/plugins.py:222 ++#: ../yum/plugins.py:216 ++#: ../yum/plugins.py:222 #, python-format - msgid "Package %s is obsoleted by %s, trying to install %s instead" --msgstr "O pacote %s foi tornado obsoleto por %s, tentando instalar %s ao invés disso" -+msgstr "" -+"O pacote %s foi tornado obsoleto por %s, tentando instalar %s ao invés disso" + msgid "No plugin match for: %s" +-msgstr "Нет плагина: %s" ++msgstr "Нет модуля: %s" --#: ../yum/__init__.py:2850 -+#: ../yum/__init__.py:3009 + #: ../yum/plugins.py:252 #, python-format - msgid "Package %s already installed and latest version" - msgstr "O pacote %s já está instalado em sua última versão" + msgid "Not loading \"%s\" plugin, as it is disabled" +-msgstr "Плагин \"%s\" не был загружен, поскольку он отключен" ++msgstr "Модуль \"%s\" не был загружен, поскольку отключен" --#: ../yum/__init__.py:2864 -+#: ../yum/__init__.py:3023 + #. Give full backtrace: + #: ../yum/plugins.py:264 #, python-format - msgid "Package matching %s already installed. Checking for update." - msgstr "O pacote %s já está instalado. Verificando por uma atualização." - - #. update everything (the easy case) --#: ../yum/__init__.py:2966 -+#: ../yum/__init__.py:3126 - msgid "Updating Everything" - msgstr "Atualizando tudo" + msgid "Plugin \"%s\" can't be imported" +-msgstr "Невозможен импорт плагина \"%s\"" ++msgstr "Невозможен импорт модуля \"%s\"" --#: ../yum/__init__.py:2987 --#: ../yum/__init__.py:3102 --#: ../yum/__init__.py:3129 --#: ../yum/__init__.py:3155 -+#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 -+#: ../yum/__init__.py:3315 + #: ../yum/plugins.py:271 #, python-format - msgid "Not Updating Package that is already obsoleted: %s.%s %s:%s-%s" - msgstr "Pacote já obsoleto não será atualizado: %s.%s %s:%s-%s" + msgid "Plugin \"%s\" doesn't specify required API version" +-msgstr "Плагин \"%s\" не указывает необходимую версию API" ++msgstr "Модулем \"%s\" не указана требуемая версия API" --#: ../yum/__init__.py:3022 --#: ../yum/__init__.py:3202 -+#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 + #: ../yum/plugins.py:276 #, python-format - msgid "%s" - msgstr "%s" + msgid "Plugin \"%s\" requires API %s. Supported API is %s." +-msgstr "Плагин \"%s\" требует API %s. Поддерживаемый API %s." ++msgstr "Модуль \"%s\" требует API %s. Поддерживаемая API — %s." --#: ../yum/__init__.py:3093 -+#: ../yum/__init__.py:3253 + #: ../yum/plugins.py:309 #, python-format - msgid "Package is already obsoleted: %s.%s %s:%s-%s" - msgstr "O pacote já está obsoleto: %s.%s %s:%s-%s" + msgid "Loading \"%s\" plugin" +-msgstr "Загрузка \"%s\" плагина" ++msgstr "Загрузка модуля \"%s\"" --#: ../yum/__init__.py:3124 -+#: ../yum/__init__.py:3284 + #: ../yum/plugins.py:316 #, python-format - msgid "Not Updating Package that is obsoleted: %s" - msgstr "Não atualizando o pacote que está obsoleto: %s" +-msgid "" +-"Two or more plugins with the name \"%s\" exist in the plugin search path" +-msgstr "" +-"Найдено два или более плагинов с названием \"%s\" в директории поиска " +-"плагинов" ++msgid "Two or more plugins with the name \"%s\" exist in the plugin search path" ++msgstr "В каталоге модулей обнаружено два или более с названием \"%s\"" --#: ../yum/__init__.py:3133 --#: ../yum/__init__.py:3159 -+#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 + #: ../yum/plugins.py:336 #, python-format - msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s" - msgstr "Pacote já atualizado não será atualizado novamente: %s.%s %s:%s-%s" - --#: ../yum/__init__.py:3218 -+#: ../yum/__init__.py:3378 - msgid "No package matched to remove" - msgstr "Nenhum pacote encontrado para remoção" - --#: ../yum/__init__.py:3251 --#: ../yum/__init__.py:3349 --#: ../yum/__init__.py:3432 -+#: ../yum/__init__.py:3412 +@@ -2678,7 +2735,7 @@ msgstr "Конфигурационный файл %s не найден" + #: ../yum/plugins.py:339 #, python-format --msgid "Cannot open file: %s. Skipping." --msgstr "Não foi possível abrir o arquivo: %s. Ignorando." -+msgid "Cannot open: %s. Skipping." -+msgstr "Não foi possível abrir: %s. Ignorando." + msgid "Unable to find configuration file for plugin %s" +-msgstr "Невозможно найти конфигурационный файл для плагина %s" ++msgstr "Не найден файл настройки модуля %s" --#: ../yum/__init__.py:3254 --#: ../yum/__init__.py:3352 --#: ../yum/__init__.py:3435 -+#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 - #, python-format - msgid "Examining %s: %s" - msgstr "Examinando %s: %s" + #: ../yum/plugins.py:501 + msgid "registration of commands not supported" +@@ -2713,23 +2770,24 @@ msgstr "Контрольная сумма md5 пакета %s не совпад --#: ../yum/__init__.py:3262 --#: ../yum/__init__.py:3355 --#: ../yum/__init__.py:3438 -+#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 - #, python-format - msgid "Cannot add package %s to transaction. Not a compatible architecture: %s" --msgstr "Não foi possível adicionar o pacote %s à transação. %s não é uma arquitetura compatível." -+msgstr "" -+"Não foi possível adicionar o pacote %s à transação. %s não é uma arquitetura " -+"compatível." + #: ../rpmUtils/oldUtils.py:151 + msgid "Could not open RPM database for reading. Perhaps it is already in use?" +-msgstr "" +-"Невозможно открыть базу RPM для чтения. Возможно база уже используется." ++msgstr "Невозможно открыть базу RPM для чтения. Возможно база уже используется." --#: ../yum/__init__.py:3270 -+#: ../yum/__init__.py:3431 - #, python-format --msgid "Package %s not installed, cannot update it. Run yum install to install it instead." --msgstr "O pacote %s não está instalado, não é possível atualizá-lo. Execute o yum install para instalá-lo." -+msgid "" -+"Package %s not installed, cannot update it. Run yum install to install it " -+"instead." -+msgstr "" -+"O pacote %s não está instalado, não é possível atualizá-lo. Execute o yum " -+"install para instalá-lo." + #: ../rpmUtils/oldUtils.py:183 + msgid "Got an empty Header, something has gone wrong" + msgstr "Получен пустой заголовок, что-то не так" --#: ../yum/__init__.py:3299 --#: ../yum/__init__.py:3360 --#: ../yum/__init__.py:3443 -+#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 +-#: ../rpmUtils/oldUtils.py:253 ../rpmUtils/oldUtils.py:260 +-#: ../rpmUtils/oldUtils.py:263 ../rpmUtils/oldUtils.py:266 ++#: ../rpmUtils/oldUtils.py:253 ++#: ../rpmUtils/oldUtils.py:260 ++#: ../rpmUtils/oldUtils.py:263 ++#: ../rpmUtils/oldUtils.py:266 #, python-format - msgid "Excluding %s" - msgstr "Excluindo %s" + msgid "Damaged Header %s" +-msgstr "Повреждённый заголовок %s" ++msgstr "Поврежденный заголовок %s" --#: ../yum/__init__.py:3304 -+#: ../yum/__init__.py:3465 + #: ../rpmUtils/oldUtils.py:281 #, python-format - msgid "Marking %s to be installed" - msgstr "Marcando %s para ser instalado" + msgid "Error opening rpm %s - error %s" +-msgstr "Невозможно открыть пакет %s - ошибка %s" ++msgstr "Невозможно открыть пакет %s — ошибка %s" --#: ../yum/__init__.py:3310 -+#: ../yum/__init__.py:3471 - #, python-format - msgid "Marking %s as an update to %s" - msgstr "Marcando %s como uma atualização do %s" + #, fuzzy + #~ msgid "Parsing package install arguments" +-- +1.7.0.1 + + +From 0ac90c93ee164ea24951926e8b26ae897ec270af Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 1 Apr 2010 15:29:18 -0400 +Subject: [PATCH 28] fix the documentation to be on the correct methods. + +--- + yum/packageSack.py | 31 ++++++++++++++++--------------- + 1 files changed, 16 insertions(+), 15 deletions(-) + +diff --git a/yum/packageSack.py b/yum/packageSack.py +index 1278cba..723f0cd 100644 +--- a/yum/packageSack.py ++++ b/yum/packageSack.py +@@ -227,15 +227,15 @@ class PackageSackBase(object): + """return list of newest packages based on name, arch matching + this means(in name.arch form): foo.i386 and foo.noarch are not + compared to each other for highest version only foo.i386 and +- foo.i386 will be compared""" ++ foo.i386 will be compared ++ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 ++ The last _two_ pkgs will be returned, not just one of them. """ + raise NotImplementedError() --#: ../yum/__init__.py:3317 -+#: ../yum/__init__.py:3478 - #, python-format - msgid "%s: does not update installed package." - msgstr "%s: não atualiza o pacote instalado." + def returnNewestByName(self, name=None, patterns=None, ignore_case=False): + """return list of newest packages based on name matching + this means(in name.arch form): foo.i386 and foo.noarch will +- be compared to each other for highest version. +- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 +- The last _two_ pkgs will be returned, not just one of them. """ ++ be compared to each other for highest version.""" + raise NotImplementedError() --#: ../yum/__init__.py:3379 -+#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 -+#, python-format -+msgid "Cannot open file: %s. Skipping." -+msgstr "Não foi possível abrir o arquivo: %s. Ignorando." + def simplePkgList(self, patterns=None, ignore_case=False): +@@ -497,7 +497,9 @@ class MetaSack(PackageSackBase): + """return list of newest packages based on name, arch matching + this means(in name.arch form): foo.i386 and foo.noarch are not + compared to each other for highest version only foo.i386 and +- foo.i386 will be compared""" ++ foo.i386 will be compared. ++ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 ++ The last _two_ pkgs will be returned, not just one of them. """ + calr = self._computeAggregateListResult + pkgs = calr("returnNewestByNameArch", naTup, patterns, ignore_case) + pkgs = packagesNewestByNameArch(pkgs) +@@ -509,9 +511,7 @@ class MetaSack(PackageSackBase): + def returnNewestByName(self, name=None, patterns=None, ignore_case=False): + """return list of newest packages based on name matching + this means(in name.arch form): foo.i386 and foo.noarch will +- be compared to each other for highest version. +- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 +- The last _two_ pkgs will be returned, not just one of them. """ ++ be compared to each other for highest version.""" + pkgs = self._computeAggregateListResult("returnNewestByName", name, + patterns, ignore_case) + pkgs = packagesNewestByName(pkgs) +@@ -903,7 +903,10 @@ class PackageSack(PackageSackBase): + """return list of newest packages based on name, arch matching + this means(in name.arch form): foo.i386 and foo.noarch are not + compared to each other for highest version only foo.i386 and +- foo.i386 will be compared""" ++ foo.i386 will be compared ++ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 ++ The last _two_ pkgs will be returned, not just one of them. """ + -+#: ../yum/__init__.py:3541 - msgid "Problem in reinstall: no package matched to remove" - msgstr "Problema na reinstalação: nenhum pacote encontrado para remoção" - --#: ../yum/__init__.py:3392 --#: ../yum/__init__.py:3523 -+#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 - #, python-format - msgid "Package %s is allowed multiple installs, skipping" - msgstr "O pacote %s permite múltiplas instalações, ignorando" - --#: ../yum/__init__.py:3413 -+#: ../yum/__init__.py:3575 - #, python-format - msgid "Problem in reinstall: no package %s matched to install" - msgstr "Problema na reinstalação: nenhum pacote %s encontrado para instalação" - --#: ../yum/__init__.py:3515 -+#: ../yum/__init__.py:3678 - msgid "No package(s) available to downgrade" - msgstr "Nenhum pacote disponível para ser retrocedido" + highdict = {} + # If naTup is set, only iterate through packages that match that + # name +@@ -935,9 +938,7 @@ class PackageSack(PackageSackBase): + def returnNewestByName(self, name=None, patterns=None, ignore_case=False): + """return list of newest packages based on name matching + this means(in name.arch form): foo.i386 and foo.noarch will +- be compared to each other for highest version. +- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 +- The last _two_ pkgs will be returned, not just one of them. """ ++ be compared to each other for highest version.""" --#: ../yum/__init__.py:3559 -+#: ../yum/__init__.py:3731 - #, python-format - msgid "No Match for available package: %s" - msgstr "Nenhuma correspondência disponível para o pacote: %s" + highdict = {} + for pkg in self.returnPackages(patterns=patterns, +@@ -1002,8 +1003,7 @@ class PackageSack(PackageSackBase): --#: ../yum/__init__.py:3565 -+#: ../yum/__init__.py:3738 - #, python-format - msgid "Only Upgrade available on package: %s" - msgstr "Somente a atualização está disponível para o pacote: %s" + def packagesNewestByName(pkgs): + """ Does the same as PackageSack.returnNewestByName(). +- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 +- The last _two_ pkgs will be returned, not just one of them. """ ++ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64""" + newest = {} + for pkg in pkgs: + key = pkg.name +@@ -1021,7 +1021,8 @@ def packagesNewestByName(pkgs): + ret.extend(vals) + return ret + def packagesNewestByNameArch(pkgs): +- """ Does the same as PackageSack.returnNewestByNameArch() """ ++ """ Does the same as PackageSack.returnNewestByNameArch() ++ The last _two_ pkgs will be returned, not just one of them.""" + newest = {} + for pkg in pkgs: + key = (pkg.name, pkg.arch) +-- +1.7.0.1 + + +From 204f47d96e8c585b96da60adf4ef94d8211be168 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 30 Mar 2010 15:48:29 -0400 +Subject: [PATCH 29] Speedup repeated calls to .install() with a pattern, via. returnPackages(). + Add negative caching to both sqlite and rpmdb. + Add pkg names with a '-' in them to pkgnames_loaded in sqlite. + +--- + yum/rpmsack.py | 17 ++++++++++++++++- + yum/sqlitesack.py | 26 +++++++++++++++++++++++++- + 2 files changed, 41 insertions(+), 2 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 8289cd2..4580150 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -144,6 +144,7 @@ class RPMDBPackageSack(PackageSackBase): + self._name2pkg = {} + self._tup2pkg = {} + self._completely_loaded = False ++ self._pkgmatch_fails = set() + self._simple_pkgtup_list = [] + self._get_pro_cache = {} + self._get_req_cache = {} +@@ -189,6 +190,7 @@ class RPMDBPackageSack(PackageSackBase): + self._name2pkg = {} + self._tup2pkg = {} + self._completely_loaded = False ++ self._pkgmatch_fails = set() + self._simple_pkgtup_list = [] + self._get_pro_cache = {} + self._get_req_cache = {} +@@ -362,13 +364,14 @@ class RPMDBPackageSack(PackageSackBase): + return misc.newestInList(allpkgs) --#: ../yum/__init__.py:3635 --#: ../yum/__init__.py:3672 -+#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 - #, python-format - msgid "Failed to downgrade: %s" - msgstr "Falha ao desatualizar: %s" + @staticmethod +- def _compile_patterns(patterns, ignore_case=False): ++ def _compile_patterns(self, patterns, ignore_case=False): + if not patterns or len(patterns) > constants.PATTERNS_MAX: + return None + ret = [] + for pat in patterns: + if not pat: + continue ++ + qpat = pat[0] + if qpat in ('?', '*'): + qpat = None +@@ -381,6 +384,7 @@ class RPMDBPackageSack(PackageSackBase): + return ret + @staticmethod + def _match_repattern(repatterns, hdr, ignore_case): ++ """ This is basically parsePackages() but for rpm hdr objects. """ + if repatterns is None: + return True --#: ../yum/__init__.py:3704 -+#: ../yum/__init__.py:3877 - #, python-format - msgid "Retrieving GPG key from %s" - msgstr "Obtendo a chave GPG a partir de %s" +@@ -417,6 +421,16 @@ class RPMDBPackageSack(PackageSackBase): + """Returns a list of packages. Note that the packages are + always filtered to those matching the patterns/case. repoid is + ignored, and is just here for compatibility with non-rpmdb sacks. """ ++ if patterns and not ignore_case: ++ tpats = [] ++ for pat in patterns: ++ if pat in self._pkgmatch_fails: ++ continue ++ tpats.append(pat) ++ patterns = tpats ++ if not patterns: ++ return [] ++ + if not self._completely_loaded: + rpats = self._compile_patterns(patterns, ignore_case) + for hdr, idx in self._all_packages(): +@@ -430,6 +444,7 @@ class RPMDBPackageSack(PackageSackBase): + pkgobjlist = [pkg for pkg in pkgobjlist if pkg.name != 'gpg-pubkey'] + if patterns: + pkgobjlist = parsePackages(pkgobjlist, patterns, not ignore_case) ++ self._pkgmatch_fails.update(pkgobjlist[2]) + pkgobjlist = pkgobjlist[0] + pkgobjlist[1] + return pkgobjlist --#: ../yum/__init__.py:3724 -+#: ../yum/__init__.py:3897 - msgid "GPG key retrieval failed: " - msgstr "A obtenção da chave GPG falhou:" +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 1d6c764..9a95b7b 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -428,6 +428,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + self._pkgname2pkgkeys = {} + self._pkgtup2pkgs = {} + self._pkgnames_loaded = set() ++ self._pkgmatch_fails = set() + self._arch_allowed = None + self._pkgExcluder = [] + self._pkgExcludeIds = {} +@@ -491,6 +492,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + self._key2pkg = {} + self._pkgname2pkgkeys = {} + self._pkgnames_loaded = set() ++ self._pkgmatch_fails = set() + self._pkgtup2pkgs = {} + self._search_cache = { + 'provides' : { }, +@@ -1228,6 +1230,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + user_names = set(names) + names = [] + for pkgname in user_names: ++ if pkgname in self._pkgmatch_fails: ++ continue ++ + if loaded_all_names or pkgname in self._pkgnames_loaded: + returnList.extend(self._packagesByName(pkgname)) + else: +@@ -1502,7 +1507,8 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + 'sql_envra', 'sql_nevra'] + need_full = False + for pat in patterns: +- if misc.re_full_search_needed(pat): ++ if (misc.re_full_search_needed(pat) and ++ (ignore_case or pat not in self._pkgnames_loaded)): + need_full = True + break --#: ../yum/__init__.py:3735 -+#: ../yum/__init__.py:3903 -+#, python-format -+msgid "Invalid GPG Key from %s: %s" -+msgstr "A chave GPG de %s é inválida: %s" +@@ -1536,12 +1542,18 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + pat_sqls = [] + pat_data = [] + for (pattern, rest) in patterns: ++ if not ignore_case and pattern in self._pkgmatch_fails: ++ continue + -+#: ../yum/__init__.py:3912 - #, python-format - msgid "GPG key parsing failed: key does not have value %s" - msgstr "Falha na análise da chave GPG: ela não tem o valor %s" + for field in fields: + if ignore_case: + pat_sqls.append("%s LIKE ?%s" % (field, rest)) + else: + pat_sqls.append("%s %s ?" % (field, rest)) + pat_data.append(pattern) ++ if patterns and not pat_sqls: ++ return ++ + if pat_sqls: + qsql = _FULL_PARSE_QUERY_BEG + " OR ".join(pat_sqls) + else: +@@ -1578,6 +1590,18 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + if not need_full and repoid is None: + # Mark all the processed pkgnames as fully loaded + self._pkgnames_loaded.update([po.name for po in returnList]) ++ if need_full: ++ for (pat, rest) in patterns: ++ if rest == 'glob': ++ continue ++ assert rest == '=' ++ for pkg in returnList: ++ if pkg.name == pat: ++ self._pkgnames_loaded.add(pkg.name) ++ break ++ if not returnList: ++ for (pat, rest) in patterns: ++ self._pkgmatch_fails.add(pat) --#: ../yum/__init__.py:3767 -+#: ../yum/__init__.py:3944 - #, python-format - msgid "GPG key at %s (0x%s) is already installed" - msgstr "A chave GPG em %s (0x%s) já está instalada" + return returnList + +-- +1.7.0.1 + + +From ae29fa070f83cf2e11b06ea938468e51eac00eba Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 30 Mar 2010 18:47:49 -0400 +Subject: [PATCH 30] Add searchProvides() into the false positive cache + +--- + yum/sqlitesack.py | 7 ++++++- + 1 files changed, 6 insertions(+), 1 deletions(-) + +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 9a95b7b..d387c76 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -1374,7 +1374,12 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - #. Try installing/updating GPG key --#: ../yum/__init__.py:3772 --#: ../yum/__init__.py:3834 -+#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 - #, python-format - msgid "Importing GPG key 0x%s \"%s\" from %s" - msgstr "Importando chave GPG 0x%s \"%s\" a partir de %s" + def searchProvides(self, name): + """return list of packages providing name (any evr and flag)""" +- return self.searchPrco(name, "provides") ++ if name in self._pkgmatch_fails: ++ return [] ++ ret = self.searchPrco(name, "provides") ++ if not ret: ++ self._pkgmatch_fails.add(name) ++ return ret + + def searchRequires(self, name): + """return list of packages requiring name (any evr and flag)""" +-- +1.7.0.1 + + +From 1f76f743d187226461a226358147c37d42a8fab1 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 30 Mar 2010 18:52:39 -0400 +Subject: [PATCH 31] Pkgname caching for rpmdb.returnPackages() so update is as fast as install + +--- + yum/rpmsack.py | 31 ++++++++++++++++++++++++++----- + 1 files changed, 26 insertions(+), 5 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 4580150..4c17b67 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -142,6 +142,7 @@ class RPMDBPackageSack(PackageSackBase): + self.root = root + self._idx2pkg = {} + self._name2pkg = {} ++ self._pkgnames_loaded = set() + self._tup2pkg = {} + self._completely_loaded = False + self._pkgmatch_fails = set() +@@ -188,6 +189,7 @@ class RPMDBPackageSack(PackageSackBase): + def dropCachedData(self): + self._idx2pkg = {} + self._name2pkg = {} ++ self._pkgnames_loaded = set() + self._tup2pkg = {} + self._completely_loaded = False + self._pkgmatch_fails = set() +@@ -321,7 +323,12 @@ class RPMDBPackageSack(PackageSackBase): + return result --#: ../yum/__init__.py:3789 -+#: ../yum/__init__.py:3966 - msgid "Not installing key" - msgstr "Não está instalando a chave" + def searchProvides(self, name): +- return self.searchPrco(name, 'provides') ++ if name in self._pkgmatch_fails: ++ return [] ++ ret = self.searchPrco(name, 'provides') ++ if not ret: ++ self._pkgmatch_fails.add(name) ++ return ret --#: ../yum/__init__.py:3795 -+#: ../yum/__init__.py:3972 - #, python-format - msgid "Key import failed (code %d)" - msgstr "Falha na importação da chave (código %d)" + def searchRequires(self, name): + return self.searchPrco(name, 'requires') +@@ -364,7 +371,7 @@ class RPMDBPackageSack(PackageSackBase): + return misc.newestInList(allpkgs) --#: ../yum/__init__.py:3796 --#: ../yum/__init__.py:3855 -+#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 - msgid "Key imported successfully" - msgstr "Chave importada com sucesso" - --#: ../yum/__init__.py:3801 --#: ../yum/__init__.py:3860 -+#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 - #, python-format - msgid "" --"The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" -+"The GPG keys listed for the \"%s\" repository are already installed but they " -+"are not correct for this package.\n" - "Check that the correct key URLs are configured for this repository." - msgstr "" --"As chaves GPG listadas para o repositório \"%s\" já estão instaladas, mas não estão corretas para este pacote.\n" --"Verifique se as URLs corretas das chaves estão configuradas para esse repositório." -+"As chaves GPG listadas para o repositório \"%s\" já estão instaladas, mas " -+"não estão corretas para este pacote.\n" -+"Verifique se as URLs corretas das chaves estão configuradas para esse " -+"repositório." - --#: ../yum/__init__.py:3810 -+#: ../yum/__init__.py:3987 - msgid "Import of key(s) didn't help, wrong key(s)?" - msgstr "A importação da(s) chave(s) não ajudou, chave(s) errada(s)?" - --#: ../yum/__init__.py:3829 -+#: ../yum/__init__.py:4006 - #, python-format - msgid "GPG key at %s (0x%s) is already imported" - msgstr "A chave GPG em %s (0x%s) já foi importada" - --#: ../yum/__init__.py:3849 -+#: ../yum/__init__.py:4026 - #, python-format - msgid "Not installing key for repo %s" - msgstr "A chave para o repositório %s não será instalada" - --#: ../yum/__init__.py:3854 -+#: ../yum/__init__.py:4031 - msgid "Key import failed" - msgstr "Falha na importação da chave" - --#: ../yum/__init__.py:3976 -+#: ../yum/__init__.py:4157 - msgid "Unable to find a suitable mirror." - msgstr "Não foi possível encontrar um espelho apropriado." - --#: ../yum/__init__.py:3978 -+#: ../yum/__init__.py:4159 - msgid "Errors were encountered while downloading packages." - msgstr "Foram encontrados erros ao baixar os pacotes." - --#: ../yum/__init__.py:4028 -+#: ../yum/__init__.py:4209 - #, python-format - msgid "Please report this error at %s" - msgstr "Por favor, relate esse erro em %s" - --#: ../yum/__init__.py:4052 -+#: ../yum/__init__.py:4233 - msgid "Test Transaction Errors: " - msgstr "Erros do teste de transação:" + @staticmethod +- def _compile_patterns(self, patterns, ignore_case=False): ++ def _compile_patterns(patterns, ignore_case=False): + if not patterns or len(patterns) > constants.PATTERNS_MAX: + return None + ret = [] +@@ -421,15 +428,19 @@ class RPMDBPackageSack(PackageSackBase): + """Returns a list of packages. Note that the packages are + always filtered to those matching the patterns/case. repoid is + ignored, and is just here for compatibility with non-rpmdb sacks. """ ++ ret = [] + if patterns and not ignore_case: + tpats = [] + for pat in patterns: + if pat in self._pkgmatch_fails: + continue ++ if pat in self._pkgnames_loaded: ++ ret.extend(self._name2pkg[pat]) ++ continue + tpats.append(pat) + patterns = tpats + if not patterns: +- return [] ++ return ret -+#: ../yum/__init__.py:4334 -+#, python-format -+msgid "Could not set cachedir: %s" -+msgstr "Não foi possível definir a cachedir: %s" -+ - #. Mostly copied from YumOutput._outKeyValFill() - #: ../yum/plugins.py:202 - msgid "Loaded plugins: " - msgstr "Plugins carregados: " + if not self._completely_loaded: + rpats = self._compile_patterns(patterns, ignore_case) +@@ -445,7 +456,14 @@ class RPMDBPackageSack(PackageSackBase): + if patterns: + pkgobjlist = parsePackages(pkgobjlist, patterns, not ignore_case) + self._pkgmatch_fails.update(pkgobjlist[2]) +- pkgobjlist = pkgobjlist[0] + pkgobjlist[1] ++ if ret: ++ pkgobjlist = pkgobjlist[0] + pkgobjlist[1] + ret ++ else: ++ pkgobjlist = pkgobjlist[0] + pkgobjlist[1] ++ for pkg in pkgobjlist: ++ for pat in patterns: ++ if pkg.name == pat: ++ self._pkgnames_loaded.add(pkg.name) + return pkgobjlist --#: ../yum/plugins.py:216 --#: ../yum/plugins.py:222 -+#: ../yum/plugins.py:216 ../yum/plugins.py:222 - #, python-format - msgid "No plugin match for: %s" - msgstr "Nenhum plugin correspondente para: %s" -@@ -2540,8 +2671,10 @@ msgstr "Carregando o plugin \"%s\"" + def _uncached_returnConflictPackages(self): +@@ -975,7 +993,7 @@ class RPMDBPackageSack(PackageSackBase): + loc = locals() + ret = [] - #: ../yum/plugins.py:316 - #, python-format --msgid "Two or more plugins with the name \"%s\" exist in the plugin search path" --msgstr "Dois ou mais plugins com o nome \"%s\" existem no caminho de pesquisa plugins" -+msgid "" -+"Two or more plugins with the name \"%s\" exist in the plugin search path" -+msgstr "" -+"Dois ou mais plugins com o nome \"%s\" existem no caminho de pesquisa plugins" +- if self._completely_loaded: ++ if self._completely_loaded or name in self._pkgnames_loaded: + if name is not None: + pkgs = self._name2pkg.get(name, []) + else: +@@ -991,6 +1009,9 @@ class RPMDBPackageSack(PackageSackBase): + ts = self.readOnlyTS() + if name is not None: + mi = ts.dbMatch('name', name) ++ # We create POs out of all matching names, even if we don't return ++ # them. ++ self._pkgnames_loaded.add(name) + elif arch is not None: + mi = ts.dbMatch('arch', arch) + else: +-- +1.7.0.1 + + +From 2a9161a8b4bfc121fa8245700df355c63b58b442 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 31 Mar 2010 00:12:09 -0400 +Subject: [PATCH 32] Should work around the reget MD problems + +--- + yum/yumRepo.py | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +diff --git a/yum/yumRepo.py b/yum/yumRepo.py +index 8d7617e..b67b897 100644 +--- a/yum/yumRepo.py ++++ b/yum/yumRepo.py +@@ -1552,9 +1552,17 @@ class YumRepository(Repository, config.RepoConf): + try: + checkfunc = (self.checkMD, (mdtype,), {}) + text = "%s/%s" % (self.id, mdtype) ++ if thisdata.size is None: ++ reget = None ++ else: ++ reget = 'simple' ++ if os.path.exists(local): ++ if os.stat(local).st_size >= int(thisdata.size): ++ misc.unlink_f(local) + local = self._getFile(relative=remote, + local=local, + copy_local=1, ++ reget=reget, + checkfunc=checkfunc, + text=text, + cache=self.http_caching == 'all', +-- +1.7.0.1 + + +From 9ef0326b38b2098d5bac9442ec4eac2fb0f06bb0 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 1 Apr 2010 18:25:50 -0400 +Subject: [PATCH 33] Fix make check due to groupremove_leaf_only + +--- + test/testbase.py | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/test/testbase.py b/test/testbase.py +index 0b05812..b4ce5d7 100644 +--- a/test/testbase.py ++++ b/test/testbase.py +@@ -44,6 +44,7 @@ class FakeConf(object): + self.persistdir = '/should-not-exist-bad-test!' + self.showdupesfromrepos = False + self.uid = 0 ++ self.groupremove_leaf_only = False - #: ../yum/plugins.py:336 - #, python-format -@@ -2559,7 +2692,20 @@ msgstr "Não foi possível encontrar o arquivo de configuração para o plugin % - msgid "registration of commands not supported" - msgstr "O registro de comandos não é suportado" + class FakeRepo(object): --#: ../yum/rpmtrans.py:78 -+#: ../yum/rpmsack.py:102 -+msgid "has missing requires of" -+msgstr "tem exigências faltando do" -+ -+#: ../yum/rpmsack.py:105 -+msgid "has installed conflicts" -+msgstr "tem conflitos instalados" +-- +1.7.0.1 + + +From 3d629ee9686dc972ebd431ee0db9c5912e4f24f3 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 1 Apr 2010 18:26:16 -0400 +Subject: [PATCH 34] Add testcase for dcbd and lldpad in F13 + +--- + test/depsolvetests.py | 15 +++++++++++++++ + 1 files changed, 15 insertions(+), 0 deletions(-) + +diff --git a/test/depsolvetests.py b/test/depsolvetests.py +index 02bbf8f..7af3f16 100644 +--- a/test/depsolvetests.py ++++ b/test/depsolvetests.py +@@ -1197,3 +1197,18 @@ class DepsolveTests(DepsolveTests): + self.assertEquals('ok', *self.resolveCode()) + self.assertResult((po, po2)) + ++ def testRL_dcbd1(self): ++ xpo = FakePackage('dcbd-devel', version='1', arch='i386') ++ xpo.addRequires('dcbd', None, (None, None, None)) ++ self.tsInfo.addInstall(xpo) + -+#: ../yum/rpmsack.py:114 -+#, python-format -+msgid "%s is a duplicate with %s" -+msgstr "%s é uma duplicação do %s" ++ po1 = FakePackage('dcbd', version='1') ++ po1.addProvides('dcbd', 'EQ', ('0', '1', '0')) ++ po2 = FakePackage('lldpad', version='2') ++ po2.addObsoletes('dcbd', 'LT', ('0', '2', '0')) ++ po3 = FakePackage('lldpad-devel', version='2') ++ self.xsack.addPackage(po3) ++ self.xsack.addPackage(po2) ++ self.xsack.addPackage(po1) + -+#: ../yum/rpmtrans.py:79 - msgid "Repackaging" - msgstr "Reempacotando" - -@@ -2575,16 +2721,16 @@ msgstr "O RPM %s não passou na verificação md5" ++ self.assertEquals('err', *self.resolveCode()) +-- +1.7.0.1 + + +From 20b93715c0cf57068c5714699a2f2065a0489e2c Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 1 Apr 2010 18:29:35 -0400 +Subject: [PATCH 35] Use TMPDIR for people who don't want to use /var/tmp, yum#337 + +--- + yum/__init__.py | 6 +++++- + 1 files changed, 5 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index cbb0dfa..917fa1f 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -4361,13 +4361,17 @@ class YumBase(depsolve.Depsolve): + self.repos.enableRepo(newrepo.id) + return newrepo - #: ../rpmUtils/oldUtils.py:151 - msgid "Could not open RPM database for reading. Perhaps it is already in use?" --msgstr "Não foi possível abrir o banco de dados RPM para leitura. Talvez por que ele já esteja em uso?" -+msgstr "" -+"Não foi possível abrir o banco de dados RPM para leitura. Talvez por que ele " -+"já esteja em uso?" +- def setCacheDir(self, force=False, tmpdir='/var/tmp', reuse=True, ++ def setCacheDir(self, force=False, tmpdir=None, reuse=True, + suffix='/$basearch/$releasever'): + ''' Set a new cache dir, using misc.getCacheDir() and var. replace + on suffix. ''' - #: ../rpmUtils/oldUtils.py:183 - msgid "Got an empty Header, something has gone wrong" - msgstr "Um cabeçalho vazio foi obtido, algo deu errado" + if not force and os.geteuid() == 0: + return True # We are root, not forced, so happy with the global dir. ++ if tmpdir is None: ++ tmpdir = os.getenv('TMPDIR') ++ if tmpdir is None: # Note that TMPDIR isn't exported by default :( ++ tmpdir = '/var/tmp' + try: + cachedir = misc.getCacheDir(tmpdir, reuse) + except (IOError, OSError), e: +-- +1.7.0.1 + + +From 7a56e51a1fa707d46f58ccb8d5687617d78795b6 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sat, 3 Apr 2010 17:13:02 -0400 +Subject: [PATCH 36] Don't traceback when lock holder doesn't exist anymore + +--- + utils.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/utils.py b/utils.py +index dd6b642..e93facb 100644 +--- a/utils.py ++++ b/utils.py +@@ -105,7 +105,7 @@ def show_lock_owner(pid, logger): --#: ../rpmUtils/oldUtils.py:253 --#: ../rpmUtils/oldUtils.py:260 --#: ../rpmUtils/oldUtils.py:263 --#: ../rpmUtils/oldUtils.py:266 -+#: ../rpmUtils/oldUtils.py:253 ../rpmUtils/oldUtils.py:260 -+#: ../rpmUtils/oldUtils.py:263 ../rpmUtils/oldUtils.py:266 - #, python-format - msgid "Damaged Header %s" - msgstr "Cabeçalho %s danificado" -@@ -2594,21 +2740,44 @@ msgstr "Cabeçalho %s danificado" - msgid "Error opening rpm %s - error %s" - msgstr "Erro ao abrir o rpm %s - erro %s" + ps = get_process_info(pid) + # This yumBackend isn't very friendly, so... +- if ps['name'] == 'yumBackend.py': ++ if ps is not None and ps['name'] == 'yumBackend.py': + nmsg = _(" The other application is: PackageKit") + else: + nmsg = _(" The other application is: %s") % ps['name'] +-- +1.7.0.1 + + +From c6ffca42ae0c542e0c16ef7d5d2fbba1db1c5fb6 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 8 Apr 2010 11:27:45 -0400 +Subject: [PATCH 37] make rangecompare accept <, <=, >, >=, = instead of just letterflags and numerics + +makes certain types of comparisons simpler when coming from text. +--- + rpmUtils/miscutils.py | 44 ++++++++++++++++++++++---------------------- + 1 files changed, 22 insertions(+), 22 deletions(-) + +diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py +index a925027..b5f3566 100644 +--- a/rpmUtils/miscutils.py ++++ b/rpmUtils/miscutils.py +@@ -170,45 +170,45 @@ def rangeCompare(reqtuple, provtuple): -+#~ msgid "Finished Transaction Test" -+#~ msgstr "Teste de transação finalizado" -+ -+#~ msgid "" -+#~ " You could try running: package-cleanup --problems\n" -+#~ " package-cleanup --dupes\n" -+#~ " rpm -Va --nofiles --nodigest" -+#~ msgstr "" -+#~ " Você pode tentar executar: package-cleanup --problems\n" -+#~ " package-cleanup --dupes\n" -+#~ " rpm -Va --nofiles --nodigest" -+ -+#~ msgid "Unresolvable requirement %s for %s" -+#~ msgstr "Requerimento %s insolúvel para o %s" -+ -+#~ msgid "Missing Dependency: %s is needed by package %s" -+#~ msgstr "Dependência faltando: %s é requerido pelo pacote %s" -+ - #~ msgid "" - #~ "getInstalledPackageObject() will go away, use self.rpmdb.searchPkgTuple" - #~ "().\n" - #~ msgstr "" - #~ "getInstalledPackageObject() será deixada de lado, use a self.rpmdb." - #~ "searchPkgTuple().\n" -+ - #~ msgid "Command" - #~ msgstr "Comando" -+ - #~ msgid "Created" - #~ msgstr "Criado" -+ - #~ msgid "Summary" - #~ msgstr "Resumo" -+ - #~ msgid "Matching packages for package list to user args" - #~ msgstr "" - #~ "Resultado dos pacotes para a lista de pacotes dos argumentos do usuário" -+ - #~ msgid "" - #~ "\n" - #~ "Transaction Summary\n" -@@ -2623,67 +2792,94 @@ msgstr "Erro ao abrir o rpm %s - erro %s" - #~ "Instalar %5.5s pacote(s) \n" - #~ "Atualizar %5.5s pacote(s) \n" - #~ "Remover %5.5s pacote(s) \n" -+ - #~ msgid "excluding for cost: %s from %s" - #~ msgstr "excluindo para custo: %s a partir de %s" -+ - #~ msgid "Excluding Packages in global exclude list" - #~ msgstr "Excluindo pacotes na lista global de excluídos" -+ - #~ msgid "Excluding Packages from %s" - #~ msgstr "Excluindo pacotes de %s" -+ - #~ msgid "Reducing %s to included packages only" - #~ msgstr "Reduzindo %s apenas aos pacotes inclusos" -+ - #~ msgid "Keeping included package %s" - #~ msgstr "Mantendo o pacote incluso %s" -+ - #~ msgid "Removing unmatched package %s" - #~ msgstr "Removendo pacote não encontrado %s" -+ - #~ msgid "Finished" - #~ msgstr "Concluído" -+ - #~ msgid "Invalid versioned dependency string, try quoting it." - #~ msgstr "String de dependência versionada inválida, tente citá-la." -+ - #~ msgid "Entering rpm code" - #~ msgstr "Entrando no código rpm" -+ - #~ msgid "Leaving rpm code" - #~ msgstr "Saindo do código rpm" -+ - #~ msgid "Parsing package install arguments" - #~ msgstr "Analisando argumentos da instalação de pacotes" -+ - #~ msgid "" - #~ "Failure finding best provider of %s for %s, exceeded maximum loop length" - #~ msgstr "" - #~ "Falha ao encontrar o melhor fornecedor de %s para %s, tamanho máximo do " - #~ "loop excedido" -+ - #~ msgid "Comparing best: %s to po: %s" - #~ msgstr "Comparando melhor: %s para po: %s" -+ - #~ msgid "Same: best %s == po: %s" - #~ msgstr "Igual: melhor %s == po: %s" -+ - #~ msgid "po %s obsoletes best: %s" - #~ msgstr "po %s torna melhor obsoleto: %s" -+ - #~ msgid "po %s shares a sourcerpm with %s" - #~ msgstr "po %s compartilha um sourcerpm com %s" -+ - #~ msgid "best %s shares a sourcerpm with %s" - #~ msgstr "melhor %s compartilha um sourcerpm com %s" -+ - #~ msgid "po %s shares more of the name prefix with %s" - #~ msgstr "po %s compartilha mais do prefixo do nome com %s" -+ - #~ msgid "po %s has a shorter name than best %s" - #~ msgstr "po %s tem um nome mais curto do que o melhor %s" + # does not match unless + if rc >= 1: +- if reqf in ['GT', 'GE', 4, 12]: ++ if reqf in ['GT', 'GE', 4, 12, '>', '>=']: + return 1 +- if reqf in ['EQ', 8]: +- if f in ['LE', 10, 'LT', 2]: +- return 1 +- if reqf in ['LE', 'LT', 'EQ', 10, 2, 8]: +- if f in ['LE', 'LT', 10, 2]: ++ if reqf in ['EQ', 8, '=']: ++ if f in ['LE', 10, 'LT', 2,'<=', '<']: ++ return 1 ++ if reqf in ['LE', 'LT', 'EQ', 10, 2, 8, '<=', '<', '=']: ++ if f in ['LE', 'LT', 10, 2, '<=', '<']: + return 1 + + if rc == 0: +- if reqf in ['GT', 4]: +- if f in ['GT', 'GE', 4, 12]: ++ if reqf in ['GT', 4, '>']: ++ if f in ['GT', 'GE', 4, 12, '>', '>=']: + return 1 +- if reqf in ['GE', 12]: +- if f in ['GT', 'GE', 'EQ', 'LE', 4, 12, 8, 10]: ++ if reqf in ['GE', 12, '>=']: ++ if f in ['GT', 'GE', 'EQ', 'LE', 4, 12, 8, 10, '>', '>=', '=', '<=']: + return 1 +- if reqf in ['EQ', 8]: +- if f in ['EQ', 'GE', 'LE', 8, 12, 10]: ++ if reqf in ['EQ', 8, '=']: ++ if f in ['EQ', 'GE', 'LE', 8, 12, 10, '=', '>=', '<=']: + return 1 +- if reqf in ['LE', 10]: +- if f in ['EQ', 'LE', 'LT', 'GE', 8, 10, 2, 12]: ++ if reqf in ['LE', 10, '<=']: ++ if f in ['EQ', 'LE', 'LT', 'GE', 8, 10, 2, 12, '=', '<=', '<' , '>=']: + return 1 +- if reqf in ['LT', 2]: +- if f in ['LE', 'LT', 10, 2]: ++ if reqf in ['LT', 2, '<']: ++ if f in ['LE', 'LT', 10, 2, '<=', '<']: + return 1 + if rc <= -1: +- if reqf in ['GT', 'GE', 'EQ', 4, 12, 8]: +- if f in ['GT', 'GE', 4, 12]: ++ if reqf in ['GT', 'GE', 'EQ', 4, 12, 8, '>', '>=', '=']: ++ if f in ['GT', 'GE', 4, 12, '>', '>=']: + return 1 +- if reqf in ['LE', 'LT', 10, 2]: ++ if reqf in ['LE', 'LT', 10, 2, '<=', '<']: + return 1 + # if rc >= 1: +-# if reqf in ['GT', 'GE', 4, 12]: ++# if reqf in ['GT', 'GE', 4, 12, '>', '>=']: + # return 1 + # if rc == 0: +-# if reqf in ['GE', 'LE', 'EQ', 8, 10, 12]: ++# if reqf in ['GE', 'LE', 'EQ', 8, 10, 12, '>=', '<=', '=']: + # return 1 + # if rc <= -1: +-# if reqf in ['LT', 'LE', 2, 10]: ++# if reqf in ['LT', 'LE', 2, 10, '<', '<=']: + # return 1 + + return 0 +-- +1.7.0.1 + + +From 72e0bbb2d2dd704071e222b2b3cea86d31d22985 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 8 Apr 2010 11:28:45 -0400 +Subject: [PATCH 38] add a provides_for method to package objects + +so we can check if this package satisfies the specific requirement +completely (including file deps). +--- + yum/packages.py | 15 ++++++++++++++- + 1 files changed, 14 insertions(+), 1 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index 33cbc39..58be729 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -438,6 +438,7 @@ class RpmBase(object): + continue + + if f == '=': ++ print 'hmm' + f = 'EQ' + if f != 'EQ' and prcotype == 'provides': + # isn't this odd, it's not 'EQ' and it is a provides +@@ -458,7 +459,19 @@ class RpmBase(object): + + return result + +- ++ def provides_for(self, reqtuple): ++ """check to see if the package object provides for the requirement ++ passed, including searching filelists if the requirement is a file ++ dep""" ++ ++ if self.checkPrco('provides', reqtuple): ++ return True ++ ++ if reqtuple[0].startswith('/'): ++ if reqtuple[0] in self.filelist + self.dirlist + self.ghostlist: ++ return True ++ ++ return False + + def returnChangelog(self): + """return changelog entries""" +-- +1.7.0.1 + + +From 8f7e8978263d9c60bdfa37abaf0c6a44ed42b46d Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 8 Apr 2010 14:05:25 -0400 +Subject: [PATCH 39] fix for testRL_dcbd1 unittest - + +When we're doing an install for dep - make sure what we're installing provides for the thing we need. +this should really only ever happen on the obsolete pathway. + +provides_for as a kwarg should probably be added to update(), too. +--- + yum/__init__.py | 7 ++++++- + yum/depsolve.py | 32 +++++++++++++++++++------------- + 2 files changed, 25 insertions(+), 14 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 917fa1f..d83da8d 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -3037,8 +3037,13 @@ class YumBase(depsolve.Depsolve): + self.verbose_logger.warning(_('Package %s is obsoleted by %s which is already installed'), + po, already_obs) + else: ++ if 'provides_for' in kwargs: ++ if not obsoleting_pkg.provides_for(kwargs['provides_for']): ++ self.verbose_logger.warning(_('Package %s is obsoleted by %s, but obsoleting package does not provide for requirements'), ++ po.name, obsoleting_pkg.name) ++ continue + self.verbose_logger.warning(_('Package %s is obsoleted by %s, trying to install %s instead'), +- po.name, obsoleting_pkg.name, obsoleting_pkg) ++ po.name, obsoleting_pkg.name, obsoleting_pkg) + tx_return.extend(self.install(po=obsoleting_pkg)) + continue + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index f654d84..48f77d5 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -562,19 +562,25 @@ class Depsolve(object): + else: + self.verbose_logger.debug(_('TSINFO: Marking %s as install for %s'), best, + requiringPo) +- # FIXME: Don't we want .install() here, so obsoletes get done? +- txmbr = self.tsInfo.addInstall(best) +- txmbr.setAsDep(po=requiringPo) +- txmbr.reason = "dep" +- self._last_req = best +- +- # if we had other packages with this name.arch that we found +- # before, they're not going to be installed anymore, so we +- # should mark them to be re-checked +- if best.pkgtup in upgraded: +- map(self.tsInfo.remove, upgraded[best.pkgtup]) +- +- checkdeps = 1 ++ reqtuple = misc.string_to_prco_tuple(needname + str(needflags) + needversion) ++ txmbrs = self.install(best, provides_for=reqtuple) ++ for txmbr in txmbrs: ++ txmbr.setAsDep(po=requiringPo) ++ txmbr.reason = "dep" ++ self._last_req = txmbr.po + - #~ msgid "bestpkg %s shares more of the name prefix with %s" - #~ msgstr "bestpkg %s compartilha mais do prefixo do nome com %s" -+ - #~ msgid "Looking for Obsoletes for %s" - #~ msgstr "Localizando Obsoletos para %s" -+ - #~ msgid "unable to find newer package for %s" - #~ msgstr "não foi possível encontrar um pacote mais recente para o %s" -+ - #~ msgid "TSINFO: Updating %s to resolve conflict." - #~ msgstr "TSINFO: Atualizando o %s para resolver o conflito." --#~ msgid "%s conflicts with %s" --#~ msgstr "%s conflita com %s" ++ # if we had other packages with this name.arch that we found ++ # before, they're not going to be installed anymore, so we ++ # should mark them to be re-checked ++ if txmbr.pkgtup in upgraded: ++ map(self.tsInfo.remove, upgraded[txmbr.pkgtup]) ++ if not txmbrs: ++ missingdep = 1 ++ checkdeps = 0 ++ msg = self._err_missing_requires(requiringPo, requirement) ++ errorlist.append(msg) ++ else: ++ checkdeps = 1 + + return checkdeps, missingdep + +-- +1.7.0.1 + + +From c508ed6723b73b7606637376b374ee72e5afd42b Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 8 Apr 2010 16:22:04 -0400 +Subject: [PATCH 40] - clean up debug statement :( + - make provides_for use misc.re_primary_filename/dirname + +--- + yum/packages.py | 11 +++++++++-- + 1 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index 58be729..f4a00eb 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -438,7 +438,6 @@ class RpmBase(object): + continue + + if f == '=': +- print 'hmm' + f = 'EQ' + if f != 'EQ' and prcotype == 'provides': + # isn't this odd, it's not 'EQ' and it is a provides +@@ -468,7 +467,15 @@ class RpmBase(object): + return True + + if reqtuple[0].startswith('/'): +- if reqtuple[0] in self.filelist + self.dirlist + self.ghostlist: ++ if misc.re_primary_filename(reqtuple[0]) or misc.re_primary_dirname(reqtuple[0]): ++ pri_only = True ++ else: ++ pri_only = False + ++ files = self.returnFileEntries('file', pri_only) + \ ++ self.returnFileEntries('dir', pri_only) + \ ++ self.returnFileEntries('ghost', pri_only) ++ if reqtuple[0] in files: + return True + + return False +-- +1.7.0.1 + + +From 12a63c100f706738805cb0ead8852308be88027d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Thu, 8 Apr 2010 23:58:58 +0300 +Subject: [PATCH 41] Spelling fixes. + +--- + rpmUtils/oldUtils.py | 2 +- + yum/__init__.py | 4 ++-- + yum/config.py | 2 +- + yum/pgpmsg.py | 4 ++-- + yum/sqlitesack.py | 4 ++-- + 5 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/rpmUtils/oldUtils.py b/rpmUtils/oldUtils.py +index 8957685..5f1d9ec 100644 +--- a/rpmUtils/oldUtils.py ++++ b/rpmUtils/oldUtils.py +@@ -35,7 +35,7 @@ def checkheader(headerfile, name, arch): + + + def checkRpmMD5(package, urlgraberror=0): +- """take a package, check it out by trying to open it, return 1 if its good ++ """take a package, check it out by trying to open it, return 1 if it's good + return 0 if it's not""" + ts.sigChecking('md5') + fdno = os.open(package, os.O_RDONLY) +diff --git a/yum/__init__.py b/yum/__init__.py +index d83da8d..ed64441 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2524,8 +2524,8 @@ class YumBase(depsolve.Depsolve): + txmbr.groups.append(thisgroup.groupid) + self.tsInfo.conditionals[cond].append(txmbr.po) + continue +- # Otherwise we hook into tsInfo.add to make +- # sure we'll catch it if its added later in this transaction ++ # Otherwise we hook into tsInfo.add to make sure ++ # we'll catch it if it's added later in this transaction + pkgs = self.pkgSack.searchNevra(name=condreq) + if pkgs: + if self.arch.multilib: +diff --git a/yum/config.py b/yum/config.py +index e51e46f..d869a26 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -87,7 +87,7 @@ class Option(object): + @param value: The value to set the option to. + @return: Nothing. + ''' +- # Only try to parse if its a string ++ # Only try to parse if it's a string + if isinstance(value, basestring): + try: + value = self.parse(value) +diff --git a/yum/pgpmsg.py b/yum/pgpmsg.py +index 454768a..bd52cda 100644 +--- a/yum/pgpmsg.py ++++ b/yum/pgpmsg.py +@@ -302,7 +302,7 @@ REVOKE_KEY_CLASS_SENS = 0x40 # sensitive + PGP_FEATURE_1_MOD_DETECT = 0x01 # Modification detection + + pgp_feature_to_str = { +- PGP_FEATURE_1_MOD_DETECT : 'Modification Detectiobn' ++ PGP_FEATURE_1_MOD_DETECT : 'Modification Detection' + } + + def get_whole_number(msg, idx, numlen) : +@@ -785,7 +785,7 @@ class signature(pgp_packet) : + if revoke_reason_to_str.has_key(sp[1]) : + reas = revoke_reason_to_str[sp[1]] + return 'reason for revocation: %s, %s' % (reas, sp[2]) +- if sp[0] == SIG_SUB_TYPE_FEATURES : # featues ++ if sp[0] == SIG_SUB_TYPE_FEATURES : # features + features = [] + if len(sp) > 1 : + val = sp[1] +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index d387c76..5887cb7 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -1196,7 +1196,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + return result + + if not misc.re_primary_filename(name): +- # if its not in the primary.xml files ++ # If it is not in the primary.xml files + # search the files.xml file info + for pkg in self.searchFiles(name, strict=True): + result[pkg] = [(name, None, None)] +@@ -1317,7 +1317,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + # If it is a filename, search the primary.xml file info + results.extend(self._search_primary_files(n)) + +- # if its in the primary.xml files then skip the other check ++ # If it is in the primary.xml files then skip the other check + if misc.re_primary_filename(n) and not glob: + return misc.unique(results) + +-- +1.7.0.1 + + +From 0e58f4bbafd9e1701a33e3805015d647565239c4 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 9 Apr 2010 00:09:51 -0400 +Subject: [PATCH 42] Cleanup the docs for re_primary_*() to make them less confusing + +--- + yum/misc.py | 9 ++++----- + yum/packages.py | 2 +- + 2 files changed, 5 insertions(+), 6 deletions(-) + +diff --git a/yum/misc.py b/yum/misc.py +index 66b0653..faccf5f 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -98,17 +98,16 @@ def re_filename(s): + def re_primary_filename(filename): + """ Tests if a filename string, can be matched against just primary. + Note that this can produce false negatives (but not false +- positives). """ +- if 'bin/' in filename: +- return True +- if filename.startswith('/etc/'): ++ positives). Note that this is a superset of re_primary_dirname(). """ ++ if re_primary_dirname(filename): + return True + if filename == '/usr/lib/sendmail': + return True + return False + + def re_primary_dirname(dirname): +- """ Tests if a dirname string, can be matched against just primary. """ ++ """ Tests if a dirname string, can be matched against just primary. Note ++ that this is a subset of re_primary_filename(). """ + if 'bin/' in dirname: + return True + if dirname.startswith('/etc/'): +diff --git a/yum/packages.py b/yum/packages.py +index f4a00eb..427893b 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -467,7 +467,7 @@ class RpmBase(object): + return True + + if reqtuple[0].startswith('/'): +- if misc.re_primary_filename(reqtuple[0]) or misc.re_primary_dirname(reqtuple[0]): ++ if misc.re_primary_filename(reqtuple[0]): + pri_only = True + else: + pri_only = False +-- +1.7.0.1 + + +From 1b6b585eab225209cfbfdc156eeb27197dfecedc Mon Sep 17 00:00:00 2001 +From: skvidal +Date: Fri, 9 Apr 2010 14:06:19 +0000 +Subject: [PATCH 43] l10n: Updates to Russian (ru) translation + +Transmitted-via: Transifex (www.transifex.net) +--- + po/ru.po | 343 +++++++++++++++++++------------------------------------------- + 1 files changed, 102 insertions(+), 241 deletions(-) + +diff --git a/po/ru.po b/po/ru.po +index 47cd5ba..ad4391c 100644 +--- a/po/ru.po ++++ b/po/ru.po +@@ -1,7 +1,7 @@ + # Russian translation of yum. + # Copyright (C) 2010 yum's COPYRIGHT HOLDER + # This file is distributed under the same license as the yum package. +-# ++# + # Vladimir Bormotov , 2002 + # Grigory Bakunov , 2002, 2003 + # Timur Malikin , 2010 +@@ -19,53 +19,34 @@ msgstr "" + "Content-Transfer-Encoding: 8bit\n" + "Generated-By: pygettext.py 1.1\n" + +-#: ../callback.py:48 +-#: ../output.py:947 +-#: ../yum/rpmtrans.py:72 ++#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 + msgid "Updating" + msgstr "Обновление" + +-#: ../callback.py:49 +-#: ../yum/rpmtrans.py:73 ++#: ../callback.py:49 ../yum/rpmtrans.py:73 + msgid "Erasing" + msgstr "Удаление" + +-#: ../callback.py:50 +-#: ../callback.py:51 +-#: ../callback.py:53 +-#: ../output.py:946 +-#: ../output.py:1659 +-#: ../yum/rpmtrans.py:74 +-#: ../yum/rpmtrans.py:75 ++#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 ++#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 + #: ../yum/rpmtrans.py:77 + msgid "Installing" + msgstr "Установка" + +-#: ../callback.py:52 +-#: ../callback.py:58 +-#: ../output.py:1484 +-#: ../yum/rpmtrans.py:76 ++#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 + msgid "Obsoleted" + msgstr "Исключено" + +-#: ../callback.py:54 +-#: ../output.py:1070 +-#: ../output.py:1442 +-#: ../output.py:1491 ++#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 + msgid "Updated" + msgstr "Обновлено" + +-#: ../callback.py:55 +-#: ../output.py:1438 ++#: ../callback.py:55 ../output.py:1438 + msgid "Erased" + msgstr "Удалено" + +-#: ../callback.py:56 +-#: ../callback.py:57 +-#: ../callback.py:59 +-#: ../output.py:1068 +-#: ../output.py:1434 +-#: ../output.py:1646 ++#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 ++#: ../output.py:1434 ../output.py:1646 + msgid "Installed" + msgstr "Установлено" + +@@ -87,14 +68,11 @@ msgstr "Ошибка: неверный выходной статус: %s для + msgid "Erased: %s" + msgstr "Удалено: %s" + +-#: ../callback.py:217 +-#: ../output.py:948 +-#: ../output.py:1648 ++#: ../callback.py:217 ../output.py:948 ../output.py:1648 + msgid "Removing" + msgstr "Удаление" + +-#: ../callback.py:219 +-#: ../yum/rpmtrans.py:78 ++#: ../callback.py:219 ../yum/rpmtrans.py:78 + msgid "Cleanup" + msgstr "Очистка" + +@@ -111,15 +89,12 @@ msgstr "Настройка репозиториев" + msgid "Reading repository metadata in from local files" + msgstr "Чтение локальных метаданных для репозиториев" + +-#: ../cli.py:194 +-#: ../utils.py:193 ++#: ../cli.py:194 ../utils.py:193 + #, python-format + msgid "Config Error: %s" + msgstr "Ошибка конфигурации: %s" + +-#: ../cli.py:197 +-#: ../cli.py:1272 +-#: ../utils.py:196 ++#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 + #, python-format + msgid "Options Error: %s" + msgstr "Ошибка опции: %s" +@@ -183,18 +158,15 @@ msgstr "Загрузка пакетов:" + msgid "Error Downloading Packages:\n" + msgstr "Ошибка загрузки пакетов:\n" + +-#: ../cli.py:426 +-#: ../yum/__init__.py:4195 ++#: ../cli.py:426 ../yum/__init__.py:4195 + msgid "Running rpm_check_debug" + msgstr "Запуск rpm_check_debug" + +-#: ../cli.py:435 +-#: ../yum/__init__.py:4204 ++#: ../cli.py:435 ../yum/__init__.py:4204 + msgid "ERROR You need to update rpm to handle:" + msgstr "ОШИБКА Вам необходимо обновить пакет вручную" + +-#: ../cli.py:437 +-#: ../yum/__init__.py:4207 ++#: ../cli.py:437 ../yum/__init__.py:4207 + msgid "ERROR with rpm_check_debug vs depsolve:" + msgstr "ОШИБКА rpm_check_debug и разрешение зависимостей:" + +@@ -231,33 +203,25 @@ msgstr "" + "Отмена автоматического импорта ключей во время запуска без контроля.\n" + "Используйте \"-y\" для игнорирования." + +-#: ../cli.py:544 +-#: ../cli.py:578 ++#: ../cli.py:544 ../cli.py:578 + msgid " * Maybe you meant: " + msgstr "* Возможно вы имели в виду:" + +-#: ../cli.py:561 +-#: ../cli.py:569 ++#: ../cli.py:561 ../cli.py:569 + #, python-format + msgid "Package(s) %s%s%s available, but not installed." + msgstr "Пакет(ы) %s%s%s доступны, но не установлены." + +-#: ../cli.py:575 +-#: ../cli.py:607 +-#: ../cli.py:687 ++#: ../cli.py:575 ../cli.py:607 ../cli.py:687 + #, python-format + msgid "No package %s%s%s available." + msgstr "Пакет %s%s%s недоступен." + +-#: ../cli.py:612 +-#: ../cli.py:748 ++#: ../cli.py:612 ../cli.py:748 + msgid "Package(s) to install" + msgstr "Пакет(ы) для установки" + +-#: ../cli.py:613 +-#: ../cli.py:693 +-#: ../cli.py:727 +-#: ../cli.py:749 ++#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 + #: ../yumcommands.py:160 + msgid "Nothing to do" + msgstr "Нечего выполнять" +@@ -375,10 +339,7 @@ msgstr "Доступные коллекции:" + msgid "Done" + msgstr "Выполнено" + +-#: ../cli.py:988 +-#: ../cli.py:1006 +-#: ../cli.py:1012 +-#: ../yum/__init__.py:2788 ++#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 + #, python-format + msgid "Warning: Group %s does not exist." + msgstr "Внимание: коллекции %s не существует." +@@ -392,8 +353,7 @@ msgstr "Во всех указанных коллекциях пакеты дл + msgid "%d Package(s) to Install" + msgstr "%d Пакет(ы) для установки" + +-#: ../cli.py:1028 +-#: ../yum/__init__.py:2800 ++#: ../cli.py:1028 ../yum/__init__.py:2800 + #, python-format + msgid "No group named %s exists" + msgstr "Коллекции с названием %s не существует" +@@ -674,7 +634,7 @@ msgstr "Ссылка: %s" + + #: ../output.py:553 + msgid "License : " +-msgstr "Лицензия : %s" ++msgstr "Лицензия : " + + #: ../output.py:554 + msgid "Description: " +@@ -824,8 +784,7 @@ msgstr "Обновление зависимостей" + msgid "Removing for dependencies" + msgstr "Удаление зависимостей" + +-#: ../output.py:960 +-#: ../output.py:1072 ++#: ../output.py:960 ../output.py:1072 + msgid "Skipped (dependency problems)" + msgstr "Пропущено (ошибка зависимостей)" + +@@ -977,8 +936,7 @@ msgstr "Передан(ы) неверный код действий или па + msgid "ID" + msgstr "ID" + +-#: ../output.py:1267 +-#: ../output.py:1520 ++#: ../output.py:1267 ../output.py:1520 + msgid "Login user" + msgstr "Вход пользователя" + +@@ -986,13 +944,11 @@ msgstr "Вход пользователя" + msgid "Date and time" + msgstr "Дата и время" + +-#: ../output.py:1269 +-#: ../output.py:1522 ++#: ../output.py:1269 ../output.py:1522 + msgid "Action(s)" + msgstr "Действия" + +-#: ../output.py:1270 +-#: ../output.py:1523 ++#: ../output.py:1270 ../output.py:1523 + msgid "Altered" + msgstr "Изменено" + +@@ -1024,8 +980,7 @@ msgstr "Код операции:" + msgid "Begin time :" + msgstr "Время начала:" + +-#: ../output.py:1401 +-#: ../output.py:1403 ++#: ../output.py:1401 ../output.py:1403 + msgid "Begin rpmdb :" + msgstr "Начало базы данных RPM:" + +@@ -1038,8 +993,7 @@ msgstr "(%s секунд)" + msgid "End time :" + msgstr "Конечное время:" + +-#: ../output.py:1421 +-#: ../output.py:1423 ++#: ../output.py:1421 ../output.py:1423 + msgid "End rpmdb :" + msgstr "Конец базы данных RPM:" + +@@ -1047,9 +1001,7 @@ msgstr "Конец базы данных RPM:" + msgid "User :" + msgstr "Пользователь:" + +-#: ../output.py:1426 +-#: ../output.py:1428 +-#: ../output.py:1430 ++#: ../output.py:1426 ../output.py:1428 ../output.py:1430 + msgid "Return-Code :" + msgstr "Код возврата:" + +@@ -1069,8 +1021,7 @@ msgstr "Успешно" + msgid "Transaction performed with:" + msgstr "Действие выполнено:" + +-#: ../output.py:1444 +-#: ../output.py:1489 ++#: ../output.py:1444 ../output.py:1489 + msgid "Downgraded" + msgstr "Откат версии" + +@@ -1091,8 +1042,7 @@ msgstr "Вывод сценария:" + msgid "Errors:" + msgstr "Ошибки:" + +-#: ../output.py:1481 +-#: ../output.py:1482 ++#: ../output.py:1481 ../output.py:1482 + msgid "Install" + msgstr "Установка " + +@@ -1186,8 +1136,7 @@ msgstr "--> Перепроверка зависимостей с новыми п + msgid "--> Finished Dependency Resolution" + msgstr "--> Проверка зависимостей окончена" + +-#: ../output.py:1614 +-#: ../output.py:1619 ++#: ../output.py:1614 ../output.py:1619 + #, python-format + msgid "--> Processing Dependency: %s for package: %s" + msgstr "--> Обработка зависимостей: %s для пакета: %s" +@@ -1211,8 +1160,7 @@ msgstr "" + "\n" + " Необходимо: %s" + +-#: ../output.py:1649 +-#: ../output.py:1660 ++#: ../output.py:1649 ../output.py:1660 + #, python-format + msgid "" + "\n" +@@ -1225,8 +1173,7 @@ msgstr "" + msgid "Available" + msgstr "Доступно" + +-#: ../output.py:1665 +-#: ../output.py:1670 ++#: ../output.py:1665 ../output.py:1670 + #, python-format + msgid "--> Processing Conflict: %s conflicts %s" + msgstr "--> Обработка конфликта: %s конфликтует с %s" +@@ -1260,8 +1207,7 @@ msgstr "Зомби" + msgid "Traced/Stopped" + msgstr "Трассировано/Остановлено" + +-#: ../utils.py:98 +-#: ../yumcommands.py:917 ++#: ../utils.py:98 ../yumcommands.py:917 + msgid "Unknown" + msgstr "Неизвестно" + +@@ -1299,8 +1245,7 @@ msgstr "Ошибка PluginExit: %s" + msgid "Yum Error: %s" + msgstr "Ошибка Yum: %s" + +-#: ../utils.py:235 +-#: ../yummain.py:42 ++#: ../utils.py:235 ../yummain.py:42 + msgid "" + "\n" + "\n" +@@ -1310,8 +1255,7 @@ msgstr "" + "\n" + "Выход по запросу пользователя" + +-#: ../utils.py:241 +-#: ../yummain.py:48 ++#: ../utils.py:241 ../yummain.py:48 + msgid "" + "\n" + "\n" +@@ -1321,8 +1265,7 @@ msgstr "" + "\n" + "Выход из-за разрыва связи" + +-#: ../utils.py:243 +-#: ../yummain.py:50 ++#: ../utils.py:243 ../yummain.py:50 + #, python-format + msgid "" + "\n" +@@ -1333,8 +1276,7 @@ msgstr "" + "\n" + "%s" + +-#: ../utils.py:282 +-#: ../yummain.py:211 ++#: ../utils.py:282 ../yummain.py:211 + msgid "Complete!" + msgstr "Готово!" + +@@ -1458,9 +1400,7 @@ msgid "Updated Packages" + msgstr "Обновленные пакеты" + + #. This only happens in verbose mode +-#: ../yumcommands.py:317 +-#: ../yumcommands.py:324 +-#: ../yumcommands.py:601 ++#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 + msgid "Obsoleting Packages" + msgstr "Исключенные пакеты" + +@@ -1588,13 +1528,11 @@ msgstr "Поиск зависимостей:" + msgid "Display the configured software repositories" + msgstr "Отобразить сконфигурированные репозитории ПО" + +-#: ../yumcommands.py:822 +-#: ../yumcommands.py:823 ++#: ../yumcommands.py:822 ../yumcommands.py:823 + msgid "enabled" + msgstr "включено" + +-#: ../yumcommands.py:849 +-#: ../yumcommands.py:850 ++#: ../yumcommands.py:849 ../yumcommands.py:850 + msgid "disabled" + msgstr "отключено" + +@@ -1683,14 +1621,11 @@ msgstr "Исключено из репозитория:" + + #. Work out the first (id) and last (enabled/disalbed/count), + #. then chop the middle (name)... +-#: ../yumcommands.py:951 +-#: ../yumcommands.py:980 ++#: ../yumcommands.py:951 ../yumcommands.py:980 + msgid "repo id" + msgstr "Идентификатор репозитория" + +-#: ../yumcommands.py:968 +-#: ../yumcommands.py:969 +-#: ../yumcommands.py:987 ++#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 + msgid "status" + msgstr "состояние" + +@@ -1792,14 +1727,12 @@ msgstr "Проверка проблем в базе данных RPM" + msgid "Another app is currently holding the yum lock; waiting for it to exit..." + msgstr "Еще одно приложение, в настоящее время блокирует Yum. Подождите..." + +-#: ../yummain.py:130 +-#: ../yummain.py:169 ++#: ../yummain.py:130 ../yummain.py:169 + #, python-format + msgid "Error: %s" + msgstr "Ошибка: %s" + +-#: ../yummain.py:140 +-#: ../yummain.py:182 ++#: ../yummain.py:140 ../yummain.py:182 + #, python-format + msgid "Unknown Error(s): Exit Code: %d:" + msgstr "Неизвестная ошибка(ошибки): Код выхода:%d:" +@@ -1813,8 +1746,7 @@ msgstr "Разрешение зависимостей" + msgid " You could try using --skip-broken to work around the problem" + msgstr " Вы можете попробовать --skip-broken чтобы обойти проблему." + +-#: ../yummain.py:175 +-#: ../yummain.py:208 ++#: ../yummain.py:175 ../yummain.py:208 + msgid " You could try running: rpm -Va --nofiles --nodigest" + msgstr " Вы можете попробовать запустить: rpm -Va --nofiles --nodigest" + +@@ -1869,8 +1801,7 @@ msgstr "%s подходит как требуемый для %s" + msgid "Member: %s" + msgstr "Член: %s" + +-#: ../yum/depsolve.py:239 +-#: ../yum/depsolve.py:754 ++#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 + #, python-format + msgid "%s converted to install" + msgstr "%s преобразован для установки" +@@ -1975,13 +1906,11 @@ msgstr "TSINFO: %s отмечен как обновление для %s" + msgid "TSINFO: Marking %s as install for %s" + msgstr "TSINFO: Отмечен %s чтобы установить %s" + +-#: ../yum/depsolve.py:690 +-#: ../yum/depsolve.py:781 ++#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 + msgid "Success - empty transaction" + msgstr "Успешно — холостое задание" + +-#: ../yum/depsolve.py:729 +-#: ../yum/depsolve.py:744 ++#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 + msgid "Restarting Loop" + msgstr "Перезапуск петли" + +@@ -2013,8 +1942,7 @@ msgstr "поиск %s требуется для %s" + msgid "Running compare_providers() for %s" + msgstr "Запуск compare_providers() для %s" + +-#: ../yum/depsolve.py:1117 +-#: ../yum/depsolve.py:1123 ++#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 + #, python-format + msgid "better arch in po %s" + msgstr "Лучший архив в %s" +@@ -2246,8 +2174,7 @@ msgstr "Пакет не совпадает с контрольной суммо + msgid "package fails checksum but caching is enabled for %s" + msgstr "проверка контрольной суммы неудачна, но кэширование включено для %s" + +-#: ../yum/__init__.py:1534 +-#: ../yum/__init__.py:1563 ++#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 + #, python-format + msgid "using local copy of %s" + msgstr "использование локальной копии %s" +@@ -2358,19 +2285,14 @@ msgstr "Результат совпадений: %s" + msgid "No group data available for configured repositories" + msgstr "Для настроеных репозиториев данных коллекций нет" + +-#: ../yum/__init__.py:2355 +-#: ../yum/__init__.py:2374 +-#: ../yum/__init__.py:2405 +-#: ../yum/__init__.py:2411 +-#: ../yum/__init__.py:2493 +-#: ../yum/__init__.py:2497 ++#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 ++#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 + #: ../yum/__init__.py:2814 + #, python-format + msgid "No Group named %s exists" + msgstr "Коллекции с названием %s не существует" + +-#: ../yum/__init__.py:2386 +-#: ../yum/__init__.py:2513 ++#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 + #, python-format + msgid "package %s was not marked in group %s" + msgstr "пакет %s не отмечен в коллекции %s" +@@ -2395,13 +2317,11 @@ msgstr "Кортеж пакетов %s не найден в наборе пак + msgid "Package tuple %s could not be found in rpmdb" + msgstr "Кортеж пакетов %s не найден в базе RPM" + +-#: ../yum/__init__.py:2614 +-#: ../yum/__init__.py:2664 ++#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 + msgid "Invalid version flag" + msgstr "Hеверная версия флага %s" + +-#: ../yum/__init__.py:2634 +-#: ../yum/__init__.py:2639 ++#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 + #, python-format + msgid "No Package found for %s" + msgstr "Пакет %s не найден" +@@ -2414,15 +2334,12 @@ msgstr "Объект пакета не являлся экземпляром о + msgid "Nothing specified to install" + msgstr "Ничего не отмечено для установки" + +-#: ../yum/__init__.py:2875 +-#: ../yum/__init__.py:3652 ++#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 + #, python-format + msgid "Checking for virtual provide or file-provide for %s" + msgstr "Проверка виртуального провайдера или файлового провайдера для %s" + +-#: ../yum/__init__.py:2881 +-#: ../yum/__init__.py:3197 +-#: ../yum/__init__.py:3365 ++#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 + #: ../yum/__init__.py:3658 + #, python-format + msgid "No Match for argument: %s" +@@ -2467,16 +2384,13 @@ msgstr "Пакет %s уже установлен.Проверка для обн + msgid "Updating Everything" + msgstr "Полное обновление" + +-#: ../yum/__init__.py:3147 +-#: ../yum/__init__.py:3262 +-#: ../yum/__init__.py:3289 ++#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 + #: ../yum/__init__.py:3315 + #, python-format + msgid "Not Updating Package that is already obsoleted: %s.%s %s:%s-%s" + msgstr "Устаревший и уже необновляемый пакет: %s.%s %s:%s-%s" + +-#: ../yum/__init__.py:3182 +-#: ../yum/__init__.py:3362 ++#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 + #, python-format + msgid "%s" + msgstr "%s" +@@ -2491,8 +2405,7 @@ msgstr "Пакет уже недействителен:%s.%s %s:%s-%s" + msgid "Not Updating Package that is obsoleted: %s" + msgstr "Устаревший необновляемый пакет: %s" + +-#: ../yum/__init__.py:3293 +-#: ../yum/__init__.py:3319 ++#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 + #, python-format + msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s" + msgstr "Необновленный пакет, который был обновлен ранее: %s.%s %s:%s-%s" +@@ -2506,16 +2419,12 @@ msgstr "Нет пакетов для удаления" + msgid "Cannot open: %s. Skipping." + msgstr "Невозможно открыть: %s. Пропуск." + +-#: ../yum/__init__.py:3415 +-#: ../yum/__init__.py:3514 +-#: ../yum/__init__.py:3598 ++#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 + #, python-format + msgid "Examining %s: %s" + msgstr "Проверка %s: %s" + +-#: ../yum/__init__.py:3423 +-#: ../yum/__init__.py:3517 +-#: ../yum/__init__.py:3601 ++#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 + #, python-format + msgid "Cannot add package %s to transaction. Not a compatible architecture: %s" + msgstr "Невозможно добавить пакет %s в список действий. Несовместимая архитектура: %s" +@@ -2525,9 +2434,7 @@ msgstr "Невозможно добавить пакет %s в список де + msgid "Package %s not installed, cannot update it. Run yum install to install it instead." + msgstr "Пакет %s не установлен, невозможно обновить его. Запустите yum для установки заместо обновления." + +-#: ../yum/__init__.py:3460 +-#: ../yum/__init__.py:3522 +-#: ../yum/__init__.py:3606 ++#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 + #, python-format + msgid "Excluding %s" + msgstr "Удаление %s" +@@ -2547,8 +2454,7 @@ msgstr "%s отмечен как обновление для %s" + msgid "%s: does not update installed package." + msgstr "%s: не обновляет установленный пакет" + +-#: ../yum/__init__.py:3511 +-#: ../yum/__init__.py:3595 ++#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 + #, python-format + msgid "Cannot open file: %s. Skipping." + msgstr "Невозможно открыть файл %s. Пропуск." +@@ -2557,8 +2463,7 @@ msgstr "Невозможно открыть файл %s. Пропуск." + msgid "Problem in reinstall: no package matched to remove" + msgstr "Проблема при переустановке: не найден пакет для удаления" + +-#: ../yum/__init__.py:3554 +-#: ../yum/__init__.py:3686 ++#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 + #, python-format + msgid "Package %s is allowed multiple installs, skipping" + msgstr "Пакет %s может быть повторно установлен, пропуск" +@@ -2582,8 +2487,7 @@ msgstr "Пакеты недоступны: %s" + msgid "Only Upgrade available on package: %s" + msgstr "Только переход к следующей версии доступен для пакета: : %s" + +-#: ../yum/__init__.py:3808 +-#: ../yum/__init__.py:3845 ++#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 + #, python-format + msgid "Failed to downgrade: %s" + msgstr "Ошибка отката версии: %s" +@@ -2613,8 +2517,7 @@ msgid "GPG key at %s (0x%s) is already installed" + msgstr "GPG ключ %s (0x%s) уже установлен" + + #. Try installing/updating GPG key +-#: ../yum/__init__.py:3949 +-#: ../yum/__init__.py:4011 ++#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 + #, python-format + msgid "Importing GPG key 0x%s \"%s\" from %s" + msgstr "Импорт GPG ключа 0x%s \"%s\" из %s" +@@ -2628,13 +2531,11 @@ msgstr "Не установлен ключ" + msgid "Key import failed (code %d)" + msgstr "Неудача импорта ключа (code %d)" + +-#: ../yum/__init__.py:3973 +-#: ../yum/__init__.py:4032 ++#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 + msgid "Key imported successfully" + msgstr "Импорт ключа успешно завершен" + +-#: ../yum/__init__.py:3978 +-#: ../yum/__init__.py:4037 ++#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 + #, python-format + msgid "" + "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" +@@ -2688,8 +2589,7 @@ msgstr "Невозможно задать кэш-папку: %s" + msgid "Loaded plugins: " + msgstr "Загружены модули:" + +-#: ../yum/plugins.py:216 +-#: ../yum/plugins.py:222 ++#: ../yum/plugins.py:216 ../yum/plugins.py:222 + #, python-format + msgid "No plugin match for: %s" + msgstr "Нет модуля: %s" +@@ -2776,10 +2676,8 @@ msgstr "Невозможно открыть базу RPM для чтения. В + msgid "Got an empty Header, something has gone wrong" + msgstr "Получен пустой заголовок, что-то не так" + +-#: ../rpmUtils/oldUtils.py:253 +-#: ../rpmUtils/oldUtils.py:260 +-#: ../rpmUtils/oldUtils.py:263 +-#: ../rpmUtils/oldUtils.py:266 ++#: ../rpmUtils/oldUtils.py:253 ../rpmUtils/oldUtils.py:260 ++#: ../rpmUtils/oldUtils.py:263 ../rpmUtils/oldUtils.py:266 + #, python-format + msgid "Damaged Header %s" + msgstr "Поврежденный заголовок %s" +@@ -2789,27 +2687,21 @@ msgstr "Поврежденный заголовок %s" + msgid "Error opening rpm %s - error %s" + msgstr "Невозможно открыть пакет %s — ошибка %s" + +-#, fuzzy + #~ msgid "Parsing package install arguments" + #~ msgstr "Ошибка при разборе параметров командной строки: %s" + +-#, fuzzy + #~ msgid "Reducing %s to included packages only" + #~ msgstr "Поиск устаревших пакетов" + +-#, fuzzy + #~ msgid "Keeping included package %s" + #~ msgstr "Поиск обновленных пакетов" + +-#, fuzzy + #~ msgid "Removing unmatched package %s" + #~ msgstr "Поиск обновленных пакетов" + +-#, fuzzy #~ msgid "Package %s conflicts with %s." - #~ msgstr "O pacote %s conflita com %s." -+ - #~ msgid "Running \"%s\" handler for \"%s\" plugin" - #~ msgstr "Executando o manipulador \"%s\" para o plugin \"%s\"" -+ - #~ msgid "Directory of rpms must exist" - #~ msgstr "O diretório de rpms precisa existir" -+ - #~ msgid "Error accessing URL: %s" - #~ msgstr "Erro ao acessar a URL: %s" -+ - #~ msgid "No Packages installed not included in a repository" - #~ msgstr "Nenhum pacote instalado não incluído em um repositório" -+ + #~ msgstr "зависимости: пакет %s конфликтует с %s" + +-#, fuzzy #~ msgid "" - #~ "\n" - #~ " Total: %d\n" -@@ -2694,10 +2890,13 @@ msgstr "Erro ao abrir o rpm %s - erro %s" - #~ " Total: %d\n" - #~ " Usado: %d\n" - #~ " Src: %d" -+ + #~ "Description:\n" + #~ "%s" +@@ -2838,8 +2730,7 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ " SRC: %d" + #~ msgid "Error restoring the backup of lilo.conf The backup was:\n" - #~ msgstr "Erro ao restaurar o backup do lilo.conf. O backup era:\n" -+ +-#~ msgstr "" +-#~ "Ошибка восстановления резервной копии lilo.conf. Резервная копия была:\n" ++#~ msgstr "Ошибка восстановления резервной копии lilo.conf. Резервная копия была:\n" + #~ msgid "Looking in available packages for a providing package" - #~ msgstr "Procurando pelo pacote fornecido nos pacotes disponíveis" -+ - #~ msgid "" - #~ "retrygrab() failed for:\n" - #~ " %s%s\n" -@@ -2706,12 +2905,16 @@ msgstr "Erro ao abrir o rpm %s - erro %s" - #~ "retrygrab() falhou para:\n" - #~ " %s%s\n" - #~ " Executando método de recuperação" -+ - #~ msgid "I will install/upgrade these to satisfy the dependencies:" - #~ msgstr "Eu irei instalar/atualizar isto para satisfazer as dependências:" -+ - #~ msgid "Cannot delete %s - check perms" - #~ msgstr "Não foi possível remover %s - verifique as permissões" -+ - #~ msgid "Need a provides to match" - #~ msgstr "É necessário fornecer uma informação para corresponder" -+ - #~ msgid "" - #~ "lilo options that are not supported by yum are used in the default lilo." - #~ "conf. This file will not be modified. The options include:\n" -@@ -2719,10 +2922,13 @@ msgstr "Erro ao abrir o rpm %s - erro %s" - #~ "opções do lilo que não são suportadas pelo yum estão sendo utilizadas no " - #~ "arquivo lilo.conf padrão. Este arquivo não será modificado. Dentre as " - #~ "opções estão:\n" -+ + #~ msgstr "Просмотр доступных пакетов предоставляющих пакет" +@@ -2853,12 +2744,8 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgid "Need a provides to match" + #~ msgstr "Необходим еще один параметр" + +-#~ msgid "" +-#~ "lilo options that are not supported by yum are used in the default lilo." +-#~ "conf. This file will not be modified. The options include:\n" +-#~ msgstr "" +-#~ "параметры lilo не поддерживаются yum. Будет использованы параметры из " +-#~ "lilo.conf. Файл lilo.conf останется неизмеренным. Параметры включают:\n" ++#~ msgid "lilo options that are not supported by yum are used in the default lilo.conf. This file will not be modified. The options include:\n" ++#~ msgstr "параметры lilo не поддерживаются yum. Будет использованы параметры из lilo.conf. Файл lilo.conf останется неизмеренным. Параметры включают:\n" + #~ msgid "Error getting file %s" - #~ msgstr "Erro ao obter arquivo %s" -+ - #~ msgid "%s is not writable" - #~ msgstr "%s não é gravável" -+ + #~ msgstr "Ошибка получения файла: %s" +@@ -2911,8 +2798,7 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgid "Cleaning packages and old headers" + #~ msgstr "Удаление пакетов и старых заголовков" + +-#~ msgid "" +-#~ "Cannot download %s in caching only mode or when running as non-root user." ++#~ msgid "Cannot download %s in caching only mode or when running as non-root user." + #~ msgstr "Невозможно получить %s используя кэш или не от пользователя root." + + #~ msgid "" +@@ -3019,18 +2905,14 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgid "Putting back old headers" + #~ msgstr "Возврат старых заголовков" + +-#~ msgid "" +-#~ "Error: You may need to disable gpg checking to install this package\n" +-#~ msgstr "" +-#~ "Ошибка: Возможно необходимо отключить проверку GPG для установки пакета\n" ++#~ msgid "Error: You may need to disable gpg checking to install this package\n" ++#~ msgstr "Ошибка: Возможно необходимо отключить проверку GPG для установки пакета\n" + + #~ msgid "Options Error: no commands found" + #~ msgstr "Ошибка опций: команда не найдена" + + #~ msgid "You appear to have insufficient disk space to handle these packages" +-#~ msgstr "" +-#~ "Не найдено достаточно дискового пространства для выполнения действий над " +-#~ "пакетами" ++#~ msgstr "Не найдено достаточно дискового пространства для выполнения действий над пакетами" + + #~ msgid "Unable to run grubby correctly: the message was:\n" + #~ msgstr "Hевозможно запустить grubby:\n" +@@ -3051,20 +2933,15 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgstr "Необходимо указать список пакетов для установки" + + #~ msgid "using ftp, http[s], removable or file for servers, Aborting - %s" +-#~ msgstr "" +-#~ "Используйте только протоколы ftp, http[s], removable или file. Завершение " +-#~ "работы - %s" ++#~ msgstr "Используйте только протоколы ftp, http[s], removable или file. Завершение работы - %s" + + #~ msgid "Insufficient server config - no servers found. Aborting." +-#~ msgstr "" +-#~ "Не найден файл настроек сервера - репозиторий не найден. Завершение." ++#~ msgstr "Не найден файл настроек сервера - репозиторий не найден. Завершение." + #~ msgid "" #~ "\n" - #~ "Already found tuple: %s %s:\n" -@@ -2731,86 +2937,117 @@ msgstr "Erro ao abrir o rpm %s - erro %s" +-#~ " Usage: yum [options] \n" + #~ " \n" + #~ " Options:\n" +@@ -3073,8 +2950,7 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ " -d [debug level] - set the debugging level\n" + #~ " -y answer yes to all questions\n" + #~ " -t be tolerant about errors in package commands\n" +-#~ " -R [time in minutes] - set the max amount of time to randomly " +-#~ "run in.\n" ++#~ " -R [time in minutes] - set the max amount of time to randomly run in.\n" + #~ " -C run from cache only - do not update the cache\n" + #~ " --installroot=[path] - set the install root (default '/')\n" + #~ " --version - output the version of yum\n" +@@ -3082,10 +2958,8 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ " " + #~ msgstr "" #~ "\n" - #~ "Tupla já encontrada: %s %s:\n" - #~ "%s " +-#~ " Usage: yum [options] \n" + #~ " \n" + #~ " Options:\n" +@@ -3096,8 +2970,7 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ " -t пропускать ошибки при установке пакетов\n" + #~ " -R [time in minutes] - установить время случайной задержки\n" + #~ " -C работать только с кэшем, не обновляя его\n" +-#~ " --installroot=[path] - установить install root (по умолчанию " +-#~ "'/')\n" ++#~ " --installroot=[path] - установить install root (по умолчанию '/')\n" + #~ " --version - показать версию yum\n" + #~ " -h, --help - показать это сообщение\n" + #~ " " +@@ -3134,8 +3007,7 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgstr "Ошибка установки нового загрузчика: \n" + + #~ msgid "Error: Could not find the GPG Key necessary to validate pkg %s" +-#~ msgstr "" +-#~ "Ошибка: Невозможно найти GPG ключ необходимый для проверки пакета %s" ++#~ msgstr "Ошибка: Невозможно найти GPG ключ необходимый для проверки пакета %s" + + #~ msgid "No actions to take" + #~ msgstr "Hикаких действий не нужно" +@@ -3156,8 +3028,7 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgstr " " + + #~ msgid "Error: Cannot find baseurl or name for server '%s'. Skipping" +-#~ msgstr "" +-#~ "Ошибка: Невозможно определить URL или имя для сервера '%s'. Пропущено" ++#~ msgstr "Ошибка: Невозможно определить URL или имя для сервера '%s'. Пропущено" + + #~ msgid "Odd header %s suddenly disappeared" + #~ msgstr "Непарный заголовок %s внезапно исчез" +@@ -3180,12 +3051,8 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgid "Exiting." + #~ msgstr "Завершение." + +-#~ msgid "" +-#~ "asking for package %s.%s - does not exist in nevral - bailing out - check " +-#~ "rpmdb for errors" +-#~ msgstr "" +-#~ "Запрос на пакет %s.%s - не существует в nevral - выкинут - проверьте " +-#~ "ошибки в rpmdb" ++#~ msgid "asking for package %s.%s - does not exist in nevral - bailing out - check rpmdb for errors" ++#~ msgstr "Запрос на пакет %s.%s - не существует в nevral - выкинут - проверьте ошибки в rpmdb" + + #~ msgid "Lilo found - adding kernel to lilo and making it the default" + #~ msgstr "Найден Lilo - новое ядро будет загружено по умолчанию" +@@ -3204,8 +3071,7 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + + #~ msgid "" + #~ "Usage:\n" +-#~ "yum-arch [-v] [-z] [-l] [-c] [-n] [-d] [-q] [-vv] (path of dir where " +-#~ "headers/ should/does live)\n" ++#~ "yum-arch [-v] [-z] [-l] [-c] [-n] [-d] [-q] [-vv] (path of dir where headers/ should/does live)\n" + #~ " -d = check dependencies and conflicts in tree\n" + #~ " -v = more verbose output\n" + #~ " -vv = even more verbose output\n" +@@ -3222,10 +3088,8 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ " -v = выводить отладочную информацию\n" + #~ " -vv = еще больше отладочной информации\n" + #~ " -n = не создавать заголовков\n" +-#~ " -c = проверять пакеты с помощью gpg и md5 - невозможно " +-#~ "использовать с -n\n" +-#~ " -z = сжимать заголовки с помощью алгоритма gzip [по умолчанию " +-#~ "включено]\n" ++#~ " -c = проверять пакеты с помощью gpg и md5 - невозможно использовать с -n\n" ++#~ " -z = сжимать заголовки с помощью алгоритма gzip [по умолчанию включено]\n" + #~ " -s = создавать заголовки для src пакетов\n" + #~ " -l = разрешить использование символических ссылок\n" + #~ " -q = \"молчаливый\" режим" +@@ -3269,14 +3133,11 @@ msgstr "Невозможно открыть пакет %s — ошибка %s" + #~ msgid "Damaged RPM %s, removing." + #~ msgstr "Поврежденный пакет %s, удаление." + +-#~ msgid "" +-#~ "Bad Header for pkg %s.%s trying to get headers for the nevral - exiting" ++#~ msgid "Bad Header for pkg %s.%s trying to get headers for the nevral - exiting" + #~ msgstr "Поврежден заголовок пакет %s.%s завершает работу" + +-#~ msgid "" +-#~ "Error: You may also check that you have the correct GPG keys installed" +-#~ msgstr "" +-#~ "Ошибка: Необходимо убедиться в том что вы имеете подходящий gpg ключ" ++#~ msgid "Error: You may also check that you have the correct GPG keys installed" ++#~ msgstr "Ошибка: Необходимо убедиться в том что вы имеете подходящий gpg ключ" + + #~ msgid "Insert disk \"%s\" and press enter\n" + #~ msgstr "Вставьте диск \"%s\" и нажмите 'Enter'\n" +-- +1.7.0.1 + + +From 8d3f214597e03e5f4e30c877351cf4926a241627 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 9 Apr 2010 00:17:36 -0400 +Subject: [PATCH 44] Allow users to see just specific version groups + +--- + yumcommands.py | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/yumcommands.py b/yumcommands.py +index 88c047f..9bc06ad 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -1237,6 +1237,9 @@ class VersionCommand(YumCommand): + _append_repos(cols, data[1]) + if groups: + for grp in sorted(data[2]): ++ if (vcmd.startswith("group-") and ++ len(extcmds) > 1 and grp not in extcmds[1:]): ++ continue + cols.append(("%s %s" % (_("Group-Installed:"), grp), + str(data[2][grp]))) + _append_repos(cols, data[3][grp]) +@@ -1252,6 +1255,9 @@ class VersionCommand(YumCommand): + _append_repos(cols, data[1]) + if groups: + for grp in sorted(data[2]): ++ if (vcmd.startswith("group-") and ++ len(extcmds) > 1 and grp not in extcmds[1:]): ++ continue + cols.append(("%s %s" % (_("Group-Available:"), grp), + str(data[2][grp]))) + if verbose: +-- +1.7.0.1 + + +From 543344aa1346a5e3b37a6b813121f6078cfb9aa4 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 9 Apr 2010 15:59:07 -0400 +Subject: [PATCH 45] Add dynamic yumvars from the filesystem. + +--- + docs/yum.conf.5 | 12 ++++++++++++ + yum/config.py | 23 ++++++++++++++++++++++- + 2 files changed, 34 insertions(+), 1 deletions(-) + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index fe195af..54e7bf9 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -769,6 +769,18 @@ These will be replaced with the value of the shell environment variable of + the same name. If the shell environment variable does not exist then the + configuration file variable will not be replaced. + ++.LP ++As of 3.2.28, any file in //vars is turned into ++a variable named after the filename (or overrides any of the above varaibles). ++The obvious exception is that you cannot use these variables in the definition ++of persistdir itself. + - #~ msgid "errors found" - #~ msgstr "erros encontrados" ++Note that no warnings/errors are given if the files are unreadable, so creating ++files that only root can read may be confusing for users. + - #~ msgid "Unable to determine boot loader." - #~ msgstr "Não foi possível determinar o gerenciador de inicialização." ++Also note that all new line characters are removed, as a convienience, but no ++other checking is performed on the data. This means it's possible to have bad ++character data in baseurl etc. + + .SH "FILES" + .nf +diff --git a/yum/config.py b/yum/config.py +index d869a26..e13eb12 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -857,13 +857,15 @@ def readMainConfig(startupconf): + yumvars['arch'] = startupconf.arch + yumvars['releasever'] = startupconf.releasever + yumvars['uuid'] = startupconf.uuid ++ # Note: We don't setup the FS yumvars here, because we want to be able to ++ # use the core yumvars in persistdir. Which is the base of FS yumvars. + + # Read [main] section + yumconf = YumConf() + yumconf.populate(startupconf._parser, 'main') + + # Apply the installroot to directory options +- for option in ('cachedir', 'logfile', 'persistdir'): ++ def _apply_installroot(yumconf, option): + path = getattr(yumconf, option) + ir_path = yumconf.installroot + path + ir_path = ir_path.replace('//', '/') # os.path.normpath won't fix this and +@@ -871,6 +873,25 @@ def readMainConfig(startupconf): + ir_path = varReplace(ir_path, yumvars) + setattr(yumconf, option, ir_path) + ++ _apply_installroot(yumconf, 'persistdir') + - #~ msgid "getting %s" - #~ msgstr "obtendo %s" ++ # Read the FS yumvars ++ try: ++ dir_fsvars = yumconf.persistdir + "/vars/" ++ fsvars = os.listdir(dir_fsvars) ++ except OSError: ++ fsvars = [] ++ for fsvar in fsvars: ++ try: ++ val = open(dir_fsvars + fsvar).read().replace('\n', '') ++ except (OSError, IOError): ++ continue ++ yumvars[fsvar] = val + - #~ msgid "Error Reading Header on %s" - #~ msgstr "Erro ao Ler Cabeçalho em %s" ++ # These can use the above FS yumvars ++ for option in ('cachedir', 'logfile'): ++ _apply_installroot(yumconf, option) ++ + # Add in some extra attributes which aren't actually configuration values + yumconf.yumvar = yumvars + yumconf.uid = 0 +-- +1.7.0.1 + + +From d2638b9d8b360713f9739a88dfa03e1e3ffab28b Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 9 Apr 2010 16:14:27 -0400 +Subject: [PATCH 46] Remove bad assert: yum list blah\* + +--- + yum/sqlitesack.py | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 5887cb7..8a4ec8b 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -1599,7 +1599,6 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + for (pat, rest) in patterns: + if rest == 'glob': + continue +- assert rest == '=' + for pkg in returnList: + if pkg.name == pat: + self._pkgnames_loaded.add(pkg.name) +-- +1.7.0.1 + + +From 3ec0eb7fe87f339c71539636282c018d278d04c5 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 9 Apr 2010 16:46:08 -0400 +Subject: [PATCH 47] Disallow symlinks, for variables (although it is root only), and tweak docs + + Add the vars directory on install, to make it easier for users. + Own the vars directory in the specfile. + Also add uuid, history, plugins and yumdb as %ghost files. +--- + Makefile | 2 +- + docs/yum.conf.5 | 9 +++++---- + yum.spec | 5 +++++ + yum/config.py | 6 +++++- + 4 files changed, 16 insertions(+), 6 deletions(-) + +diff --git a/Makefile b/Makefile +index d75b220..f20795f 100644 +--- a/Makefile ++++ b/Makefile +@@ -34,7 +34,7 @@ install: + install -m 755 bin/yum-updatesd.py $(DESTDIR)/usr/sbin/yum-updatesd + + mkdir -p $(DESTDIR)/var/cache/yum +- mkdir -p $(DESTDIR)/var/lib/yum ++ mkdir -p $(DESTDIR)/var/lib/yum/vars + + for d in $(SUBDIRS); do make PYTHON=$(PYTHON) DESTDIR=`cd $(DESTDIR); pwd` -C $$d install; [ $$? = 0 ] || exit 1; done + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index 54e7bf9..f4ce88d 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -771,16 +771,17 @@ configuration file variable will not be replaced. + + .LP + As of 3.2.28, any file in //vars is turned into +-a variable named after the filename (or overrides any of the above varaibles). ++a variable named after the filename (or overrides any of the above variables). + The obvious exception is that you cannot use these variables in the definition + of persistdir itself. + + Note that no warnings/errors are given if the files are unreadable, so creating + files that only root can read may be confusing for users. + +-Also note that all new line characters are removed, as a convienience, but no +-other checking is performed on the data. This means it's possible to have bad +-character data in baseurl etc. ++Also note that only the first line will be read and all new line ++characters are removed, as a convenience. However, no other checking is ++performed on the data. This means it is possible to have bad character ++data in any value. + + .SH "FILES" + .nf +diff --git a/yum.spec b/yum.spec +index 3a724cd..48e5fea 100644 +--- a/yum.spec ++++ b/yum.spec +@@ -91,6 +91,11 @@ exit 0 + /usr/lib/python?.?/site-packages/rpmUtils + %dir /var/cache/yum + %dir /var/lib/yum ++%dir /var/lib/yum/vars ++%ghost /var/lib/yum/uuid ++%ghost /var/lib/yum/history ++%ghost /var/lib/yum/plugins ++%ghost /var/lib/yum/yumdb + %{_mandir}/man*/yum.* + %{_mandir}/man*/yum-shell* + +diff --git a/yum/config.py b/yum/config.py +index e13eb12..ea8bcbf 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -882,8 +882,12 @@ def readMainConfig(startupconf): + except OSError: + fsvars = [] + for fsvar in fsvars: ++ if os.path.link(dir_fsvars + fsvar): ++ continue + try: +- val = open(dir_fsvars + fsvar).read().replace('\n', '') ++ val = open(dir_fsvars + fsvar).readline() ++ if val and val[-1] == '\n': ++ val = val[:-1] + except (OSError, IOError): + continue + yumvars[fsvar] = val +-- +1.7.0.1 + + +From cf43ce922a58f6514a7bc76cdc326a89134379fc Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 9 Apr 2010 16:59:16 -0400 +Subject: [PATCH 48] Add more docs for version command + +--- + docs/yum.8 | 20 +++++++++++++++++++- + 1 files changed, 19 insertions(+), 1 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index d36b1cc..6761f1c 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -69,7 +69,7 @@ gnome\-packagekit application\&. + .br + .I \fR * repolist [all|enabled|disabled] + .br +-.I \fR * version [all|installed|available|group-*|grouplist|groupinfo] ++.I \fR * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ] + .br + .I \fR * history [info|list|summary|redo|undo|new] + .br +@@ -266,6 +266,24 @@ information is listed. The version is calculated by taking a sha1 hash of the + packages (in sorted order), and the checksum_type/checksum_data entries from + the yumdb. Note that this rpmdb version is now also used significantly within + yum (esp. in yum history). + - #~ msgid "Error accessing File: %s" - #~ msgstr "Erro ao acessar arquivo: %s" ++The version command will now show "groups" of packages as a separate version, ++and so takes sub-commands: + - #~ msgid "You're not root, we can't install things" - #~ msgstr "Você não é root, nós não podemos instalar coisas" ++"version grouplist" - List the defined version groups. + - #~ msgid "Cannot find any conf file." - #~ msgstr "Não foi possível encontrar um arquivo de configuração." ++"version groupinfo" - Get the complete list of packages within one or more version groups. + - #~ msgid "Local file does not exist: %s" - #~ msgstr "O arquivo local não existe: %s" ++"version installed" - This is the default, only show the version information for installed packages. + - #~ msgid "using ftp, http[s], or file for servers, Aborting - %s" - #~ msgstr "usando ftp, http[s] ou arquivos para servidores. Abortando - %s" ++"version available" - Only show the version information for available packages. + - #~ msgid "Found %s." - #~ msgstr "%s encontrado." ++"version all" - Show the version information for installed and available packages. + - #~ msgid "Transaction(s) Complete" - #~ msgstr "Transação Completa" ++"version nogroups | nogroups-*" - Just show the main version information. + - #~ msgid "IOError: %s" - #~ msgstr "IOError (Erro E/S): %s" ++"version group-*" - Just show the grouped version information, if more arguments are given then only show the data for those groups. + - #~ msgid "Cleaning packages and old headers" - #~ msgstr "Limpando pacotes e cabeçalhos antigos" + .IP + .IP "\fBhistory\fP" + The history command allows the user to view what has happened in past +-- +1.7.0.1 + + +From 7fc1a9491a0fc74ec9cf4e95f3c28a0e86c408cd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Sat, 10 Apr 2010 13:47:48 +0300 +Subject: [PATCH 49] Add basic version completion. + +--- + etc/yum.bash | 9 ++++++++- + 1 files changed, 8 insertions(+), 1 deletions(-) + +diff --git a/etc/yum.bash b/etc/yum.bash +index 966e33a..0fcba24 100644 +--- a/etc/yum.bash ++++ b/etc/yum.bash +@@ -102,7 +102,7 @@ _yum() + ;; + + check-update|grouplist|makecache|provides|whatprovides|resolvedep|\ +- search|version) ++ search) + return 0 + ;; + +@@ -214,6 +214,13 @@ _yum() + fi + return 0 + ;; ++ version) ++ if [ "$prev" = version ] ; then ++ COMPREPLY=( $( compgen -W 'all installed available nogroups ++ grouplist groupinfo' -- "$cur" ) ) ++ fi ++ return 0 ++ ;; + esac + + local split=false +-- +1.7.0.1 + + +From c46e474d6db8f1e1d9aff21de44a3325535cb24f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Sat, 10 Apr 2010 13:58:43 +0300 +Subject: [PATCH 50] Clean up some unnecessary/redundant code. + +--- + rpmUtils/updates.py | 13 +++++-------- + yum/__init__.py | 11 +---------- + 2 files changed, 6 insertions(+), 18 deletions(-) + +diff --git a/rpmUtils/updates.py b/rpmUtils/updates.py +index 68dee45..935a4ac 100644 +--- a/rpmUtils/updates.py ++++ b/rpmUtils/updates.py +@@ -75,14 +75,11 @@ class Updates: + + def _delFromNADict(self, dict_, pkgtup): + (n, a, e, v, r) = pkgtup +- if dict_.has_key((n, a)): +- dict_[(n, a)] = filter((e,v,r).__ne__, dict_[(n, a)]) +- if not dict_[(n, a)]: +- del dict_[(n, a)] +- if dict_.has_key((n, None)): +- dict_[(n, None)] = filter((e,v,r).__ne__, dict_[(n, None)]) +- if not dict_[(n, None)]: +- del dict_[(n, None)] ++ for aa in (a, None): ++ if (n, aa) in dict_: ++ dict_[(n, aa)] = filter((e,v,r).__ne__, dict_[(n, aa)]) ++ if not dict_[(n, aa)]: ++ del dict_[(n, aa)] + + def delPackage(self, pkgtup): + """remove available pkgtup that is no longer available""" +diff --git a/yum/__init__.py b/yum/__init__.py +index ed64441..e45d70a 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2022,7 +2022,6 @@ class YumBase(depsolve.Depsolve): + elif pkgnarrow == 'recent': + now = time.time() + recentlimit = now-(self.conf.recent*86400) +- ftimehash = {} + if showdups: + avail = self.pkgSack.returnPackages(patterns=patterns, + ignore_case=ic) +@@ -2034,15 +2033,7 @@ class YumBase(depsolve.Depsolve): + avail = [] + + for po in avail: +- ftime = int(po.filetime) +- if ftime > recentlimit: +- if not ftimehash.has_key(ftime): +- ftimehash[ftime] = [po] +- else: +- ftimehash[ftime].append(po) +- +- for sometime in ftimehash: +- for po in ftimehash[sometime]: ++ if int(po.filetime) > recentlimit: + recent.append(po) + + +-- +1.7.0.1 + + +From d3c698e03df6f664c67b61301320ebdc2dc11422 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 12 Apr 2010 11:50:55 -0400 +Subject: [PATCH 51] Do the pkgnames_loaded in the correct place, for _search + +--- + yum/rpmsack.py | 7 ++++--- + 1 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 4c17b67..179b008 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -1009,9 +1009,6 @@ class RPMDBPackageSack(PackageSackBase): + ts = self.readOnlyTS() + if name is not None: + mi = ts.dbMatch('name', name) +- # We create POs out of all matching names, even if we don't return +- # them. +- self._pkgnames_loaded.add(name) + elif arch is not None: + mi = ts.dbMatch('arch', arch) + else: +@@ -1022,6 +1019,10 @@ class RPMDBPackageSack(PackageSackBase): + if hdr['name'] == 'gpg-pubkey': + continue + po = self._makePackageObject(hdr, mi.instance()) ++ # We create POs out of all matching names, even if we don't return ++ # them. ++ self._pkgnames_loaded.add(po.name) + - #~ msgid "" - #~ "Cannot download %s in caching only mode or when running as non-root user." - #~ msgstr "" - #~ "Não é possível baixar %s no modo \"somente cache\" ou quando estiver " - #~ "executando com um usuário não root." + for tag in ('arch', 'rel', 'ver', 'epoch'): + if loc[tag] is not None and loc[tag] != getattr(po, tag): + break +-- +1.7.0.1 + + +From 62759284de079371407f4ba429f48a0be5a5589b Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 12 Apr 2010 11:53:17 -0400 +Subject: [PATCH 52] Do the pkgmatch_fails negative caching, in _search + +--- + yum/rpmsack.py | 10 ++++++++++ + 1 files changed, 10 insertions(+), 0 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 179b008..2b932cf 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -986,6 +986,9 @@ class RPMDBPackageSack(PackageSackBase): + + def _search(self, name=None, epoch=None, ver=None, rel=None, arch=None): + '''List of matching packages, to zero or more of NEVRA.''' ++ if name is not None and name in self._pkgmatch_fails: ++ return [] + - #~ msgid "" - #~ "Error: You may want to run yum clean or remove the file: \n" - #~ " %s" - #~ msgstr "" - #~ "Erro: Você pode querer executar a limpeza do yum ou remover o arquivo: \n" - #~ " %s" + pkgtup = (name, arch, epoch, ver, rel) + if pkgtup in self._tup2pkg: + return [self._tup2pkg[pkgtup]] +@@ -996,6 +999,8 @@ class RPMDBPackageSack(PackageSackBase): + if self._completely_loaded or name in self._pkgnames_loaded: + if name is not None: + pkgs = self._name2pkg.get(name, []) ++ if not pkgs: ++ self._pkgmatch_fails.add(name) + else: + pkgs = self.returnPkgs() + for po in pkgs: +@@ -1015,6 +1020,7 @@ class RPMDBPackageSack(PackageSackBase): + mi = ts.dbMatch() + self._completely_loaded = True + ++ done = False + for hdr in mi: + if hdr['name'] == 'gpg-pubkey': + continue +@@ -1022,6 +1028,7 @@ class RPMDBPackageSack(PackageSackBase): + # We create POs out of all matching names, even if we don't return + # them. + self._pkgnames_loaded.add(po.name) ++ done = True + + for tag in ('arch', 'rel', 'ver', 'epoch'): + if loc[tag] is not None and loc[tag] != getattr(po, tag): +@@ -1032,6 +1039,9 @@ class RPMDBPackageSack(PackageSackBase): + if self.auto_close: + self.ts.close() + ++ if not done and name is not None: ++ self._pkgmatch_fails.add(name) + - #~ msgid "Error reading lilo.conf: The messages was:\n" - #~ msgstr "Erro ao ler o lilo.conf: A mensagem foi:\n" + return ret + + def _makePackageObject(self, hdr, index): +-- +1.7.0.1 + + +From e45f29737d830587373e2b494fdcee95ad708e65 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 12 Apr 2010 11:56:00 -0400 +Subject: [PATCH 53] Don't integrate negative pkgnames with provides, probably fine but... + +--- + yum/rpmsack.py | 6 ++++-- + yum/sqlitesack.py | 6 ++++-- + 2 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 2b932cf..e113802 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -146,6 +146,7 @@ class RPMDBPackageSack(PackageSackBase): + self._tup2pkg = {} + self._completely_loaded = False + self._pkgmatch_fails = set() ++ self._provmatch_fails = set() + self._simple_pkgtup_list = [] + self._get_pro_cache = {} + self._get_req_cache = {} +@@ -193,6 +194,7 @@ class RPMDBPackageSack(PackageSackBase): + self._tup2pkg = {} + self._completely_loaded = False + self._pkgmatch_fails = set() ++ self._provmatch_fails = set() + self._simple_pkgtup_list = [] + self._get_pro_cache = {} + self._get_req_cache = {} +@@ -323,11 +325,11 @@ class RPMDBPackageSack(PackageSackBase): + return result + + def searchProvides(self, name): +- if name in self._pkgmatch_fails: ++ if name in self._provmatch_fails: + return [] + ret = self.searchPrco(name, 'provides') + if not ret: +- self._pkgmatch_fails.add(name) ++ self._provmatch_fails.add(name) + return ret + + def searchRequires(self, name): +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 8a4ec8b..344a966 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -429,6 +429,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + self._pkgtup2pkgs = {} + self._pkgnames_loaded = set() + self._pkgmatch_fails = set() ++ self._provmatch_fails = set() + self._arch_allowed = None + self._pkgExcluder = [] + self._pkgExcludeIds = {} +@@ -493,6 +494,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + self._pkgname2pkgkeys = {} + self._pkgnames_loaded = set() + self._pkgmatch_fails = set() ++ self._provmatch_fails = set() + self._pkgtup2pkgs = {} + self._search_cache = { + 'provides' : { }, +@@ -1374,11 +1376,11 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + + def searchProvides(self, name): + """return list of packages providing name (any evr and flag)""" +- if name in self._pkgmatch_fails: ++ if name in self._provmatch_fails: + return [] + ret = self.searchPrco(name, "provides") + if not ret: +- self._pkgmatch_fails.add(name) ++ self._provmatch_fails.add(name) + return ret + + def searchRequires(self, name): +-- +1.7.0.1 + + +From ade6d1655f790cc3be68eb8178d164f9c3e1cc3e Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 13 Apr 2010 11:50:28 -0400 +Subject: [PATCH 54] Move /var/lib/yum/vars to /etc/yum/vars as it's not yum generated + +--- + Makefile | 2 +- + docs/yum.conf.5 | 6 ++---- + etc/Makefile | 1 + + yum.spec | 4 ++-- + yum/config.py | 6 ++---- + 5 files changed, 8 insertions(+), 11 deletions(-) + +diff --git a/Makefile b/Makefile +index f20795f..8065899 100644 +--- a/Makefile ++++ b/Makefile +@@ -34,7 +34,7 @@ install: + install -m 755 bin/yum-updatesd.py $(DESTDIR)/usr/sbin/yum-updatesd + + mkdir -p $(DESTDIR)/var/cache/yum +- mkdir -p $(DESTDIR)/var/lib/yum/vars ++ mkdir -p $(DESTDIR)/var/lib/yum + + for d in $(SUBDIRS); do make PYTHON=$(PYTHON) DESTDIR=`cd $(DESTDIR); pwd` -C $$d install; [ $$? = 0 ] || exit 1; done + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index f4ce88d..dfc09b7 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -770,10 +770,8 @@ the same name. If the shell environment variable does not exist then the + configuration file variable will not be replaced. + + .LP +-As of 3.2.28, any file in //vars is turned into +-a variable named after the filename (or overrides any of the above variables). +-The obvious exception is that you cannot use these variables in the definition +-of persistdir itself. ++As of 3.2.28, any file in /etc/yum/vars is turned into a variable named after ++the filename (or overrides any of the above variables). + + Note that no warnings/errors are given if the files are unreadable, so creating + files that only root can read may be confusing for users. +diff --git a/etc/Makefile b/etc/Makefile +index 68dd3c2..91b1791 100644 +--- a/etc/Makefile ++++ b/etc/Makefile +@@ -9,6 +9,7 @@ clean: + install: + mkdir -p $(DESTDIR)/etc/yum/ + mkdir -p $(DESTDIR)/etc/yum/repos.d ++ mkdir -p $(DESTDIR)/etc/yum/vars + + install -m 644 yum.conf $(YUMETC)/yum.conf + +diff --git a/yum.spec b/yum.spec +index 48e5fea..5ece693 100644 +--- a/yum.spec ++++ b/yum.spec +@@ -80,8 +80,9 @@ exit 0 + %doc README AUTHORS COPYING TODO INSTALL ChangeLog PLUGINS + %config(noreplace) %{_sysconfdir}/yum/yum.conf + %config(noreplace) %{_sysconfdir}/yum/version-groups.conf +-%dir %{_sysconfdir}/%{name} ++%dir %{_sysconfdir}/yum + %dir %{_sysconfdir}/yum/repos.d ++%dir %{_sysconfdir}/yum/vars + %config %{_sysconfdir}/logrotate.d/%{name} + %{_sysconfdir}/bash_completion.d + %{_datadir}/yum-cli/* +@@ -91,7 +92,6 @@ exit 0 + /usr/lib/python?.?/site-packages/rpmUtils + %dir /var/cache/yum + %dir /var/lib/yum +-%dir /var/lib/yum/vars + %ghost /var/lib/yum/uuid + %ghost /var/lib/yum/history + %ghost /var/lib/yum/plugins +diff --git a/yum/config.py b/yum/config.py +index ea8bcbf..3e91735 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -873,11 +873,9 @@ def readMainConfig(startupconf): + ir_path = varReplace(ir_path, yumvars) + setattr(yumconf, option, ir_path) + +- _apply_installroot(yumconf, 'persistdir') +- + # Read the FS yumvars + try: +- dir_fsvars = yumconf.persistdir + "/vars/" ++ dir_fsvars = yumconf.installroot + "/etc/yum/vars/" + fsvars = os.listdir(dir_fsvars) + except OSError: + fsvars = [] +@@ -893,7 +891,7 @@ def readMainConfig(startupconf): + yumvars[fsvar] = val + + # These can use the above FS yumvars +- for option in ('cachedir', 'logfile'): ++ for option in ('cachedir', 'logfile', 'persistdir'): + _apply_installroot(yumconf, option) + + # Add in some extra attributes which aren't actually configuration values +-- +1.7.0.1 + + +From 05c2b1e916f371b91f4bde35c1b447f6f6288818 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 13 Apr 2010 17:13:55 -0400 +Subject: [PATCH 55] Slight speed increase for repodiff, up/11 vs. up/12: 8:27 => 1:50 :) :) + +--- + yum/packageSack.py | 9 +++++++-- + 1 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/yum/packageSack.py b/yum/packageSack.py +index 723f0cd..7a5ce7a 100644 +--- a/yum/packageSack.py ++++ b/yum/packageSack.py +@@ -941,8 +941,13 @@ class PackageSack(PackageSackBase): + be compared to each other for highest version.""" + + highdict = {} +- for pkg in self.returnPackages(patterns=patterns, +- ignore_case=ignore_case): ++ if patterns is None and name is not None: ++ pkgs = self.searchNevra(name=name) ++ else: ++ pkgs = self.returnPackages(patterns=patterns, ++ ignore_case=ignore_case) + - #~ msgid "No groups provided or accessible on any server." - #~ msgstr "Nenhum grupo fornecido ou acessível em nenhum servidor." ++ for pkg in pkgs: + if not highdict.has_key(pkg.name): + highdict[pkg.name] = [] + highdict[pkg.name].append(pkg) +-- +1.7.0.1 + + +From 0a50151d301d187dcac3989733cd24e66a37f064 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 13 Apr 2010 17:20:37 -0400 +Subject: [PATCH 56] Minor correction to rest testing for pkgnames_loaded (harmless) + +--- + yum/sqlitesack.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 344a966..b5cea0e 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -1599,7 +1599,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + self._pkgnames_loaded.update([po.name for po in returnList]) + if need_full: + for (pat, rest) in patterns: +- if rest == 'glob': ++ if rest not in ('=', ''): # Wildcards: 'glob' or ' ESCAPE "!"' + continue + for pkg in returnList: + if pkg.name == pat: +-- +1.7.0.1 + + +From 59f29da93ce4c75869c0a5fecc71f333c61aa54f Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 14 Apr 2010 00:11:49 -0400 +Subject: [PATCH 57] Add a header to the automatic yum check output to make it more obvious. + +--- + yum/__init__.py | 8 +++++++- + yumcommands.py | 3 ++- + 2 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index e45d70a..35da86e 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1139,9 +1139,14 @@ class YumBase(depsolve.Depsolve): + toRemove.add(dep) + self._getDepsToRemove(dep, deptree, toRemove) + +- def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd='all'): ++ def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd='all',header=None): + if out is None: + out = self.logger.warning ++ if header is None: ++ # FIXME: _N() ++ msg = _("** Found %d pre-existing rpmdb problem(s)," ++ " 'yum check' output follows:") ++ header = lambda problems: not problems or out(msg % problems) + if warn: + out(_('Warning: RPMDB altered outside of yum.')) + +@@ -1156,6 +1161,7 @@ class YumBase(depsolve.Depsolve): + iopkgs = set(self.conf.installonlypkgs) + probs.extend(self.rpmdb.check_duplicates(iopkgs)) + ++ header(len(probs)) + for prob in sorted(probs): + out(prob) + +diff --git a/yumcommands.py b/yumcommands.py +index 9bc06ad..89c562c 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -1381,7 +1381,8 @@ class CheckRpmdbCommand(YumCommand): + print x + + rc = 0 +- if base._rpmdb_warn_checks(_out, False, chkcmd): ++ if base._rpmdb_warn_checks(out=_out, warn=False, chkcmd=chkcmd, ++ header=lambda x: None): + rc = 1 + return rc, ['%s %s' % (basecmd, chkcmd)] + +-- +1.7.0.1 + + +From b792f26a18906cf722f7354cc91e0c2e6679c471 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Wed, 14 Apr 2010 16:09:54 -0400 +Subject: [PATCH 58] new dump_xml methods for repodata and repomd and related changes + +- add dump_xml methods to RepoData and RepoMD so we can write them back out + +- also make them more object-y by allowing us to create the objects without having + anything to put in them so we populate them by hand, if need be. +--- + yum/repoMDObject.py | 92 +++++++++++++++++++++++++++++++++++++++++++++++---- + 1 files changed, 85 insertions(+), 7 deletions(-) + +diff --git a/yum/repoMDObject.py b/yum/repoMDObject.py +index 0021d94..eab351a 100755 +--- a/yum/repoMDObject.py ++++ b/yum/repoMDObject.py +@@ -23,7 +23,7 @@ from Errors import RepoMDError + + import sys + import types +-from misc import AutoFileChecksums ++from misc import AutoFileChecksums, to_xml + + def ns_cleanup(qn): + if qn.find('}') == -1: return qn +@@ -32,7 +32,9 @@ def ns_cleanup(qn): + class RepoData: + """represents anything beneath a tag""" + def __init__(self, elem): +- self.type = elem.attrib.get('type') ++ self.type = None ++ if elem: ++ self.type = elem.attrib.get('type') + self.location = (None, None) + self.checksum = (None,None) # type,value + self.openchecksum = (None,None) # type,value +@@ -40,8 +42,9 @@ class RepoData: + self.dbversion = None + self.size = None + self.opensize = None +- +- self.parse(elem) + - #~ msgid "%s results returned" - #~ msgstr "%s resultados retornados" ++ if elem: ++ self.parse(elem) + + def parse(self, elem): + +@@ -70,11 +73,47 @@ class RepoData: + self.size = child.text + elif child_name == 'open-size': + self.opensize = child.text + - #~ msgid "Error moving %s to %s, fatal" - #~ msgstr "Erro ao mover %s para %s, fatal" ++ def dump_xml(self): ++ msg = "" ++ top = """\n""" % to_xml(self.type, attrib=True) ++ msg += top ++ ++ for (data, xmlname) in [('checksum', 'checksum'),('openchecksum', 'open-checksum')]: ++ if hasattr(self, data): ++ val = getattr(self, data) ++ if val[0]: ++ d_xml = """ <%s type="%s">%s\n""" % (xmlname, ++ to_xml(val[0], attrib=True), ++ to_xml(val[1]), xmlname) ++ msg += d_xml + - #~ msgid "" - #~ "\n" - #~ "ignoring bad rpm: %s" - #~ msgstr "" - #~ "\n" - #~ "ignorando rpm defeituoso: %s" ++ if hasattr(self, 'location'): ++ val = getattr(self, 'location') ++ if val[1]: ++ loc = """ \n""" % to_xml(val[1], attrib=True) ++ if val[0]: ++ loc = """ \n""" % ( ++ to_xml(val[0], attrib=True), to_xml(val[1], attrib=True)) ++ msg += loc ++ ++ for (data,xmlname) in [('timestamp', 'timestamp'), ++ ('dbversion', 'database_version'), ++ ('size','size'), ('opensize', 'open-size')]: ++ val = getattr(self, data) ++ if val: ++ d_xml = """ <%s>%s\n""" % (xmlname, to_xml(val), ++ xmlname) ++ msg += d_xml + - #~ msgid "[erase: %s]" - #~ msgstr "[remover: %s]" ++ bottom = """\n""" ++ msg += bottom ++ return msg + + class RepoMD: + """represents the repomd xml file""" + +- def __init__(self, repoid, srcfile): ++ def __init__(self, repoid, srcfile=None): + """takes a repoid and a filename for the repomd.xml""" + + self.timestamp = 0 +@@ -83,8 +122,12 @@ class RepoMD: + self.checksums = {} + self.length = 0 + self.revision = None +- self.tags = {'content' : set(), 'distro' : {}} +- ++ self.tags = {'content' : set(), 'distro' : {}, 'repo': set()} ++ ++ if srcfile: ++ self.parse(srcfile) ++ ++ def parse(self, srcfile): + if type(srcfile) in types.StringTypes: + # srcfile is a filename string + try: +@@ -168,6 +211,41 @@ class RepoMD: + print ' open checksum: %s - %s' % thisdata.openchecksum + print ' dbversion : %s' % thisdata.dbversion + print '' ++ def dump_xml(self): ++ msg = "" ++ ++ top = """ ++\n""" ++ msg += top ++ if self.revision: ++ rev = """ %s\n""" % self.revision ++ msg += rev ++ ++ if self.tags['content'] or self.tags['distro'] or self.tags['repo']: ++ tags = """ \n""" ++ for item in self.tags['content']: ++ tag = """ %s\n""" % (to_xml(item)) ++ tags += tag ++ for item in self.tags['repo']: ++ tag = """ %s\n""" % (to_xml(item)) ++ tags += tag ++ for (cpeid, item) in self.tags['distro'].items(): ++ itemlist = list(item) # frellingsets. ++ if cpeid: ++ tag = """ %s\n""" % ( ++ to_xml(cpeid, attrib=True), to_xml(itemlist[0])) ++ else: ++ tag = """ %s\n""" % (to_xml(itemlist[0])) ++ tags += tag ++ tags += """ \n""" ++ msg += tags ++ ++ for md in self.repoData.values(): ++ msg += md.dump_xml() ++ ++ msg += """\n""" + - #~ msgid "%s is not a dir" - #~ msgstr "%s não é um diretório" ++ return msg + + def main(): + +-- +1.7.0.1 + + +From 87f51be49f80ddcb3c7a0df56a106a048327a641 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 15 Apr 2010 08:56:10 -0400 +Subject: [PATCH 59] to_xml(revision) and make sure elem is None by default for RepoData objects. + +--- + yum/repoMDObject.py | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/yum/repoMDObject.py b/yum/repoMDObject.py +index eab351a..7a4593e 100755 +--- a/yum/repoMDObject.py ++++ b/yum/repoMDObject.py +@@ -31,7 +31,7 @@ def ns_cleanup(qn): + + class RepoData: + """represents anything beneath a tag""" +- def __init__(self, elem): ++ def __init__(self, elem=None): + self.type = None + if elem: + self.type = elem.attrib.get('type') +@@ -218,7 +218,7 @@ class RepoMD: + \n""" + msg += top + if self.revision: +- rev = """ %s\n""" % self.revision ++ rev = """ %s\n""" % to_xml(self.revision) + msg += rev + + if self.tags['content'] or self.tags['distro'] or self.tags['repo']: +-- +1.7.0.1 + + +From e27832b442d39b3cfb525bcdf6875a55bf890e45 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 14 Apr 2010 18:25:22 -0400 +Subject: [PATCH 60] Enable "big update" speedup, disable if a repo. doesn't have pkgfiles index. + +--- + test/testbase.py | 11 +++++++++++ + yum/packageSack.py | 11 ++++++++--- + yum/packages.py | 3 +++ + yum/sqlitesack.py | 24 ++++++++++++++++++++++++ + yum/transactioninfo.py | 10 ++++++---- + 5 files changed, 52 insertions(+), 7 deletions(-) + +diff --git a/test/testbase.py b/test/testbase.py +index b4ce5d7..44d1959 100644 +--- a/test/testbase.py ++++ b/test/testbase.py +@@ -46,10 +46,21 @@ class FakeConf(object): + self.uid = 0 + self.groupremove_leaf_only = False + ++class FakeSack: ++ """ Fake PackageSack to use with FakeRepository""" ++ def __init__(self): ++ pass # This is fake, so do nothing ++ ++ def have_fastSearchFiles(self): ++ return True + - #~ msgid "Best version for %s is %s:%s-%s" - #~ msgstr "A melhor versão para %s é %s:%s-%s" + class FakeRepo(object): + ++ __fake_sack = FakeSack() + def __init__(self, id=None,sack=None): + self.id = id ++ if sack is None: ++ sack = self.__fake_sack + self.sack = sack + self.cost = 1000 + +diff --git a/yum/packageSack.py b/yum/packageSack.py +index 7a5ce7a..e63a8d7 100644 +--- a/yum/packageSack.py ++++ b/yum/packageSack.py +@@ -152,6 +152,10 @@ class PackageSackBase(object): + """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]""" + raise NotImplementedError() + ++ def have_fastSearchFiles(self): ++ """ Is calling searchFiles() faster than using """ ++ raise NotImplementedError() + - #~ msgid "[deps: %s]" - #~ msgstr "[deps: %s]" + def searchFiles(self, name): + """return list of packages by filename""" + raise NotImplementedError() +@@ -772,10 +776,11 @@ class PackageSack(PackageSackBase): + + return obs + ++ def have_fastSearchFiles(self): ++ return True + - #~ msgid "" - #~ "\n" - #~ "ignoring srpm: %s" - #~ msgstr "" - #~ "\n" - #~ "ignorando srpm: %s" + def searchFiles(self, name): +- """return list of packages by filename +- FIXME - need to add regex match against keys in file list +- """ ++ """ Return list of packages by filename. """ + self._checkIndexes(failure='build') + if self.filenames.has_key(name): + return self.filenames[name] +diff --git a/yum/packages.py b/yum/packages.py +index 427893b..289660d 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -159,6 +159,9 @@ class FakeSack: + def __init__(self): + pass # This is fake, so do nothing + ++ def have_fastSearchFiles(self): ++ return True + - #~ msgid "Checking deps %d/%d complete" - #~ msgstr "Checando dependências, %d/%d completo" + def delPackage(self, obj): + """delete a pkgobject, do nothing, but make localpackages work with --skip-broken""" + pass # This is fake, so do nothing +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index b5cea0e..74c793a 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -842,6 +842,30 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + return misc.unique(results) + + @catchSqliteException ++ def _have_fastSearchFiles(self): ++ """ Return true if searchFiles() is always fast, basically relies on ++ "CREATE INDEX pkgfiles ON files (pkgKey);" existing. """ + - #~ msgid "" - #~ "Errors within the dir(s):\n" - #~ " %s" - #~ msgstr "" - #~ "Erro dentro do(s) diretório(s):\n" - #~ " %s" ++ for (rep,cache) in self.primarydb.items(): ++ if rep in self._all_excludes: ++ continue ++ cur = cache.cursor() ++ executeSQL(cur, "PRAGMA index_info(pkgfiles)") ++ # If we get anything, we're fine. There might be a better way of ++ # saying "anything" but this works. ++ for ob in cur: ++ break ++ else: ++ return False + - #~ msgid "Please run yum in non-caching mode to correct this header." - #~ msgstr "" - #~ "Por favor, execute o yum no modo sem cache para corrigir este cabeçalho." ++ return True + - #~ msgid "Error installing lilo.conf The message was:\n" - #~ msgstr "Erro ao instalar o lilo.conf. A mensagem foi:\n" ++ def have_fastSearchFiles(self): ++ if not hasattr(self, '_cached_have_fastSearchFiles'): ++ self._cached_have_fastSearchFiles = self._have_fastSearchFiles() ++ return self._cached_have_fastSearchFiles + - #~ msgid "Error: Untrusted GPG key on %s" - #~ msgstr "Erro: Chave GPG não confiável em %s" ++ @catchSqliteException + def searchFiles(self, name, strict=False): + """search primary if file will be in there, if not, search filelists, use globs, if possible""" + +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index e7b60de..cad36f4 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -89,9 +89,7 @@ class TransactionData: + self.pkgSack = None + self.pkgSackPackages = 0 + self.localSack = PackageSack() +- # FIXME: This is turned off atm. ... it'll be turned on when +- # the new yum-metadata-parser with the "pkgfiles" index is std. +- self._inSack = None # GetProvReqOnlyPackageSack() ++ self._inSack = GetProvReqOnlyPackageSack() + + # lists of txmbrs in their states - just placeholders + self.instgroups = [] +@@ -239,7 +237,11 @@ class TransactionData: + elif isinstance(txmember.po, YumAvailablePackageSqlite): + self.pkgSackPackages += 1 + if self._inSack is not None and txmember.output_state in TS_INSTALL_STATES: +- self._inSack.addPackage(txmember.po) ++ if not txmember.po.repo.sack.have_fastSearchFiles(): ++ # In theory we could keep this on if a "small" repo. fails ++ self._inSack = None ++ else: ++ self._inSack.addPackage(txmember.po) + + if self.conditionals.has_key(txmember.name): + for pkg in self.conditionals[txmember.name]: +-- +1.7.0.1 + + +From 204a4d086e601cf4517cf39e23eaad49ac71eedf Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 15 Apr 2010 01:32:19 -0400 +Subject: [PATCH 61] Add obsoleted and provides index checking, don't default to doing them though + +--- + yum/__init__.py | 19 ++++++++++++++++--- + yum/rpmsack.py | 43 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 59 insertions(+), 3 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 35da86e..cc5064e 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1139,9 +1139,11 @@ class YumBase(depsolve.Depsolve): + toRemove.add(dep) + self._getDepsToRemove(dep, deptree, toRemove) + +- def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd='all',header=None): ++ def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd=None, header=None): + if out is None: + out = self.logger.warning ++ if chkcmd is None: ++ chkcmd = ['dependencies', 'duplicates'] + if header is None: + # FIXME: _N() + msg = _("** Found %d pre-existing rpmdb problem(s)," +@@ -1150,17 +1152,28 @@ class YumBase(depsolve.Depsolve): + if warn: + out(_('Warning: RPMDB altered outside of yum.')) + ++ if type(chkcmd) in (type([]), type(set())): ++ chkcmd = set(chkcmd) ++ else: ++ chkcmd = set([chkcmd]) + - #~ msgid "" - #~ "\n" - #~ "\n" -@@ -2821,50 +3058,66 @@ msgstr "Erro ao abrir o rpm %s - erro %s" - #~ "\n" - #~ "Problema com a assinatura gpg ou com o md5sum em %s\n" - #~ "\n" + rc = 0 + probs = [] +- if chkcmd in ('all', 'dependencies'): ++ if chkcmd.intersection(set(('all', 'dependencies'))): + prob2ui = {'requires' : _('missing requires'), + 'conflicts' : _('installed conflict')} + probs.extend(self.rpmdb.check_dependencies()) + +- if chkcmd in ('all', 'duplicates'): ++ if chkcmd.intersection(set(('all', 'duplicates'))): + iopkgs = set(self.conf.installonlypkgs) + probs.extend(self.rpmdb.check_duplicates(iopkgs)) + ++ if chkcmd.intersection(set(('all', 'obsoleted'))): ++ probs.extend(self.rpmdb.check_obsoleted()) + - #~ msgid "No Packages Available for Update or Install" - #~ msgstr "Nenhum Pacote Disponível para Atualização ou Instalação" ++ if chkcmd.intersection(set(('all', 'provides'))): ++ probs.extend(self.rpmdb.check_provides()) + - #~ msgid "Found best arch for install only pkg %s" - #~ msgstr "Encontre a melhor arquitetura para instalar apenas o pacote %s" + header(len(probs)) + for prob in sorted(probs): + out(prob) +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index e113802..e18df3f 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -114,6 +114,23 @@ class RPMDBProblemDuplicate(RPMDBProblem): + return _("%s is a duplicate with %s") % (self.pkg, self.duplicate) + + ++class RPMDBProblemObsoleted(RPMDBProblem): ++ def __init__(self, pkg, **kwargs): ++ RPMDBProblem.__init__(self, pkg, "obsoleted", **kwargs) + - #~ msgid "I will do the following:" - #~ msgstr "Eu farei o seguinte:" ++ def __str__(self): ++ return _("%s is obsoleted by %s") % (self.pkg, self.obsoleter) + - #~ msgid "Bad URL: %s" - #~ msgstr "URL Inválida: %s" + - #~ msgid "NonMatching RPM version, %s, removing." - #~ msgstr "Versão do RPM não coincide, %s, removendo." ++class RPMDBProblemProvides(RPMDBProblem): ++ def __init__(self, pkg, **kwargs): ++ RPMDBProblem.__init__(self, pkg, "provides", **kwargs) + - #~ msgid "I will erase these to satisfy the dependencies:" - #~ msgstr "Eu irei apagar isto para satisfazer as dependências:" ++ def __str__(self): ++ return _("%s provides %s but it cannot be found") % (self.pkg, ++ self.provide) + - #~ msgid "HTTP Error (%s): %s" - #~ msgstr "Erro HTTP (%s): %s" + - #~ msgid "Please ask your sysadmin to update the headers on this system." - #~ msgstr "" - #~ "Por favor, peça ao administrador do seu sistema para atualizar os " - #~ "cabeçalhos." + class RPMDBPackageSack(PackageSackBase): + ''' + Represent rpmdb as a packagesack +@@ -1298,6 +1315,32 @@ class RPMDBPackageSack(PackageSackBase): + problems.append(RPMDBProblemDuplicate(pkg, duplicate=last)) + return problems + ++ def check_obsoleted(self): ++ """ Checks for any packages which are obsoleted by other packages. """ ++ obsoleters = [] ++ problems = [] ++ for pkg in sorted(self.returnPackages()): ++ if not pkg.obsoletes: ++ continue ++ obsoleters.append(pkg) ++ for pkg in sorted(self.returnPackages()): ++ provtup = (pkg.name, 'EQ', (pkg.epoch, pkg.version, pkg.release)) ++ for obspo in obsoleters: ++ if obspo.inPrcoRange('obsoletes', provtup): ++ problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo)) ++ return problems + - #~ msgid "Putting back old headers" - #~ msgstr "Recolocando cabeçalhos antigos" --#~ msgid "CacheDir: %s" --#~ msgstr "CacheDir (diretório de cache): %s" ++ def check_provides(self): ++ """ For each package, check that a provides search for it's name (and ++ everything it provides) finds it. """ ++ problems = [] ++ for pkg in sorted(self.returnPackages()): ++ for provtup in pkg.provides: ++ name, flags, version = provtup ++ if pkg not in self.getProvides(name, flags, version): ++ problems.append(RPMDBProblemProvides(pkg, provide=provtup)) ++ break ++ return problems + + def _sanitize(path): + return path.replace('/', '').replace('~', '') +-- +1.7.0.1 + + +From 1f714fa2f00b1d92fc5636e58cf9ad97fd638b03 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 15 Apr 2010 01:33:32 -0400 +Subject: [PATCH 62] Fix rpmdb.searchPrco() with "globs", can also affect getProvides() etc. + +--- + yum/rpmsack.py | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index e18df3f..eba1409 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -322,8 +322,8 @@ class RPMDBPackageSack(PackageSackBase): + if not glob: + if po.checkPrco(prcotype, (n, f, (e,v,r))): + result[po.pkgid] = po +- else: +- result[po.pkgid] = po ++ else: ++ result[po.pkgid] = po + del mi + + +-- +1.7.0.1 + + +From e8ce2ff4619b69d8ad244a5df5aeaf484076203b Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 15 Apr 2010 12:37:51 -0400 +Subject: [PATCH 63] Fix the docs. for have_fast* + + Rename it from have_fastSearchFiles to have_fastReturnFileEntries to +better reflect what it means. + Add a dummy to PO, as that's the logical place for it even though it +needs to be in the sack for sqlite to get the answer. + + Add some docs. to the package object classes, while we are here. +--- + test/testbase.py | 2 +- + yum/__init__.py | 2 +- + yum/packageSack.py | 9 ++++++--- + yum/packages.py | 38 ++++++++++++++++++++++++++++++++------ + yum/sqlitesack.py | 16 +++++++++------- + yum/transactioninfo.py | 2 +- + 6 files changed, 50 insertions(+), 19 deletions(-) + +diff --git a/test/testbase.py b/test/testbase.py +index 44d1959..fa2e512 100644 +--- a/test/testbase.py ++++ b/test/testbase.py +@@ -51,7 +51,7 @@ class FakeSack: + def __init__(self): + pass # This is fake, so do nothing + +- def have_fastSearchFiles(self): ++ def have_fastReturnFileEntries(self): + return True + + class FakeRepo(object): +diff --git a/yum/__init__.py b/yum/__init__.py +index cc5064e..9e8fad9 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -4409,7 +4409,7 @@ class YumBase(depsolve.Depsolve): + + if pkg1.name != pkg2.name: + return False +- if not pkg1.EVR > pkg2.EVR: ++ if pkg1.verLE(pkg2): + return False + if pkg1.arch not in self.arch.archlist: + return False +diff --git a/yum/packageSack.py b/yum/packageSack.py +index e63a8d7..dbe54bf 100644 +--- a/yum/packageSack.py ++++ b/yum/packageSack.py +@@ -152,8 +152,9 @@ class PackageSackBase(object): + """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]""" + raise NotImplementedError() + +- def have_fastSearchFiles(self): +- """ Is calling searchFiles() faster than using """ ++ def have_fastReturnFileEntries(self): ++ """ Is calling pkg.returnFileEntries(primary_only=True) faster than ++ using searchFiles(). """ + raise NotImplementedError() + + def searchFiles(self, name): +@@ -776,7 +777,9 @@ class PackageSack(PackageSackBase): + + return obs + +- def have_fastSearchFiles(self): ++ def have_fastReturnFileEntries(self): ++ """ Is calling pkg.returnFileEntries(primary_only=True) faster than ++ using searchFiles(). """ + return True + + def searchFiles(self, name): +diff --git a/yum/packages.py b/yum/packages.py +index 289660d..731d217 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -159,7 +159,9 @@ class FakeSack: + def __init__(self): + pass # This is fake, so do nothing + +- def have_fastSearchFiles(self): ++ def have_fastReturnFileEntries(self): ++ """ Is calling pkg.returnFileEntries(primary_only=True) faster than ++ using searchFiles(). """ + return True + + def delPackage(self, obj): +@@ -213,8 +215,10 @@ class FakeRepository: + return self.id + + +-# goal for the below is to have a packageobject that can be used by generic ++# Goal for the below is to have a packageobject that can be used by generic + # functions independent of the type of package - ie: installed or available ++# Note that this is also used to history etc. ... so it's more a nevra+checksum ++# holder than a base for things which are actual packages. + class PackageObject(object): + """Base Package Object - sets up the default storage dicts and the + most common returns""" +@@ -299,11 +303,16 @@ class PackageObject(object): + def verEQ(self, other): + """ Compare package to another one, only rpm-version equality. """ + if not other: +- return False ++ return None + ret = cmp(self.name, other.name) + if ret != 0: + return False + return comparePoEVREQ(self, other) ++ def verNE(self, other): ++ """ Compare package to another one, only rpm-version inequality. """ ++ if not other: ++ return None ++ return not self.verEQ(other) + def verLT(self, other): + """ Uses verCMP, tests if the other _rpm-version_ is < ours. """ + return self.verCMP(other) < 0 +@@ -335,6 +344,10 @@ class PackageObject(object): + if csumid: + return (csumtype, csum) + ++# This is the virtual base class of actual packages, it basically requires a ++# repo. even though it doesn't set one up in it's __init__. It also doesn't have ++# PackageObject methods ... so is basically unusable on it's own ++# see: YumAvailablePackage. + class RpmBase(object): + """return functions and storage for rpm-specific data""" + +@@ -561,11 +574,18 @@ class RpmBase(object): + + base_package_name = property(fget=lambda self: self._getBaseName()) + ++ def have_fastReturnFileEntries(self): ++ """ Is calling pkg.returnFileEntries(primary_only=True) faster than ++ using searchFiles(). """ ++ return self.repo.sack.have_fastReturnFileEntries() + + - #~ msgid "Completing update for %s - %d/%d" - #~ msgstr "Completando atualização para %s - %d/%d" ++# This is kind of deprecated + class PackageEVR: + + """ +- A comparable epoch, version, and release representation. ++ A comparable epoch, version, and release representation. Note that you ++ almost certainly want to use pkg.verEQ() or pkg.verGT() etc. instead. + """ + + def __init__(self,e,v,r): +@@ -608,7 +628,8 @@ class PackageEVR: + return False + + +- ++# This is the real base class of actual packages, it has a repo. and is ++# usable on it's own, in theory (but in practise see sqlitesack). + class YumAvailablePackage(PackageObject, RpmBase): + """derived class for the packageobject and RpmBase packageobject yum + uses this for dealing with packages in a repository""" +@@ -1124,7 +1145,8 @@ class YumAvailablePackage(PackageObject, RpmBase): + + + +- ++# This is a tweak on YumAvailablePackage() and is a base class for packages ++# which are actual rpms. + class YumHeaderPackage(YumAvailablePackage): + """Package object built from an rpm header""" + def __init__(self, repo, hdr): +@@ -1364,6 +1386,7 @@ _RPMVERIFY_RDEV = (1 << 7) + + _installed_repo = FakeRepository('installed') + _installed_repo.cost = 0 ++# This is a tweak on YumHeaderPackage() for installed rpm packages. + class YumInstalledPackage(YumHeaderPackage): + """super class for dealing with packages in the rpmdb""" + def __init__(self, hdr, yumdb=None): +@@ -1627,6 +1650,7 @@ class YumInstalledPackage(YumHeaderPackage): + return results + + ++# This is a tweak on YumHeaderPackage() for rpm packages which are on disk. + class YumLocalPackage(YumHeaderPackage): + """Class to handle an arbitrary package from a file path + this inherits most things from YumInstalledPackage because +@@ -1770,6 +1794,8 @@ class YumLocalPackage(YumHeaderPackage): + return msg + + ++# This is a tweak on YumLocalPackage() to download rpm packages to disk, and ++# then use them directly. + class YumUrlPackage(YumLocalPackage): + """Class to handle an arbitrary package from a URL + this inherits most things from YumLocalPackage, but will download a +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 74c793a..1885d57 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -842,9 +842,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + return misc.unique(results) + + @catchSqliteException +- def _have_fastSearchFiles(self): +- """ Return true if searchFiles() is always fast, basically relies on +- "CREATE INDEX pkgfiles ON files (pkgKey);" existing. """ ++ def _have_fastReturnFileEntries(self): ++ """ Return true if pkg.returnFileEntries(primary_only=True) is fast. ++ basically does "CREATE INDEX pkgfiles ON files (pkgKey);" exist. """ + + for (rep,cache) in self.primarydb.items(): + if rep in self._all_excludes: +@@ -860,10 +860,12 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + + return True + +- def have_fastSearchFiles(self): +- if not hasattr(self, '_cached_have_fastSearchFiles'): +- self._cached_have_fastSearchFiles = self._have_fastSearchFiles() +- return self._cached_have_fastSearchFiles ++ def have_fastReturnFileEntries(self): ++ """ Is calling pkg.returnFileEntries(primary_only=True) faster than ++ using searchFiles(). """ ++ if not hasattr(self, '_cached_fRFE'): ++ self._cached_fRFE = self._have_fastReturnFileEntries() ++ return self._cached_fRFE + + @catchSqliteException + def searchFiles(self, name, strict=False): +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index cad36f4..d7d8859 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -237,7 +237,7 @@ class TransactionData: + elif isinstance(txmember.po, YumAvailablePackageSqlite): + self.pkgSackPackages += 1 + if self._inSack is not None and txmember.output_state in TS_INSTALL_STATES: +- if not txmember.po.repo.sack.have_fastSearchFiles(): ++ if not txmember.po.have_fastReturnFileEntries(): + # In theory we could keep this on if a "small" repo. fails + self._inSack = None + else: +-- +1.7.0.1 + + +From 5f6c04f93ef6cf3272197560bb914ce5fd410155 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 15 Apr 2010 12:54:42 -0400 +Subject: [PATCH 64] Add primary_only arg. to returnFileTypes(), use it from transactioninfo + sack so that we don't require filelists to be downloaded. + +--- + yum/packages.py | 23 ++++++++++++++++++++--- + yum/sqlitesack.py | 11 ++++++++++- + yum/transactioninfo.py | 2 +- + 3 files changed, 31 insertions(+), 5 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index 731d217..c1a14d0 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -514,9 +514,26 @@ class RpmBase(object): + return self.files[ftype] + return [] + +- def returnFileTypes(self): +- """return list of types of files in the package""" +- # maybe should die - use direct access to attribute ++ def returnFileTypes(self, primary_only=False): ++ """return list of types of files in the package, you can pass ++ primary_only=True to limit to those files in the primary repodata""" ++ if primary_only: ++ ret = [] # We only return the types for the primary files. ++ for ftype in self.files.keys(): ++ if ftype == 'dir': ++ match = misc.re_primary_dirname ++ else: ++ match = misc.re_primary_filename ++ # As soon as we find a primary file of this type, we can ++ # return it. ++ for fn in self.files[ftype]: ++ if match(fn): ++ break ++ else: ++ continue ++ ret.append(ftype) ++ return ret + - #~ msgid "" - #~ "Error: You may need to disable gpg checking to install this package\n" - #~ msgstr "" - #~ "Erro: Talvez seja necessário desabilitar a verificação gpg para instalar " - #~ "este pacote\n" + return self.files.keys() + + def returnPrcoNames(self, prcotype): +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 1885d57..43f60cd 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -353,6 +353,8 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): + return self._changelog + + def returnFileEntries(self, ftype='file', primary_only=False): ++ """return list of files based on type, you can pass primary_only=True ++ to limit to those files in the primary repodata""" + if primary_only and not self._loadedfiles: + sql = "SELECT name as fname FROM files WHERE pkgKey = ? and type = ?" + cur = self._sql_MD('primary', sql, (self.pkgKey, ftype)) +@@ -361,7 +363,14 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): + self._loadFiles() + return RpmBase.returnFileEntries(self,ftype,primary_only) + +- def returnFileTypes(self): ++ def returnFileTypes(self, primary_only=False): ++ """return list of types of files in the package, you can pass ++ primary_only=True to limit to those files in the primary repodata""" ++ if primary_only and not self._loadedfiles: ++ sql = "SELECT DISTINCT type as ftype FROM files WHERE pkgKey = ?" ++ cur = self._sql_MD('primary', sql, (self.pkgKey,)) ++ return map(lambda x: x['ftype'], cur) + - #~ msgid "Options Error: no commands found" - #~ msgstr "Erro nas opções: nenhum comando encontrado" + self._loadFiles() + return RpmBase.returnFileTypes(self) + +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index d7d8859..dfa34b3 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -39,7 +39,7 @@ class GetProvReqOnlyPackageSack(PackageSack): + self._need_index_files = need_files + + def __addPackageToIndex_primary_files(self, obj): +- for ftype in obj.returnFileTypes(): ++ for ftype in obj.returnFileTypes(primary_only=True): + for file in obj.returnFileEntries(ftype, primary_only=True): + self._addToDictAsList(self.filenames, file, obj) + def __addPackageToIndex_files(self, obj): +-- +1.7.0.1 + + +From 94d742bf395cc565cf3a0dca138608a9296b1303 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 15 Apr 2010 13:18:18 -0400 +Subject: [PATCH 65] Add pkg.filterObsoleters(), so we don't have to create the provide + tuple and test "backwards". + Also convert callers. + + We've screwed this up a few times, by doing provides checks instead and +this drops a few lines of code anyway ... so should be good. +--- + yum/__init__.py | 16 +++++++--------- + yum/depsolve.py | 3 +-- + yum/packages.py | 14 ++++++++++++++ + yum/rpmsack.py | 6 ++---- + 4 files changed, 24 insertions(+), 15 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 9e8fad9..ab2e6d5 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2874,11 +2874,9 @@ class YumBase(depsolve.Depsolve): + installed_pkg = self.getInstalledPackageObject(inst_tup) + yield installed_pkg + else: +- for (obs_n, obs_f, (obs_e, obs_v, obs_r)) in po.obsoletes: ++ for obs_n in po.obsoletes_names: + for pkg in self.rpmdb.searchNevra(name=obs_n): +- installedtup = (pkg.name, 'EQ', (pkg.epoch, +- pkg.ver, pkg.release)) +- if po.inPrcoRange('obsoletes', installedtup): ++ if pkg.filterObsoleters([po]): + yield pkg + + def _add_prob_flags(self, *flags): +@@ -3037,11 +3035,11 @@ class YumBase(depsolve.Depsolve): + # pull in foo.i586 when foo.x86_64 already obsoletes the pkg and + # is already installed + already_obs = None +- poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release)) +- for pkg in self.rpmdb.searchNevra(name=obsoleting_pkg.name): +- if pkg.inPrcoRange('obsoletes', poprovtup): +- already_obs = pkg +- continue ++ pkgs = self.rpmdb.searchNevra(name=obsoleting_pkg.name) ++ pkgs = po.filterObsoleters(pkgs, limit=1) ++ if pkgs: ++ already_obs = pkgs[0] ++ continue + + if already_obs: + self.verbose_logger.warning(_('Package %s is obsoleted by %s which is already installed'), +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 48f77d5..8b02d7c 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -1203,8 +1203,7 @@ class Depsolve(object): + pkgresults[po] -= 1024 + + obsoleted = False +- poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release)) +- if nextpo.inPrcoRange('obsoletes', poprovtup): ++ if po.filterObsoleters([nextpo]): + obsoleted = True + pkgresults[po] -= 1024 + +diff --git a/yum/packages.py b/yum/packages.py +index c1a14d0..6108636 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -596,6 +596,20 @@ class RpmBase(object): + using searchFiles(). """ + return self.repo.sack.have_fastReturnFileEntries() + ++ def filterObsoleters(self, obsoleters, limit=0): ++ """ Returns list of obsoleters that obsolete this package. Note that we ++ don't do obsoleting loops. If limit is != 0, then we stop after ++ finding that many. """ ++ provtup = (self.name, 'EQ', (self.epoch, self.version, self.release)) ++ ret = [] ++ for obspo in obsoleters: ++ if obspo.inPrcoRange('obsoletes', provtup): ++ ret.append(obspo) ++ if limit and len(ret) > limit: ++ break ++ return ret + - #~ msgid "Unable to run grubby correctly: the message was:\n" - #~ msgstr "Não foi possível executar o grubby corretamente: a mensagem foi:\n" + - #~ msgid "IOError - # %s - %s" - #~ msgstr "IOError (Erro E/S) - # %s - %s" + + # This is kind of deprecated + class PackageEVR: +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index eba1409..996416b 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -1324,10 +1324,8 @@ class RPMDBPackageSack(PackageSackBase): + continue + obsoleters.append(pkg) + for pkg in sorted(self.returnPackages()): +- provtup = (pkg.name, 'EQ', (pkg.epoch, pkg.version, pkg.release)) +- for obspo in obsoleters: +- if obspo.inPrcoRange('obsoletes', provtup): +- problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo)) ++ for obspo in pkg.filterObsoleters(obsoleters): ++ problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo)) + return problems + + def check_provides(self): +-- +1.7.0.1 + + +From f9b8420f54162289d79e5c8b84291057758a609f Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 15 Apr 2010 15:11:32 -0400 +Subject: [PATCH 66] Add nocontexts to possible ts flag usage, when available + +--- + yum/depsolve.py | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 8b02d7c..e62680f 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -138,6 +138,9 @@ class Depsolve(object): + 'test': rpm.RPMTRANS_FLAG_TEST, + 'justdb': rpm.RPMTRANS_FLAG_JUSTDB, + 'repackage': rpm.RPMTRANS_FLAG_REPACKAGE} ++ # This is only in newer rpm.org releases ++ if hasattr(rpm, 'RPMTRANS_FLAG_NOCONTEXTS'): ++ ts_flags_to_rpm['nocontexts'] = rpm.RPMTRANS_FLAG_NOCONTEXTS + + self._ts.setFlags(0) # reset everything. + +-- +1.7.0.1 + + +From f06b289b3e88cd22948f376509cd84d04263b7aa Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 16 Apr 2010 09:32:53 -0400 +Subject: [PATCH 67] Rename filterObsoleters => obsoletedBy, before it goes public + +--- + yum/__init__.py | 4 ++-- + yum/depsolve.py | 2 +- + yum/packages.py | 2 +- + yum/rpmsack.py | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index ab2e6d5..34f2de7 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2876,7 +2876,7 @@ class YumBase(depsolve.Depsolve): + else: + for obs_n in po.obsoletes_names: + for pkg in self.rpmdb.searchNevra(name=obs_n): +- if pkg.filterObsoleters([po]): ++ if pkg.obsoletedBy([po]): + yield pkg + + def _add_prob_flags(self, *flags): +@@ -3036,7 +3036,7 @@ class YumBase(depsolve.Depsolve): + # is already installed + already_obs = None + pkgs = self.rpmdb.searchNevra(name=obsoleting_pkg.name) +- pkgs = po.filterObsoleters(pkgs, limit=1) ++ pkgs = po.obsoletedBy(pkgs, limit=1) + if pkgs: + already_obs = pkgs[0] + continue +diff --git a/yum/depsolve.py b/yum/depsolve.py +index e62680f..a9e4d55 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -1206,7 +1206,7 @@ class Depsolve(object): + pkgresults[po] -= 1024 + + obsoleted = False +- if po.filterObsoleters([nextpo]): ++ if po.obsoletedBy([nextpo]): + obsoleted = True + pkgresults[po] -= 1024 + +diff --git a/yum/packages.py b/yum/packages.py +index 6108636..e01790c 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -596,7 +596,7 @@ class RpmBase(object): + using searchFiles(). """ + return self.repo.sack.have_fastReturnFileEntries() + +- def filterObsoleters(self, obsoleters, limit=0): ++ def obsoletedBy(self, obsoleters, limit=0): + """ Returns list of obsoleters that obsolete this package. Note that we + don't do obsoleting loops. If limit is != 0, then we stop after + finding that many. """ +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 996416b..7f5b233 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -1324,7 +1324,7 @@ class RPMDBPackageSack(PackageSackBase): + continue + obsoleters.append(pkg) + for pkg in sorted(self.returnPackages()): +- for obspo in pkg.filterObsoleters(obsoleters): ++ for obspo in pkg.obsoletedBy(obsoleters): + problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo)) + return problems + +-- +1.7.0.1 + + +From 2e262a88ef65eb6cd00f1944dc2a3631a7cf9b1f Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 16 Apr 2010 17:32:03 -0400 +Subject: [PATCH 68] Create the ghost files, to make rpmbuild happy + +--- + yum.spec | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/yum.spec b/yum.spec +index 5ece693..a559eda 100644 +--- a/yum.spec ++++ b/yum.spec +@@ -57,6 +57,12 @@ make DESTDIR=$RPM_BUILD_ROOT install + # install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/etc/yum/yum.conf + # install -m 755 %{SOURCE2} $RPM_BUILD_ROOT/etc/cron.daily/yum.cron + ++# Ghost files: ++mkdir -p $RPM_BUILD_ROOT/var/lib/yum/history ++mkdir -p $RPM_BUILD_ROOT/var/lib/yum/plugins ++mkdir -p $RPM_BUILD_ROOT/var/lib/yum/yumdb ++touch $RPM_BUILD_ROOT/var/lib/yum/uuid + - #~ msgid "Kernel Updated/Installed, checking for bootloader" - #~ msgstr "" - #~ "Kernel atualizado/instalado, verificando gerenciador de inicialização" + %find_lang %name + + %clean +-- +1.7.0.1 + + +From c2ad03da2d8c8028d323d2ed2cc6b662b68138fb Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 19 Apr 2010 15:38:30 -0400 +Subject: [PATCH 69] Speedup distro-sync, only get the latest pkgs for those we are interested in + +--- + cli.py | 9 ++++++++- + 1 files changed, 8 insertions(+), 1 deletions(-) + +diff --git a/cli.py b/cli.py +index 1678e65..4d5b538 100644 +--- a/cli.py ++++ b/cli.py +@@ -721,7 +721,14 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + del ipkgs[installed[0]] + + apkgs = {} +- for pkg in self.pkgSack.returnNewestByName(): ++ pkgs = [] ++ if ipkgs: ++ try: ++ pkgs = self.pkgSack.returnNewestByName(patterns=ipkgs.keys()) ++ except Errors.PackageSackError: ++ pkgs = [] + - #~ msgid "Need to pass a list of pkgs to install" - #~ msgstr "É necessário passar uma lista de pacotes para instalar" ++ for pkg in pkgs: + if pkg.name not in ipkgs: + continue + apkgs[pkg.name] = pkg +-- +1.7.0.1 + + +From edabdc811274d3ff6e427a50684ec285e9e330ee Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 19 Apr 2010 15:39:24 -0400 +Subject: [PATCH 70] Add tsInfo.deselect() so we can remove it from anaconda + +--- + yum/transactioninfo.py | 32 ++++++++++++++++++++++++++++++++ + 1 files changed, 32 insertions(+), 0 deletions(-) + +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index dfa34b3..41af838 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -193,6 +193,38 @@ class TransactionData: + + return result + ++ def deselect(self, pattern): ++ """ Remove these packages from the transaction. This is more user ++ orientated than .remove(). Used from kickstart/install -blah. """ + - #~ msgid "Insufficient server config - no servers found. Aborting." - #~ msgstr "" - #~ "Configuração de servidor insuficiente - nenhum servidor encontrado. " - #~ "Abortando." ++ # We don't have a returnPackages() here, so just try the "simple" ++ # specifications. Pretty much 100% hit rate on kickstart. ++ txmbrs = self.matchNaevr(pattern) ++ if not txmbrs: ++ na = pattern.rsplit('.', 2) ++ txmbrs = self.matchNaevr(na[0], na[1]) + - #~ msgid "" - #~ "\n" - #~ " Usage: yum [options] +Date: Mon, 19 Apr 2010 15:40:08 -0400 +Subject: [PATCH 71] Add -pkgname to install etc., so we can test tsInfo.deselect() + +--- + docs/yum.8 | 7 ++++++- + yum/__init__.py | 38 +++++++++++++++++++++++++++++++++----- + 2 files changed, 39 insertions(+), 6 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index 6761f1c..1089b7d 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -89,7 +89,9 @@ group of packages while ensuring that all dependencies are + satisfied\&. (See \fBSpecifying package names\fP for more information) + If no package matches the given package name(s), they are assumed to be a shell + glob and any matches are then installed\&. If the name starts with an +-@ character the rest of the name is used as though passed to the groupinstall command\&. If the name is a file, then install works ++@ character the rest of the name is used as though passed to the groupinstall ++command\&. If the name starts with a - character, then a search is done within ++the transaction and any matches are removed. If the name is a file, then install works + like localinstall\&. If the name doesn't match a package, then package + "provides" are searched (Eg. "_sqlitecache.so()(64bit)") as are + filelists (Eg. "/usr/bin/yum"). Also note that for filelists, wildcards will +@@ -127,6 +129,9 @@ is done by either obsoleting, upgrading or downgrading as appropriate. This will + "normally" do the same thing as the upgrade command however if you have the + package FOO installed at version 4, and the latest available is only + version 3, then this command will \fBdowngrade\fP FOO to version 3. + - #~ msgid "Getting %s" - #~ msgstr "Obtendo %s" ++This command does not perform operations on groups, local packages or negative ++selections. + .IP + .IP "\fBremove\fP or \fBerase\fP" + Are used to remove the specified packages from the system +diff --git a/yum/__init__.py b/yum/__init__.py +index 34f2de7..4fee2c7 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2663,7 +2663,9 @@ class YumBase(depsolve.Depsolve): + def returnPackagesByDep(self, depstring): + """Pass in a generic [build]require string and this function will + pass back the packages it finds providing that dep.""" +- + - #~ msgid "" - #~ "\n" - #~ "Writing header.info file" - #~ msgstr "" - #~ "\n" - #~ "Gravando arquivo header.info" ++ if not depstring: ++ return [] + results = self.pkgSack.searchProvides(depstring) + return results + +@@ -2693,6 +2695,9 @@ class YumBase(depsolve.Depsolve): + """Pass in a generic [build]require string and this function will + pass back the installed packages it finds providing that dep.""" + ++ if not depstring: ++ return [] + - #~ msgid "Gathering header information file(s) from server(s)" - #~ msgstr "" - #~ "Coletando arquivo(s) de informações de cabeçalhos a partir do(s) servidor" - #~ "(es)" + # parse the string out + # either it is 'dep (some operator) e:v-r' + # or /file/dep +@@ -2866,6 +2871,17 @@ class YumBase(depsolve.Depsolve): + pkgnames.update(thisgroup.packages) + return self.pkgSack.searchNames(pkgnames) + ++ def _minus_deselect(self, pattern): ++ """ Remove things from the transaction, like kickstart. """ ++ assert pattern[0] == '-' ++ pat = pattern[1:] + - #~ msgid "Using cached header.info file" - #~ msgstr "Utilizando arquivo header.info do cache" ++ if pat and pat[0] == '@': ++ pat = pat[1:] ++ return self.deselectGroup(pat) + - #~ msgid "localrpmdb not defined" - #~ msgstr "localrpmdb não definido" ++ return self.tsInfo.deselect(pat) + - #~ msgid "Error installing the new bootloader: \n" - #~ msgstr "Erro ao instalar o novo gerenciador de inicialização: \n" + def _find_obsoletees(self, po): + """ Return the pkgs. that are obsoleted by the po we pass in. """ + if not isinstance(po, YumLocalPackage): +@@ -2906,7 +2922,10 @@ class YumBase(depsolve.Depsolve): + raise Errors.InstallError, _('Nothing specified to install') + + if 'pattern' in kwargs: +- if kwargs['pattern'][0] == '@': ++ if kwargs['pattern'] and kwargs['pattern'][0] == '-': ++ return self._minus_deselect(kwargs['pattern']) + - #~ msgid "Error: Could not find the GPG Key necessary to validate pkg %s" - #~ msgstr "" - #~ "Erro: Não foi possível localizar a Chave GPG necessária para validar o " - #~ "pacote %s" ++ if kwargs['pattern'] and kwargs['pattern'][0] == '@': + return self._at_groupinstall(kwargs['pattern']) + + was_pattern = True +@@ -3218,7 +3237,10 @@ class YumBase(depsolve.Depsolve): + + + elif 'pattern' in kwargs: +- if kwargs['pattern'][0] == '@': ++ if kwargs['pattern'] and kwargs['pattern'][0] == '-': ++ return self._minus_deselect(kwargs['pattern']) + - #~ msgid "No actions to take" - #~ msgstr "Nenhuma ação a ser tomada" ++ if kwargs['pattern'] and kwargs['pattern'][0] == '@': + return self._at_groupinstall(kwargs['pattern']) + + (e, m, u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) +@@ -3399,7 +3421,10 @@ class YumBase(depsolve.Depsolve): + pkgs = [po] + else: + if 'pattern' in kwargs: +- if kwargs['pattern'][0] == '@': ++ if kwargs['pattern'] and kwargs['pattern'][0] == '-': ++ return self._minus_deselect(kwargs['pattern']) + - #~ msgid "" - #~ "Available package: %s.%s %s:%s-%s from %s matches with\n" - #~ " %s" - #~ msgstr "" - #~ "Pacote disponível: %s.%s %s:%s-%s de %s resultados com\n" - #~ " %s" ++ if kwargs['pattern'] and kwargs['pattern'][0] == '@': + return self._at_groupremove(kwargs['pattern']) + + (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) +@@ -3693,7 +3718,10 @@ class YumBase(depsolve.Depsolve): + if po: + apkgs = [po] + elif 'pattern' in kwargs: +- if kwargs['pattern'][0] == '@': ++ if kwargs['pattern'] and kwargs['pattern'][0] == '-': ++ return self._minus_deselect(kwargs['pattern']) + - #~ msgid " " - #~ msgstr " " ++ if kwargs['pattern'] and kwargs['pattern'][0] == '@': + apkgs = self._at_groupdowngrade(kwargs['pattern']) + doing_group_pkgs = True # Don't warn. about some things + else: +-- +1.7.0.1 + + +From 00633bee2f6b3987351dd2fef5678f4a481f0057 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 20 Apr 2010 18:10:22 -0400 +Subject: [PATCH 72] Add a simple "how many packages does this provider require" test. + + This only goes one level deep, to keep any performance problems in +check (and because it's hard :), so in theory it can screw up where: + + pkgA => pkgX + pkgX => pkgC + pkgX => pkgD + pkgX => pkgE + + pkgB => pkgY + pkgB => pkgZ + +...with this patch we'd pick "pkgA" because it had "less" requirements, +even though it actually requires 1 more thing. However, real world +result on F12: + +% yum install @core @base gdm +[...] +Resolving: desktop-notification-daemon + + kdebase-runtime => 38 things + xfce4-notifyd => 4 things + notification-daemon => 1 thing + +...all are "equal" before this patch, so it's this or shortest name. +--- + yum/depsolve.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++- + yum/transactioninfo.py | 1 - + 2 files changed, 54 insertions(+), 2 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index a9e4d55..910c9e1 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -27,6 +27,7 @@ import rpmUtils.miscutils + from rpmUtils.arch import archDifference, canCoinstall + import misc + from misc import unique, version_tuple_to_string ++from transactioninfo import TransactionMember + import rpm + + from packageSack import ListPackageSack +@@ -859,7 +860,11 @@ class Depsolve(object): + + self.verbose_logger.log(logginglevels.DEBUG_2, _("looking for %s as a requirement of %s"), req, txmbr) + provs = self.tsInfo.getProvides(*req) +- if not provs: ++ # The self provides should mostly be caught before here now, but ++ # at least config() crack still turns up, it's not that ++ # expensive to just do it, and we really don't want "false positive" ++ # requires for compare_providers(). ++ if not provs and not txmbr.po.inPrcoRange('provides', req): + ret.append( (txmbr.po, self._prco_req2req(req)) ) + continue + +@@ -1228,6 +1233,7 @@ class Depsolve(object): + if res == po: + pkgresults[po] += 5 + ++ # End of O(N*N): for nextpo in pkgs: + if _common_sourcerpm(po, reqpo): + self.verbose_logger.log(logginglevels.DEBUG_4, + _('common sourcerpm %s and %s' % (po, reqpo))) +@@ -1244,6 +1250,53 @@ class Depsolve(object): + + pkgresults[po] += cpl*2 + ++ # If we have more than one "best", see what would happen if we picked ++ # each package ... ie. what things do they require that _aren't_ already ++ # installed/to-be-installed. In theory this can screw up due to: ++ # pkgA => requires pkgX ++ # pkgB => requires pkgY, requires pkgZ ++ # ...but pkgX requires 666 other things. Going recursive is ++ # "non-trivial" though, python != prolog. This seems to do "better" ++ # from simple testing though. ++ bestnum = max(pkgresults.values()) ++ rec_depsolve = {} ++ for po in pkgs: ++ if pkgresults[po] != bestnum: ++ continue ++ rec_depsolve[po] = 0 ++ if len(rec_depsolve) > 1: ++ for po in rec_depsolve: ++ fake_txmbr = TransactionMember(po) + - #~ msgid "Error: Cannot find baseurl or name for server '%s'. Skipping" - #~ msgstr "" - #~ "Erro: Não foi possível localizar a baseurl ou o nome do servidor \"%s\". " - #~ "Ignorando." ++ # Note that this is just requirements, so you could also have ++ # 4 requires for a single package. This might be fixable, if ++ # needed, but given the above it's probably better to leave it ++ # like this. ++ reqs = self._checkInstall(fake_txmbr) ++ rec_depsolve[po] = len(reqs) + - #~ msgid "Odd header %s suddenly disappeared" - #~ msgstr "Cabeçalho indefinido %s desapareceu repentinamente" ++ bestnum = min(rec_depsolve.values()) ++ self.verbose_logger.log(logginglevels.DEBUG_4, ++ _('requires minimal: %d') % bestnum) ++ for po in rec_depsolve: ++ if rec_depsolve[po] == bestnum: ++ self.verbose_logger.log(logginglevels.DEBUG_4, ++ _(' Winner: %s') % po) ++ pkgresults[po] += 1 ++ else: ++ num = rec_depsolve[po] ++ self.verbose_logger.log(logginglevels.DEBUG_4, ++ _(' Loser(with %d): %s') % (num, po)) ++ ++ # We don't want to decide to use a "shortest first", if something else ++ # has told us to pick something else. But we want to pick between ++ # multiple "best" packages. So we spike all the best packages (so ++ # only those can win) and then bump them down by package name length. ++ bestnum = max(pkgresults.values()) ++ for po in pkgs: ++ if pkgresults[po] != bestnum: ++ continue ++ pkgresults[po] += 1000 + pkgresults[po] += (len(po.name)*-1) + + bestorder = sorted(pkgresults.items(), +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index 41af838..508ab65 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -402,7 +402,6 @@ class TransactionData: + self.downgraded.sort() + self.failed.sort() + +- + def addInstall(self, po): + """adds a package as an install but in mode 'u' to the ts + takes a packages object and returns a TransactionMember Object""" +-- +1.7.0.1 + + +From dceec2541cf32915ab0ed9b61df125c1dbb39035 Mon Sep 17 00:00:00 2001 +From: Misha Shnurapet +Date: Fri, 23 Apr 2010 15:18:39 +0000 +Subject: [PATCH 73] l10n: Updates to Russian (ru) translation + +New status: 569 messages complete with 0 fuzzies and 0 untranslated. + +Transmitted-via: Transifex (www.transifex.net). +--- + po/ru.po | 264 +++++++++++++++++++++++++++++++++++++++++++------------------- + 1 files changed, 183 insertions(+), 81 deletions(-) + +diff --git a/po/ru.po b/po/ru.po +index ad4391c..ed31858 100644 +--- a/po/ru.po ++++ b/po/ru.po +@@ -1,7 +1,7 @@ + # Russian translation of yum. + # Copyright (C) 2010 yum's COPYRIGHT HOLDER + # This file is distributed under the same license as the yum package. +-# ++# + # Vladimir Bormotov , 2002 + # Grigory Bakunov , 2002, 2003 + # Timur Malikin , 2010 +@@ -11,7 +11,7 @@ msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" + "POT-Creation-Date: 2010-02-11 10:54-0500\n" +-"PO-Revision-Date: 2010-04-02 02:48+0800\n" ++"PO-Revision-Date: 2010-04-24 00:18+0800\n" + "Last-Translator: Misha Shnurapet \n" + "Language-Team: ru \n" + "MIME-Version: 1.0\n" +@@ -19,40 +19,59 @@ msgstr "" + "Content-Transfer-Encoding: 8bit\n" + "Generated-By: pygettext.py 1.1\n" + +-#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 ++#: ../callback.py:48 ++#: ../output.py:947 ++#: ../yum/rpmtrans.py:72 + msgid "Updating" + msgstr "Обновление" + +-#: ../callback.py:49 ../yum/rpmtrans.py:73 ++#: ../callback.py:49 ++#: ../yum/rpmtrans.py:73 + msgid "Erasing" + msgstr "Удаление" + +-#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 +-#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 ++#: ../callback.py:50 ++#: ../callback.py:51 ++#: ../callback.py:53 ++#: ../output.py:946 ++#: ../output.py:1659 ++#: ../yum/rpmtrans.py:74 ++#: ../yum/rpmtrans.py:75 + #: ../yum/rpmtrans.py:77 + msgid "Installing" + msgstr "Установка" + +-#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 ++#: ../callback.py:52 ++#: ../callback.py:58 ++#: ../output.py:1484 ++#: ../yum/rpmtrans.py:76 + msgid "Obsoleted" + msgstr "Исключено" + +-#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 ++#: ../callback.py:54 ++#: ../output.py:1070 ++#: ../output.py:1442 ++#: ../output.py:1491 + msgid "Updated" + msgstr "Обновлено" + +-#: ../callback.py:55 ../output.py:1438 ++#: ../callback.py:55 ++#: ../output.py:1438 + msgid "Erased" + msgstr "Удалено" + +-#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 +-#: ../output.py:1434 ../output.py:1646 ++#: ../callback.py:56 ++#: ../callback.py:57 ++#: ../callback.py:59 ++#: ../output.py:1068 ++#: ../output.py:1434 ++#: ../output.py:1646 + msgid "Installed" + msgstr "Установлено" + + #: ../callback.py:130 + msgid "No header - huh?" +-msgstr "Заголовка нет — что?!" ++msgstr "Заголовка нет — ага?" + + #: ../callback.py:168 + msgid "Repackage" +@@ -68,11 +87,14 @@ msgstr "Ошибка: неверный выходной статус: %s для + msgid "Erased: %s" + msgstr "Удалено: %s" + +-#: ../callback.py:217 ../output.py:948 ../output.py:1648 ++#: ../callback.py:217 ++#: ../output.py:948 ++#: ../output.py:1648 + msgid "Removing" + msgstr "Удаление" + +-#: ../callback.py:219 ../yum/rpmtrans.py:78 ++#: ../callback.py:219 ++#: ../yum/rpmtrans.py:78 + msgid "Cleanup" + msgstr "Очистка" + +@@ -89,12 +111,15 @@ msgstr "Настройка репозиториев" + msgid "Reading repository metadata in from local files" + msgstr "Чтение локальных метаданных для репозиториев" + +-#: ../cli.py:194 ../utils.py:193 ++#: ../cli.py:194 ++#: ../utils.py:193 + #, python-format + msgid "Config Error: %s" + msgstr "Ошибка конфигурации: %s" + +-#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 ++#: ../cli.py:197 ++#: ../cli.py:1272 ++#: ../utils.py:196 + #, python-format + msgid "Options Error: %s" + msgstr "Ошибка опции: %s" +@@ -158,15 +183,18 @@ msgstr "Загрузка пакетов:" + msgid "Error Downloading Packages:\n" + msgstr "Ошибка загрузки пакетов:\n" + +-#: ../cli.py:426 ../yum/__init__.py:4195 ++#: ../cli.py:426 ++#: ../yum/__init__.py:4195 + msgid "Running rpm_check_debug" + msgstr "Запуск rpm_check_debug" + +-#: ../cli.py:435 ../yum/__init__.py:4204 ++#: ../cli.py:435 ++#: ../yum/__init__.py:4204 + msgid "ERROR You need to update rpm to handle:" + msgstr "ОШИБКА Вам необходимо обновить пакет вручную" + +-#: ../cli.py:437 ../yum/__init__.py:4207 ++#: ../cli.py:437 ++#: ../yum/__init__.py:4207 + msgid "ERROR with rpm_check_debug vs depsolve:" + msgstr "ОШИБКА rpm_check_debug и разрешение зависимостей:" + +@@ -203,28 +231,36 @@ msgstr "" + "Отмена автоматического импорта ключей во время запуска без контроля.\n" + "Используйте \"-y\" для игнорирования." + +-#: ../cli.py:544 ../cli.py:578 ++#: ../cli.py:544 ++#: ../cli.py:578 + msgid " * Maybe you meant: " + msgstr "* Возможно вы имели в виду:" + +-#: ../cli.py:561 ../cli.py:569 ++#: ../cli.py:561 ++#: ../cli.py:569 + #, python-format + msgid "Package(s) %s%s%s available, but not installed." + msgstr "Пакет(ы) %s%s%s доступны, но не установлены." + +-#: ../cli.py:575 ../cli.py:607 ../cli.py:687 ++#: ../cli.py:575 ++#: ../cli.py:607 ++#: ../cli.py:687 + #, python-format + msgid "No package %s%s%s available." + msgstr "Пакет %s%s%s недоступен." + +-#: ../cli.py:612 ../cli.py:748 ++#: ../cli.py:612 ++#: ../cli.py:748 + msgid "Package(s) to install" + msgstr "Пакет(ы) для установки" + +-#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 ++#: ../cli.py:613 ++#: ../cli.py:693 ++#: ../cli.py:727 ++#: ../cli.py:749 + #: ../yumcommands.py:160 + msgid "Nothing to do" +-msgstr "Нечего выполнять" ++msgstr "Выполнять нечего" + + #: ../cli.py:647 + #, python-format +@@ -339,7 +375,10 @@ msgstr "Доступные коллекции:" + msgid "Done" + msgstr "Выполнено" + +-#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 ++#: ../cli.py:988 ++#: ../cli.py:1006 ++#: ../cli.py:1012 ++#: ../yum/__init__.py:2788 + #, python-format + msgid "Warning: Group %s does not exist." + msgstr "Внимание: коллекции %s не существует." +@@ -353,7 +392,8 @@ msgstr "Во всех указанных коллекциях пакеты дл + msgid "%d Package(s) to Install" + msgstr "%d Пакет(ы) для установки" + +-#: ../cli.py:1028 ../yum/__init__.py:2800 ++#: ../cli.py:1028 ++#: ../yum/__init__.py:2800 + #, python-format + msgid "No group named %s exists" + msgstr "Коллекции с названием %s не существует" +@@ -784,7 +824,8 @@ msgstr "Обновление зависимостей" + msgid "Removing for dependencies" + msgstr "Удаление зависимостей" + +-#: ../output.py:960 ../output.py:1072 ++#: ../output.py:960 ++#: ../output.py:1072 + msgid "Skipped (dependency problems)" + msgstr "Пропущено (ошибка зависимостей)" + +@@ -936,7 +977,8 @@ msgstr "Передан(ы) неверный код действий или па + msgid "ID" + msgstr "ID" + +-#: ../output.py:1267 ../output.py:1520 ++#: ../output.py:1267 ++#: ../output.py:1520 + msgid "Login user" + msgstr "Вход пользователя" + +@@ -944,11 +986,13 @@ msgstr "Вход пользователя" + msgid "Date and time" + msgstr "Дата и время" + +-#: ../output.py:1269 ../output.py:1522 ++#: ../output.py:1269 ++#: ../output.py:1522 + msgid "Action(s)" + msgstr "Действия" + +-#: ../output.py:1270 ../output.py:1523 ++#: ../output.py:1270 ++#: ../output.py:1523 + msgid "Altered" + msgstr "Изменено" + +@@ -980,7 +1024,8 @@ msgstr "Код операции:" + msgid "Begin time :" + msgstr "Время начала:" + +-#: ../output.py:1401 ../output.py:1403 ++#: ../output.py:1401 ++#: ../output.py:1403 + msgid "Begin rpmdb :" + msgstr "Начало базы данных RPM:" + +@@ -993,7 +1038,8 @@ msgstr "(%s секунд)" + msgid "End time :" + msgstr "Конечное время:" + +-#: ../output.py:1421 ../output.py:1423 ++#: ../output.py:1421 ++#: ../output.py:1423 + msgid "End rpmdb :" + msgstr "Конец базы данных RPM:" + +@@ -1001,7 +1047,9 @@ msgstr "Конец базы данных RPM:" + msgid "User :" + msgstr "Пользователь:" + +-#: ../output.py:1426 ../output.py:1428 ../output.py:1430 ++#: ../output.py:1426 ++#: ../output.py:1428 ++#: ../output.py:1430 + msgid "Return-Code :" + msgstr "Код возврата:" + +@@ -1021,7 +1069,8 @@ msgstr "Успешно" + msgid "Transaction performed with:" + msgstr "Действие выполнено:" + +-#: ../output.py:1444 ../output.py:1489 ++#: ../output.py:1444 ++#: ../output.py:1489 + msgid "Downgraded" + msgstr "Откат версии" + +@@ -1042,7 +1091,8 @@ msgstr "Вывод сценария:" + msgid "Errors:" + msgstr "Ошибки:" + +-#: ../output.py:1481 ../output.py:1482 ++#: ../output.py:1481 ++#: ../output.py:1482 + msgid "Install" + msgstr "Установка " + +@@ -1136,7 +1186,8 @@ msgstr "--> Перепроверка зависимостей с новыми п + msgid "--> Finished Dependency Resolution" + msgstr "--> Проверка зависимостей окончена" + +-#: ../output.py:1614 ../output.py:1619 ++#: ../output.py:1614 ++#: ../output.py:1619 + #, python-format + msgid "--> Processing Dependency: %s for package: %s" + msgstr "--> Обработка зависимостей: %s для пакета: %s" +@@ -1160,7 +1211,8 @@ msgstr "" + "\n" + " Необходимо: %s" + +-#: ../output.py:1649 ../output.py:1660 ++#: ../output.py:1649 ++#: ../output.py:1660 + #, python-format + msgid "" + "\n" +@@ -1173,7 +1225,8 @@ msgstr "" + msgid "Available" + msgstr "Доступно" + +-#: ../output.py:1665 ../output.py:1670 ++#: ../output.py:1665 ++#: ../output.py:1670 + #, python-format + msgid "--> Processing Conflict: %s conflicts %s" + msgstr "--> Обработка конфликта: %s конфликтует с %s" +@@ -1207,7 +1260,8 @@ msgstr "Зомби" + msgid "Traced/Stopped" + msgstr "Трассировано/Остановлено" + +-#: ../utils.py:98 ../yumcommands.py:917 ++#: ../utils.py:98 ++#: ../yumcommands.py:917 + msgid "Unknown" + msgstr "Неизвестно" + +@@ -1245,7 +1299,8 @@ msgstr "Ошибка PluginExit: %s" + msgid "Yum Error: %s" + msgstr "Ошибка Yum: %s" + +-#: ../utils.py:235 ../yummain.py:42 ++#: ../utils.py:235 ++#: ../yummain.py:42 + msgid "" + "\n" + "\n" +@@ -1255,7 +1310,8 @@ msgstr "" + "\n" + "Выход по запросу пользователя" + +-#: ../utils.py:241 ../yummain.py:48 ++#: ../utils.py:241 ++#: ../yummain.py:48 + msgid "" + "\n" + "\n" +@@ -1265,7 +1321,8 @@ msgstr "" + "\n" + "Выход из-за разрыва связи" + +-#: ../utils.py:243 ../yummain.py:50 ++#: ../utils.py:243 ++#: ../yummain.py:50 + #, python-format + msgid "" + "\n" +@@ -1276,7 +1333,8 @@ msgstr "" + "\n" + "%s" + +-#: ../utils.py:282 ../yummain.py:211 ++#: ../utils.py:282 ++#: ../yummain.py:211 + msgid "Complete!" + msgstr "Готово!" + +@@ -1400,7 +1458,9 @@ msgid "Updated Packages" + msgstr "Обновленные пакеты" + + #. This only happens in verbose mode +-#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 ++#: ../yumcommands.py:317 ++#: ../yumcommands.py:324 ++#: ../yumcommands.py:601 + msgid "Obsoleting Packages" + msgstr "Исключенные пакеты" + +@@ -1528,11 +1588,13 @@ msgstr "Поиск зависимостей:" + msgid "Display the configured software repositories" + msgstr "Отобразить сконфигурированные репозитории ПО" + +-#: ../yumcommands.py:822 ../yumcommands.py:823 ++#: ../yumcommands.py:822 ++#: ../yumcommands.py:823 + msgid "enabled" + msgstr "включено" + +-#: ../yumcommands.py:849 ../yumcommands.py:850 ++#: ../yumcommands.py:849 ++#: ../yumcommands.py:850 + msgid "disabled" + msgstr "отключено" + +@@ -1621,11 +1683,14 @@ msgstr "Исключено из репозитория:" + + #. Work out the first (id) and last (enabled/disalbed/count), + #. then chop the middle (name)... +-#: ../yumcommands.py:951 ../yumcommands.py:980 ++#: ../yumcommands.py:951 ++#: ../yumcommands.py:980 + msgid "repo id" + msgstr "Идентификатор репозитория" + +-#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 ++#: ../yumcommands.py:968 ++#: ../yumcommands.py:969 ++#: ../yumcommands.py:987 + msgid "status" + msgstr "состояние" + +@@ -1727,12 +1792,14 @@ msgstr "Проверка проблем в базе данных RPM" + msgid "Another app is currently holding the yum lock; waiting for it to exit..." + msgstr "Еще одно приложение, в настоящее время блокирует Yum. Подождите..." + +-#: ../yummain.py:130 ../yummain.py:169 ++#: ../yummain.py:130 ++#: ../yummain.py:169 + #, python-format + msgid "Error: %s" + msgstr "Ошибка: %s" + +-#: ../yummain.py:140 ../yummain.py:182 ++#: ../yummain.py:140 ++#: ../yummain.py:182 + #, python-format + msgid "Unknown Error(s): Exit Code: %d:" + msgstr "Неизвестная ошибка(ошибки): Код выхода:%d:" +@@ -1746,7 +1813,8 @@ msgstr "Разрешение зависимостей" + msgid " You could try using --skip-broken to work around the problem" + msgstr " Вы можете попробовать --skip-broken чтобы обойти проблему." + +-#: ../yummain.py:175 ../yummain.py:208 ++#: ../yummain.py:175 ++#: ../yummain.py:208 + msgid " You could try running: rpm -Va --nofiles --nodigest" + msgstr " Вы можете попробовать запустить: rpm -Va --nofiles --nodigest" + +@@ -1801,7 +1869,8 @@ msgstr "%s подходит как требуемый для %s" + msgid "Member: %s" + msgstr "Член: %s" + +-#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 ++#: ../yum/depsolve.py:239 ++#: ../yum/depsolve.py:754 + #, python-format + msgid "%s converted to install" + msgstr "%s преобразован для установки" +@@ -1906,11 +1975,13 @@ msgstr "TSINFO: %s отмечен как обновление для %s" + msgid "TSINFO: Marking %s as install for %s" + msgstr "TSINFO: Отмечен %s чтобы установить %s" + +-#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 ++#: ../yum/depsolve.py:690 ++#: ../yum/depsolve.py:781 + msgid "Success - empty transaction" + msgstr "Успешно — холостое задание" + +-#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 ++#: ../yum/depsolve.py:729 ++#: ../yum/depsolve.py:744 + msgid "Restarting Loop" + msgstr "Перезапуск петли" + +@@ -1942,7 +2013,8 @@ msgstr "поиск %s требуется для %s" + msgid "Running compare_providers() for %s" + msgstr "Запуск compare_providers() для %s" + +-#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 ++#: ../yum/depsolve.py:1117 ++#: ../yum/depsolve.py:1123 + #, python-format + msgid "better arch in po %s" + msgstr "Лучший архив в %s" +@@ -2174,7 +2246,8 @@ msgstr "Пакет не совпадает с контрольной суммо + msgid "package fails checksum but caching is enabled for %s" + msgstr "проверка контрольной суммы неудачна, но кэширование включено для %s" + +-#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 ++#: ../yum/__init__.py:1534 ++#: ../yum/__init__.py:1563 + #, python-format + msgid "using local copy of %s" + msgstr "использование локальной копии %s" +@@ -2285,14 +2358,19 @@ msgstr "Результат совпадений: %s" + msgid "No group data available for configured repositories" + msgstr "Для настроеных репозиториев данных коллекций нет" + +-#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 +-#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 ++#: ../yum/__init__.py:2355 ++#: ../yum/__init__.py:2374 ++#: ../yum/__init__.py:2405 ++#: ../yum/__init__.py:2411 ++#: ../yum/__init__.py:2493 ++#: ../yum/__init__.py:2497 + #: ../yum/__init__.py:2814 + #, python-format + msgid "No Group named %s exists" + msgstr "Коллекции с названием %s не существует" + +-#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 ++#: ../yum/__init__.py:2386 ++#: ../yum/__init__.py:2513 + #, python-format + msgid "package %s was not marked in group %s" + msgstr "пакет %s не отмечен в коллекции %s" +@@ -2317,11 +2395,13 @@ msgstr "Кортеж пакетов %s не найден в наборе пак + msgid "Package tuple %s could not be found in rpmdb" + msgstr "Кортеж пакетов %s не найден в базе RPM" + +-#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 ++#: ../yum/__init__.py:2614 ++#: ../yum/__init__.py:2664 + msgid "Invalid version flag" + msgstr "Hеверная версия флага %s" + +-#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 ++#: ../yum/__init__.py:2634 ++#: ../yum/__init__.py:2639 + #, python-format + msgid "No Package found for %s" + msgstr "Пакет %s не найден" +@@ -2334,12 +2414,15 @@ msgstr "Объект пакета не являлся экземпляром о + msgid "Nothing specified to install" + msgstr "Ничего не отмечено для установки" + +-#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 ++#: ../yum/__init__.py:2875 ++#: ../yum/__init__.py:3652 + #, python-format + msgid "Checking for virtual provide or file-provide for %s" + msgstr "Проверка виртуального провайдера или файлового провайдера для %s" + +-#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 ++#: ../yum/__init__.py:2881 ++#: ../yum/__init__.py:3197 ++#: ../yum/__init__.py:3365 + #: ../yum/__init__.py:3658 + #, python-format + msgid "No Match for argument: %s" +@@ -2372,25 +2455,28 @@ msgstr "Пакет %s недействителен из-за %s, попытка + #: ../yum/__init__.py:3009 + #, python-format + msgid "Package %s already installed and latest version" +-msgstr "Пакет %s уже установлен, и это последняя версия." ++msgstr "Пакет %s уже установлен, и это новейшая версия." + + #: ../yum/__init__.py:3023 + #, python-format + msgid "Package matching %s already installed. Checking for update." +-msgstr "Пакет %s уже установлен.Проверка для обновления." ++msgstr "Пакет %s уже установлен. Проверка обновлений." + + #. update everything (the easy case) + #: ../yum/__init__.py:3126 + msgid "Updating Everything" + msgstr "Полное обновление" + +-#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 ++#: ../yum/__init__.py:3147 ++#: ../yum/__init__.py:3262 ++#: ../yum/__init__.py:3289 + #: ../yum/__init__.py:3315 + #, python-format + msgid "Not Updating Package that is already obsoleted: %s.%s %s:%s-%s" + msgstr "Устаревший и уже необновляемый пакет: %s.%s %s:%s-%s" + +-#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 ++#: ../yum/__init__.py:3182 ++#: ../yum/__init__.py:3362 + #, python-format + msgid "%s" + msgstr "%s" +@@ -2405,7 +2491,8 @@ msgstr "Пакет уже недействителен:%s.%s %s:%s-%s" + msgid "Not Updating Package that is obsoleted: %s" + msgstr "Устаревший необновляемый пакет: %s" + +-#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 ++#: ../yum/__init__.py:3293 ++#: ../yum/__init__.py:3319 + #, python-format + msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s" + msgstr "Необновленный пакет, который был обновлен ранее: %s.%s %s:%s-%s" +@@ -2419,12 +2506,16 @@ msgstr "Нет пакетов для удаления" + msgid "Cannot open: %s. Skipping." + msgstr "Невозможно открыть: %s. Пропуск." + +-#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 ++#: ../yum/__init__.py:3415 ++#: ../yum/__init__.py:3514 ++#: ../yum/__init__.py:3598 + #, python-format + msgid "Examining %s: %s" + msgstr "Проверка %s: %s" + +-#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 ++#: ../yum/__init__.py:3423 ++#: ../yum/__init__.py:3517 ++#: ../yum/__init__.py:3601 + #, python-format + msgid "Cannot add package %s to transaction. Not a compatible architecture: %s" + msgstr "Невозможно добавить пакет %s в список действий. Несовместимая архитектура: %s" +@@ -2434,7 +2525,9 @@ msgstr "Невозможно добавить пакет %s в список де + msgid "Package %s not installed, cannot update it. Run yum install to install it instead." + msgstr "Пакет %s не установлен, невозможно обновить его. Запустите yum для установки заместо обновления." + +-#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 ++#: ../yum/__init__.py:3460 ++#: ../yum/__init__.py:3522 ++#: ../yum/__init__.py:3606 + #, python-format + msgid "Excluding %s" + msgstr "Удаление %s" +@@ -2454,7 +2547,8 @@ msgstr "%s отмечен как обновление для %s" + msgid "%s: does not update installed package." + msgstr "%s: не обновляет установленный пакет" + +-#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 ++#: ../yum/__init__.py:3511 ++#: ../yum/__init__.py:3595 + #, python-format + msgid "Cannot open file: %s. Skipping." + msgstr "Невозможно открыть файл %s. Пропуск." +@@ -2463,7 +2557,8 @@ msgstr "Невозможно открыть файл %s. Пропуск." + msgid "Problem in reinstall: no package matched to remove" + msgstr "Проблема при переустановке: не найден пакет для удаления" + +-#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 ++#: ../yum/__init__.py:3554 ++#: ../yum/__init__.py:3686 + #, python-format + msgid "Package %s is allowed multiple installs, skipping" + msgstr "Пакет %s может быть повторно установлен, пропуск" +@@ -2487,7 +2582,8 @@ msgstr "Пакеты недоступны: %s" + msgid "Only Upgrade available on package: %s" + msgstr "Только переход к следующей версии доступен для пакета: : %s" + +-#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 ++#: ../yum/__init__.py:3808 ++#: ../yum/__init__.py:3845 + #, python-format + msgid "Failed to downgrade: %s" + msgstr "Ошибка отката версии: %s" +@@ -2517,7 +2613,8 @@ msgid "GPG key at %s (0x%s) is already installed" + msgstr "GPG ключ %s (0x%s) уже установлен" + + #. Try installing/updating GPG key +-#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 ++#: ../yum/__init__.py:3949 ++#: ../yum/__init__.py:4011 + #, python-format + msgid "Importing GPG key 0x%s \"%s\" from %s" + msgstr "Импорт GPG ключа 0x%s \"%s\" из %s" +@@ -2531,11 +2628,13 @@ msgstr "Не установлен ключ" + msgid "Key import failed (code %d)" + msgstr "Неудача импорта ключа (code %d)" + +-#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 ++#: ../yum/__init__.py:3973 ++#: ../yum/__init__.py:4032 + msgid "Key imported successfully" + msgstr "Импорт ключа успешно завершен" + +-#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 ++#: ../yum/__init__.py:3978 ++#: ../yum/__init__.py:4037 + #, python-format + msgid "" + "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" +@@ -2589,7 +2688,8 @@ msgstr "Невозможно задать кэш-папку: %s" + msgid "Loaded plugins: " + msgstr "Загружены модули:" + +-#: ../yum/plugins.py:216 ../yum/plugins.py:222 ++#: ../yum/plugins.py:216 ++#: ../yum/plugins.py:222 + #, python-format + msgid "No plugin match for: %s" + msgstr "Нет модуля: %s" +@@ -2676,8 +2776,10 @@ msgstr "Невозможно открыть базу RPM для чтения. В + msgid "Got an empty Header, something has gone wrong" + msgstr "Получен пустой заголовок, что-то не так" + +-#: ../rpmUtils/oldUtils.py:253 ../rpmUtils/oldUtils.py:260 +-#: ../rpmUtils/oldUtils.py:263 ../rpmUtils/oldUtils.py:266 ++#: ../rpmUtils/oldUtils.py:253 ++#: ../rpmUtils/oldUtils.py:260 ++#: ../rpmUtils/oldUtils.py:263 ++#: ../rpmUtils/oldUtils.py:266 + #, python-format + msgid "Damaged Header %s" + msgstr "Поврежденный заголовок %s" +-- +1.7.0.1 + + +From 7f5600232c8b8027663af447ce985d37f654cc6b Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sun, 25 Apr 2010 00:46:03 -0400 +Subject: [PATCH 74] Fix typo s/link/islink/ on new fsvars. feature + +--- + yum/config.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/config.py b/yum/config.py +index 3e91735..5e1dd55 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -880,7 +880,7 @@ def readMainConfig(startupconf): + except OSError: + fsvars = [] + for fsvar in fsvars: +- if os.path.link(dir_fsvars + fsvar): ++ if os.path.islink(dir_fsvars + fsvar): + continue + try: + val = open(dir_fsvars + fsvar).readline() +-- +1.7.0.1 + + +From b679453f8b5f8507ad3e8ff202475431345b1908 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Sun, 25 Apr 2010 23:04:49 +0300 +Subject: [PATCH 75] Get rid of uses of has_key(). + +--- + cli.py | 2 +- + rpmUtils/transaction.py | 7 +++---- + rpmUtils/updates.py | 40 ++++++++++++++++++++-------------------- + yum-updatesd.py | 8 ++------ + yum/__init__.py | 15 +++++---------- + yum/comps.py | 21 +++++++++------------ + yum/depsolve.py | 2 +- + yum/mdparser.py | 2 +- + yum/packageSack.py | 13 ++++++------- + yum/packages.py | 33 +++++++++++++-------------------- + yum/pgpmsg.py | 6 ++---- + yum/repos.py | 2 +- + yum/rpmsack.py | 9 +++------ + yum/sqlitesack.py | 10 ++++------ + yum/transactioninfo.py | 6 +++--- + yum/update_md.py | 4 ++-- + yum/yumRepo.py | 20 +++++++++----------- + 17 files changed, 85 insertions(+), 115 deletions(-) + +diff --git a/cli.py b/cli.py +index 4d5b538..4479a5e 100644 +--- a/cli.py ++++ b/cli.py +@@ -345,7 +345,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + p = re.compile('needs (\d+)MB on the (\S+) filesystem') + disk = {} + for m in p.finditer(errstring): +- if not disk.has_key(m.group(2)): ++ if m.group(2) not in disk: + disk[m.group(2)] = int(m.group(1)) + if disk[m.group(2)] < int(m.group(1)): + disk[m.group(2)] = int(m.group(1)) +diff --git a/rpmUtils/transaction.py b/rpmUtils/transaction.py +index 329de69..d50e201 100644 +--- a/rpmUtils/transaction.py ++++ b/rpmUtils/transaction.py +@@ -94,9 +94,8 @@ class TransactionWrapper: + self.addTsFlag(rpm.RPMTRANS_FLAG_TEST) + # FIXME GARBAGE - remove once this is reimplemented elsehwere + # KEEPING FOR API COMPLIANCE ONLY +- if conf.has_key('diskspacecheck'): +- if conf['diskspacecheck'] == 0: +- self.ts.setProbFilter(rpm.RPMPROB_FILTER_DISKSPACE) ++ if conf.get('diskspacecheck') == 0: ++ self.ts.setProbFilter(rpm.RPMPROB_FILTER_DISKSPACE) + tserrors = self.ts.run(cb.callback, '') + + reserrors = [] +@@ -151,7 +150,7 @@ class TransactionWrapper: + preq = 0 + tup = miscutils.pkgTupleFromHeader(h) + for p in _return_all_provides(h): +- if req.has_key(p): ++ if p in req: + # Don't count a package that provides its require + s = req[p] + if len(s) > 1 or tup not in s: +diff --git a/rpmUtils/updates.py b/rpmUtils/updates.py +index 935a4ac..c231f5c 100644 +--- a/rpmUtils/updates.py ++++ b/rpmUtils/updates.py +@@ -91,7 +91,7 @@ class Updates: + self._delFromDict(self.updating_dict, self.updatesdict.get(pkgtup, []), pkgtup) + self._delFromDict(self.updatesdict, self.updating_dict.get(pkgtup, []), pkgtup) + +- if self.rawobsoletes.has_key(pkgtup): ++ if pkgtup in self.rawobsoletes: + if self._obsoletes_by_name: + for name, flag, version in self.rawobsoletes[pkgtup]: + self._delFromDict(self._obsoletes_by_name, [name], (flag, version, pkgtup)) +@@ -111,12 +111,12 @@ class Updates: + + returndict = {} + for (n, a, e, v, r) in pkglist: +- if not returndict.has_key((n, a)): ++ if (n, a) not in returndict: + returndict[(n, a)] = [] + returndict[(n, a)].append((e,v,r)) + + if Nonelists: +- if not returndict.has_key((n, None)): ++ if (n, None) not in returndict: + returndict[(n, None)] = [] + returndict[(n, None)].append((a, e, v, r)) + +@@ -199,7 +199,7 @@ class Updates: + returndict = {} + for new in obslist: + for old in obsdict[new]: +- if not returndict.has_key(old): ++ if old not in returndict: + returndict[old] = [] + returndict[old].append(new) + +@@ -221,21 +221,21 @@ class Updates: + # + obs_arches = {} + for (n, a, e, v, r) in self.rawobsoletes: +- if not obs_arches.has_key(n): ++ if n not in obs_arches: + obs_arches[n] = [] + obs_arches[n].append(a) + + for pkgtup in self.rawobsoletes: + (name, arch, epoch, ver, rel) = pkgtup + for (obs_n, flag, (obs_e, obs_v, obs_r)) in self.rawobsoletes[(pkgtup)]: +- if self.installdict.has_key((obs_n, None)): ++ if (obs_n, None) in self.installdict: + for (rpm_a, rpm_e, rpm_v, rpm_r) in self.installdict[(obs_n, None)]: + if flag in [None, 0] or \ + rpmUtils.miscutils.rangeCheck((obs_n, flag, (obs_e, obs_v, obs_r)), + (obs_n, rpm_a, rpm_e, rpm_v, rpm_r)): + # make sure the obsoleting pkg is not already installed + willInstall = 1 +- if self.installdict.has_key((name, None)): ++ if (name, None) in self.installdict: + for (ins_a, ins_e, ins_v, ins_r) in self.installdict[(name, None)]: + pkgver = (epoch, ver, rel) + installedver = (ins_e, ins_v, ins_r) +@@ -245,7 +245,7 @@ class Updates: + if rpm_a != arch and rpm_a in obs_arches[name]: + willInstall = 0 + if willInstall: +- if not obsdict.has_key(pkgtup): ++ if pkgtup not in obsdict: + obsdict[pkgtup] = [] + obsdict[pkgtup].append((obs_n, rpm_a, rpm_e, rpm_v, rpm_r)) + self.obsoletes = obsdict +@@ -258,7 +258,7 @@ class Updates: + self.obsoleted_dict = {} + for new in self.obsoletes: + for old in self.obsoletes[new]: +- if not self.obsoleted_dict.has_key(old): ++ if old not in self.obsoleted_dict: + self.obsoleted_dict[old] = [] + self.obsoleted_dict[old].append(new) + self.obsoleting_dict = {} +@@ -309,7 +309,7 @@ class Updates: + + for (n, a) in newpkgs: + # simple ones - look for exact matches or older stuff +- if self.installdict.has_key((n, a)): ++ if (n, a) in self.installdict: + for (rpm_e, rpm_v, rpm_r) in self.installdict[(n, a)]: + try: + (e, v, r) = self.returnNewest(newpkgs[(n,a)]) +@@ -362,14 +362,14 @@ class Updates: + for (n, a) in simpleupdate: + # try to be as precise as possible + if n in self.exactarchlist: +- if self.installdict.has_key((n, a)): ++ if (n, a) in self.installdict: + (rpm_e, rpm_v, rpm_r) = self.returnNewest(self.installdict[(n, a)]) +- if newpkgs.has_key((n,a)): ++ if (n, a) in newpkgs: + (e, v, r) = self.returnNewest(newpkgs[(n, a)]) + rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) + if rc > 0: + # this is definitely an update - put it in the dict +- if not updatedict.has_key((n, a, rpm_e, rpm_v, rpm_r)): ++ if (n, a, rpm_e, rpm_v, rpm_r) not in updatedict: + updatedict[(n, a, rpm_e, rpm_v, rpm_r)] = [] + updatedict[(n, a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) + +@@ -379,12 +379,12 @@ class Updates: + # we just need to find the arch of the installed pkg so we can + # check it's (e, v, r) + (rpm_a, rpm_e, rpm_v, rpm_r) = self.installdict[(n, None)][0] +- if newpkgs.has_key((n, None)): ++ if (n, None) in newpkgs: + for (a, e, v, r) in newpkgs[(n, None)]: + rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) + if rc > 0: + # this is definitely an update - put it in the dict +- if not updatedict.has_key((n, rpm_a, rpm_e, rpm_v, rpm_r)): ++ if (n, rpm_a, rpm_e, rpm_v, rpm_r) not in updatedict: + updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = [] + updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) + +@@ -400,7 +400,7 @@ class Updates: + + archlists = [] + if self._is_multilib: +- if rpmUtils.arch.multilibArches.has_key(self.myarch): ++ if self.myarch in rpmUtils.arch.multilibArches: + biarches = [self.myarch] + else: + biarches = [self.myarch, rpmUtils.arch.arches[self.myarch]] +@@ -445,7 +445,7 @@ class Updates: + rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) + if rc > 0: + # this is definitely an update - put it in the dict +- if not updatedict.has_key((n, a, rpm_e, rpm_v, rpm_r)): ++ if (n, a, rpm_e, rpm_v, rpm_r) not in updatedict: + updatedict[(n, a, rpm_e, rpm_v, rpm_r)] = [] + updatedict[(n, a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) + else: +@@ -479,7 +479,7 @@ class Updates: + rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) + if rc > 0: + # this is definitely an update - put it in the dict +- if not updatedict.has_key((n, rpm_a, rpm_e, rpm_v, rpm_r)): ++ if (n, rpm_a, rpm_e, rpm_v, rpm_r) not in updatedict: + updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = [] + updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) + +@@ -493,7 +493,7 @@ class Updates: + self.updating_dict = {} + for old in self.updatesdict: + for new in self.updatesdict[old]: +- if not self.updating_dict.has_key(new): ++ if new not in self.updating_dict: + self.updating_dict[new] = [] + self.updating_dict[new].append(old) + +@@ -688,7 +688,7 @@ class Updates: + highdict = {} + for pkgtup in tuplelist: + (n, a, e, v, r) = pkgtup +- if not highdict.has_key((n, a)): ++ if (n, a) not in highdict: + highdict[(n, a)] = pkgtup + else: + pkgtup2 = highdict[(n, a)] +diff --git a/yum-updatesd.py b/yum-updatesd.py +index f96940c..1ce4720 100644 +--- a/yum-updatesd.py ++++ b/yum-updatesd.py +@@ -118,9 +118,7 @@ class SyslogUpdateEmitter(UpdateEmitter): + "DEBUG": syslog.LOG_DEBUG } + if type(lvl) == int: + return lvl +- if level_map.has_key(lvl.upper()): +- return level_map[lvl.upper()] +- return syslog.LOG_INFO ++ return level_map.get(lvl.upper(), syslog.LOG_INFO) + + def _facilityMap(self, facility): + facility_map = { "KERN": syslog.LOG_KERN, +@@ -142,9 +140,7 @@ class SyslogUpdateEmitter(UpdateEmitter): + "LOCAL7": syslog.LOG_LOCAL7,} + if type(facility) == int: + return facility +- elif facility_map.has_key(facility.upper()): +- return facility_map[facility.upper()] +- return syslog.LOG_DAEMON ++ return facility_map.get(facility.upper(), syslog.LOG_DAEMON) + + + class EmailUpdateEmitter(UpdateEmitter): +diff --git a/yum/__init__.py b/yum/__init__.py +index 4fee2c7..a2851bd 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2110,10 +2110,7 @@ class YumBase(depsolve.Depsolve): + the search keys in the results. """ + sql_fields = [] + for f in fields: +- if RPM_TO_SQLITE.has_key(f): +- sql_fields.append(RPM_TO_SQLITE[f]) +- else: +- sql_fields.append(f) ++ sql_fields.append(RPM_TO_SQLITE.get(f, f)) + + # yield the results in order of most terms matched first + sorted_lists = {} # count_of_matches = [(pkgobj, +@@ -2258,7 +2255,7 @@ class YumBase(depsolve.Depsolve): + for (po, matched_strings) in match_gen: + if callback: + callback(po, matched_strings) +- if not matches.has_key(po): ++ if po not in matches: + matches[po] = [] + + matches[po].extend(matched_strings) +@@ -2550,7 +2547,7 @@ class YumBase(depsolve.Depsolve): + + pkgs = packagesNewestByName(pkgs) + +- if not self.tsInfo.conditionals.has_key(cond): ++ if cond not in self.tsInfo.conditionals: + self.tsInfo.conditionals[cond] = [] + self.tsInfo.conditionals[cond].extend(pkgs) + return txmbrs_used +@@ -2994,7 +2991,7 @@ class YumBase(depsolve.Depsolve): + + pkgbyname = {} + for pkg in pkgs: +- if not pkgbyname.has_key(pkg.name): ++ if pkg.name not in pkgbyname: + pkgbyname[pkg.name] = [ pkg ] + else: + pkgbyname[pkg.name].append(pkg) +@@ -4363,9 +4360,7 @@ class YumBase(depsolve.Depsolve): + newrepo = yumRepo.YumRepository(repoid) + newrepo.name = repoid + newrepo.basecachedir = self.conf.cachedir +- var_convert = True +- if kwargs.has_key('variable_convert') and not kwargs['variable_convert']: +- var_convert = False ++ var_convert = kwargs.get('variable_convert', True) + + if baseurls: + replaced = [] +diff --git a/yum/comps.py b/yum/comps.py +index bbc1ac9..bf070fa 100755 +--- a/yum/comps.py ++++ b/yum/comps.py +@@ -32,10 +32,7 @@ from misc import get_my_lang_code + lang_attr = '{http://www.w3.org/XML/1998/namespace}lang' + + def parse_boolean(strng): +- if BOOLEAN_STATES.has_key(strng.lower()): +- return BOOLEAN_STATES[strng.lower()] +- else: +- return False ++ return BOOLEAN_STATES.get(strng.lower(), False) + + def parse_number(strng): + return int(strng) +@@ -235,11 +232,11 @@ class Group(CompsObj): + + # name and description translations + for lang in obj.translated_name: +- if not self.translated_name.has_key(lang): ++ if lang not in self.translated_name: + self.translated_name[lang] = obj.translated_name[lang] + + for lang in obj.translated_description: +- if not self.translated_description.has_key(lang): ++ if lang not in self.translated_description: + self.translated_description[lang] = obj.translated_description[lang] + + def xml(self): +@@ -348,11 +345,11 @@ class Category(CompsObj): + + # name and description translations + for lang in obj.translated_name: +- if not self.translated_name.has_key(lang): ++ if lang not in self.translated_name: + self.translated_name[lang] = obj.translated_name[lang] + + for lang in obj.translated_description: +- if not self.translated_description.has_key(lang): ++ if lang not in self.translated_description: + self.translated_description[lang] = obj.translated_description[lang] + + def xml(self): +@@ -424,7 +421,7 @@ class Comps(object): + + for item in group_pattern.split(','): + item = item.strip() +- if self._groups.has_key(item): ++ if item in self._groups: + thisgroup = self._groups[item] + returns[thisgroup.groupid] = thisgroup + continue +@@ -490,14 +487,14 @@ class Comps(object): + return returns.values() + + def add_group(self, group): +- if self._groups.has_key(group.groupid): ++ if group.groupid in self._groups: + thatgroup = self._groups[group.groupid] + thatgroup.add(group) + else: + self._groups[group.groupid] = group + + def add_category(self, category): +- if self._categories.has_key(category.categoryid): ++ if category.categoryid in self._categories: + thatcat = self._categories[category.categoryid] + thatcat.add(category) + else: +@@ -557,7 +554,7 @@ class Comps(object): + check_pkgs = group.optional_packages.keys() + group.default_packages.keys() + group.conditional_packages.keys() + group.installed = False + for pkgname in check_pkgs: +- if inst_pkg_names.has_key(pkgname): ++ if pkgname in inst_pkg_names: + group.installed = True + break + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 910c9e1..17b2ce9 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -895,7 +895,7 @@ class Depsolve(object): + for prov in provs: + if prov[0].startswith('rpmlib('): # ignore rpmlib() provides + continue +- if newpoprovs.has_key(prov): ++ if prov in newpoprovs: + continue + # FIXME: This is probably the best place to fix the postfix rename + # problem long term (post .21) ... see compare_providers. +diff --git a/yum/mdparser.py b/yum/mdparser.py +index 2753dad..194d5d1 100644 +--- a/yum/mdparser.py ++++ b/yum/mdparser.py +@@ -132,7 +132,7 @@ class PrimaryEntry(BaseEntry): + elif name in ('checksum', 'location'): + p.update(self._prefixprops(child, name)) + p[name + '_value'] = child.text +- if name == 'location' and not p.has_key("location_base"): ++ if name == 'location' and "location_base" not in p: + p["location_base"] = None + + elif name == 'format': +diff --git a/yum/packageSack.py b/yum/packageSack.py +index dbe54bf..b09fee9 100644 +--- a/yum/packageSack.py ++++ b/yum/packageSack.py +@@ -348,7 +348,7 @@ class PackageSackBase(object): + for po in self.returnPackages(repoid=repoid): + preq = 0 + for p in _return_all_provides(po): +- if req.has_key(p): ++ if p in req: + # If this pkg provides something that is required by + # anything but itself (or another version of itself) it + # isn't an orphan. +@@ -785,13 +785,13 @@ class PackageSack(PackageSackBase): + def searchFiles(self, name): + """ Return list of packages by filename. """ + self._checkIndexes(failure='build') +- if self.filenames.has_key(name): ++ if name in self.filenames: + return self.filenames[name] + else: + return [] + + def _addToDictAsList(self, dict, key, data): +- if not dict.has_key(key): ++ if key not in dict: + dict[key] = [] + #if data not in dict[key]: - if I enable this the whole world grinds to a halt + # need a faster way of looking for the object in any particular list +@@ -928,7 +928,7 @@ class PackageSack(PackageSackBase): + ignore_case=ignore_case) + + for pkg in where: +- if not highdict.has_key((pkg.name, pkg.arch)): ++ if (pkg.name, pkg.arch) not in highdict: + highdict[(pkg.name, pkg.arch)] = pkg + else: + pkg2 = highdict[(pkg.name, pkg.arch)] +@@ -956,9 +956,8 @@ class PackageSack(PackageSackBase): + ignore_case=ignore_case) + + for pkg in pkgs: +- if not highdict.has_key(pkg.name): +- highdict[pkg.name] = [] +- highdict[pkg.name].append(pkg) ++ if pkg.name not in highdict: ++ highdict[pkg.name] = [pkg] + else: + pkg2 = highdict[pkg.name][0] + if pkg.verGT(pkg2): +diff --git a/yum/packages.py b/yum/packages.py +index e01790c..ac45518 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -91,7 +91,7 @@ def buildPkgRefDict(pkgs, casematch=True): + envra = '%s:%s-%s-%s.%s' % (e, n, v, r, a) + nevra = '%s-%s:%s-%s.%s' % (n, e, v, r, a) + for item in [name, nameArch, nameVerRelArch, nameVer, nameVerRel, envra, nevra]: +- if not pkgdict.has_key(item): ++ if item not in pkgdict: + pkgdict[item] = [] + pkgdict[item].append(pkg) + +@@ -393,9 +393,7 @@ class RpmBase(object): + def returnPrco(self, prcotype, printable=False): + """return list of provides, requires, conflicts or obsoletes""" + +- prcos = [] +- if self.prco.has_key(prcotype): +- prcos = self.prco[prcotype] ++ prcos = self.prco.get(prcotype, []) + + if printable: + results = [] +@@ -913,12 +911,9 @@ class YumAvailablePackage(PackageObject, RpmBase): + self.installedsize = pkgdict.size['installed'] + + if hasattr(pkgdict, 'location'): +- if not pkgdict.location.has_key('base'): ++ url = pkgdict.location.get('base') ++ if url == '': + url = None +- elif pkgdict.location['base'] == '': +- url = None +- else: +- url = pkgdict.location['base'] + + self.basepath = url + self.relativepath = pkgdict.location['href'] +@@ -938,7 +933,7 @@ class YumAvailablePackage(PackageObject, RpmBase): + if hasattr(pkgdict, 'files'): + for fn in pkgdict.files: + ftype = pkgdict.files[fn] +- if not self.files.has_key(ftype): ++ if ftype not in self.files: + self.files[ftype] = [] + self.files[ftype].append(fn) + +@@ -946,19 +941,17 @@ class YumAvailablePackage(PackageObject, RpmBase): + for rtype in pkgdict.prco: + for rdict in pkgdict.prco[rtype]: + name = rdict['name'] +- f = e = v = r = None +- if rdict.has_key('flags'): f = rdict['flags'] +- if rdict.has_key('epoch'): e = rdict['epoch'] +- if rdict.has_key('ver'): v = rdict['ver'] +- if rdict.has_key('rel'): r = rdict['rel'] ++ f = rdict.get('flags') ++ e = rdict.get('epoch') ++ v = rdict.get('ver') ++ r = rdict.get('rel') + self.prco[rtype].append((name, f, (e,v,r))) + + if hasattr(pkgdict, 'changelog'): + for cdict in pkgdict.changelog: +- date = text = author = None +- if cdict.has_key('date'): date = cdict['date'] +- if cdict.has_key('value'): text = cdict['value'] +- if cdict.has_key('author'): author = cdict['author'] ++ date = cdict.get('date') ++ text = cdict.get('value') ++ author = cdict.get('author') + self._changelog.append((date, author, text)) + + if hasattr(pkgdict, 'checksum'): +@@ -1297,7 +1290,7 @@ class YumHeaderPackage(YumAvailablePackage): + for (fn, mode, flag) in filetuple: + #garbage checks + if mode is None or mode == '': +- if not self.files.has_key('file'): ++ if 'file' not in self.files: + self.files['file'] = [] + self.files['file'].append(fn) + continue +diff --git a/yum/pgpmsg.py b/yum/pgpmsg.py +index bd52cda..ffd275f 100644 +--- a/yum/pgpmsg.py ++++ b/yum/pgpmsg.py +@@ -399,7 +399,7 @@ def map_to_str(m, vals) : + if type(vals) != types.ListType and type(vals) != types.TupleType : + vals = list((vals,)) + for i in vals : +- if m.has_key(i) : ++ if i in m : + slist.append(m[i]) + else : + slist.append('unknown(' + str(i) + ')') +@@ -781,9 +781,7 @@ class signature(pgp_packet) : + if sp[0] == SIG_SUB_TYPE_SGNR_USER_ID : # signer's user id + return 'signer id: ' + sp[1] + if sp[0] == SIG_SUB_TYPE_REVOKE_REASON : # reason for revocation +- reas = '' +- if revoke_reason_to_str.has_key(sp[1]) : +- reas = revoke_reason_to_str[sp[1]] ++ reas = revoke_reason_to_str.get(sp[1], '') + return 'reason for revocation: %s, %s' % (reas, sp[2]) + if sp[0] == SIG_SUB_TYPE_FEATURES : # features + features = [] +diff --git a/yum/repos.py b/yum/repos.py +index cd477ba..7e9c417 100644 +--- a/yum/repos.py ++++ b/yum/repos.py +@@ -103,7 +103,7 @@ class RepoStorage: + self._cache_enabled_repos = None + + def delete(self, repoid): +- if self.repos.has_key(repoid): ++ if repoid in self.repos: + thisrepo = self.repos[repoid] + thisrepo.close() + del self.repos[repoid] +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 7f5b233..444e6d9 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -264,14 +264,12 @@ class RPMDBPackageSack(PackageSackBase): + if hdr['name'] == 'gpg-pubkey': + continue + pkg = self._makePackageObject(hdr, mi.instance()) +- if not result.has_key(pkg.pkgid): +- result[pkg.pkgid] = pkg ++ result.setdefault(pkg.pkgid, pkg) + del mi + + fileresults = self.searchFiles(name) + for pkg in fileresults: +- if not result.has_key(pkg.pkgid): +- result[pkg.pkgid] = pkg ++ result.setdefault(pkg.pkgid, pkg) + + if self.auto_close: + self.ts.close() +@@ -289,8 +287,7 @@ class RPMDBPackageSack(PackageSackBase): + if hdr['name'] == 'gpg-pubkey': + continue + pkg = self._makePackageObject(hdr, mi.instance()) +- if not result.has_key(pkg.pkgid): +- result[pkg.pkgid] = pkg ++ result.setdefault(pkg.pkgid, pkg) + del mi + + result = result.values() +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 43f60cd..7873411 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -259,9 +259,7 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): + if varname.startswith('__') and varname.endswith('__'): + raise AttributeError, varname + +- dbname = varname +- if db2simplemap.has_key(varname): +- dbname = db2simplemap[varname] ++ dbname = db2simplemap.get(varname, varname) + try: + r = self._sql_MD('primary', + "SELECT %s FROM packages WHERE pkgId = ?" % dbname, +@@ -556,7 +554,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + # Because we don't want to remove a package from the database we just + # add it to the exclude list + def delPackage(self, obj): +- if not self.excludes.has_key(obj.repo): ++ if obj.repo not in self.excludes: + self.excludes[obj.repo] = {} + self.excludes[obj.repo][obj.pkgId] = 1 + if (obj.repo, obj.pkgKey) in self._exclude_whitelist: +@@ -780,13 +778,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + return ret + + def addDict(self, repo, datatype, dataobj, callback=None): +- if self.added.has_key(repo): ++ if repo in self.added: + if datatype in self.added[repo]: + return + else: + self.added[repo] = [] + +- if not self.excludes.has_key(repo): ++ if repo not in self.excludes: + self.excludes[repo] = {} + + if dataobj is None: +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index 508ab65..69ff86d 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -130,7 +130,7 @@ class TransactionData: + if pkgtup is None: + for members in self.pkgdict.itervalues(): + returnlist.extend(members) +- elif self.pkgdict.has_key(pkgtup): ++ elif pkgtup in self.pkgdict: + returnlist.extend(self.pkgdict[pkgtup]) + return returnlist + +@@ -275,7 +275,7 @@ class TransactionData: + else: + self._inSack.addPackage(txmember.po) + +- if self.conditionals.has_key(txmember.name): ++ if txmember.name in self.conditionals: + for pkg in self.conditionals[txmember.name]: + if self.rpmdb.contains(po=pkg): + continue +@@ -307,7 +307,7 @@ class TransactionData: + + def exists(self, pkgtup): + """tells if the pkg is in the class""" +- if self.pkgdict.has_key(pkgtup): ++ if pkgtup in self.pkgdict: + if len(self.pkgdict[pkgtup]) != 0: + return 1 + +diff --git a/yum/update_md.py b/yum/update_md.py +index fc051b0..c6e2d37 100644 +--- a/yum/update_md.py ++++ b/yum/update_md.py +@@ -73,7 +73,7 @@ class UpdateNotice(object): + + def __getitem__(self, item): + """ Allows scriptable metadata access (ie: un['update_id']). """ +- return self._md.has_key(item) and self._md[item] or None ++ return self._md.get(item) or None + + def __setitem__(self, item, val): + self._md[item] = val +@@ -328,7 +328,7 @@ class UpdateMetadata(object): + """ + if type(nvr) in (type([]), type(())): + nvr = '-'.join(nvr) +- return self._cache.has_key(nvr) and self._cache[nvr] or None ++ return self._cache.get(nvr) or None + + # The problem with the above "get_notice" is that not everyone updates + # daily. So if you are at pkg-1, pkg-2 has a security notice, and pkg-3 +diff --git a/yum/yumRepo.py b/yum/yumRepo.py +index b67b897..7c3a4d7 100644 +--- a/yum/yumRepo.py ++++ b/yum/yumRepo.py +@@ -78,7 +78,7 @@ class YumPackageSack(packageSack.PackageSack): + self.added = {} + + def addDict(self, repo, datatype, dataobj, callback=None): +- if self.added.has_key(repo): ++ if repo in self.added: + if datatype in self.added[repo]: + return + +@@ -94,14 +94,14 @@ class YumPackageSack(packageSack.PackageSack): + self._addToDictAsList(self.pkgsByID, pkgid, po) + self.addPackage(po) + +- if not self.added.has_key(repo): ++ if repo not in self.added: + self.added[repo] = [] + self.added[repo].append('metadata') + # indexes will need to be rebuilt + self.indexesBuilt = 0 + + elif datatype in ['filelists', 'otherdata']: +- if self.added.has_key(repo): ++ if repo in self.added: + if 'metadata' not in self.added[repo]: + raise Errors.RepoError, '%s md for %s imported before primary' \ + % (datatype, repo.id) +@@ -110,7 +110,7 @@ class YumPackageSack(packageSack.PackageSack): + current += 1 + if callback: callback.progressbar(current, total, repo) + pkgdict = dataobj[pkgid] +- if self.pkgsByID.has_key(pkgid): ++ if pkgid in self.pkgsByID: + for po in self.pkgsByID[pkgid]: + po.importFromDict(pkgdict) + +@@ -134,7 +134,7 @@ class YumPackageSack(packageSack.PackageSack): + callback=callback, + ) + for item in data: +- if self.added.has_key(repo): ++ if repo in self.added: + if item in self.added[repo]: + continue + +@@ -1082,9 +1082,7 @@ class YumRepository(Repository, config.RepoConf): + self._check_db_version(mdtype + '_db', repoXML=repoXML)): + mdtype += '_db' + +- if repoXML.repoData.has_key(mdtype): +- return (mdtype, repoXML.getData(mdtype)) +- return (mdtype, None) ++ return (mdtype, repoXML.repoData.get(mdtype)) + + def _get_mdtype_fname(self, data, compressed=False): + (r_base, remote) = data.location +@@ -1524,9 +1522,9 @@ class YumRepository(Repository, config.RepoConf): + fname = os.path.basename(remote) + local = self.cachedir + '/' + fname + +- if self.retrieved.has_key(mdtype): +- if self.retrieved[mdtype]: # got it, move along +- return local ++ if self.retrieved.get(mdtype): ++ # got it, move along ++ return local + + if self.cache == 1: + if os.path.exists(local): +-- +1.7.0.1 + + +From a778dc6b584b1560fdd08dcf051a929685127b23 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Mon, 26 Apr 2010 09:38:06 -0400 +Subject: [PATCH 76] add globdir: syntax to all ListOption() and UrlListOption() items in config.py + +this allows the user to specify globdir:/path/somewhere.d/*.conf and the +contents of all the files in that dir will be used to populate the config +option as a list. +--- + yum/config.py | 26 +++++++++++++++++++++----- + yum/misc.py | 25 ++++++++++++++++++++++++- + 2 files changed, 45 insertions(+), 6 deletions(-) + +diff --git a/yum/config.py b/yum/config.py +index 3e91735..5ff13a6 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -40,7 +40,7 @@ if not _use_iniparse: + import rpmUtils.transaction + import Errors + import types +-from misc import get_uuid ++from misc import get_uuid, read_in_items_from_dot_dir + + # Alter/patch these to change the default checking... + __pkgs_gpgcheck_default__ = False +@@ -161,7 +161,8 @@ class ListOption(Option): + super(ListOption, self).__init__(default) + + def parse(self, s): +- """Converts a string from the config file to a workable list ++ """Converts a string from the config file to a workable list, parses ++ globdir: paths as foo.d-style dirs + + Commas and spaces are used as separators for the list + """ +@@ -169,7 +170,15 @@ class ListOption(Option): + # to sub the \n with a space and then read the lines + s = s.replace('\n', ' ') + s = s.replace(',', ' ') +- return s.split() ++ results = [] ++ for item in s.split(): ++ if item.startswith('globdir:'): ++ globdir = item.replace('globdir:', '') ++ results.extend(read_in_items_from_dot_dir(globdir)) ++ continue ++ results.append(item) + - #~ msgid "All dependencies resolved and no conflicts detected" - #~ msgstr "Todas as dependências resolvidas e nenhum conflito detectado" ++ return results + + def tostring(self, value): + return '\n '.join(value) +@@ -228,8 +237,15 @@ class UrlListOption(ListOption): + s = s.replace('\n', ' ') + s = s.replace(',', ' ') + items = [ item.replace(' ', '%20') for item in shlex.split(s) ] +- s = ' '.join(items) +- for url in super(UrlListOption, self).parse(s): ++ tmp = [] ++ for item in items: ++ if item.startswith('globdir:'): ++ globdir = item.replace('globdir:', '') ++ tmp.extend(read_in_items_from_dot_dir(globdir)) ++ continue ++ tmp.append(item) + - #~ msgid "using cached groups from server: %s" - #~ msgstr "usando grupos em cache a partir do servidor: %s" ++ for url in super(UrlListOption, self).parse(' '.join(tmp)): + out.append(self._urloption.parse(url)) + return out + +diff --git a/yum/misc.py b/yum/misc.py +index faccf5f..ebce8e1 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -1005,4 +1005,27 @@ def decompress(filename): + + return out + +- ++def read_in_items_from_dot_dir(thisglob, line_as_list=True): ++ """takes a glob of a dir (like /etc/foo.d/*.foo) ++ returns a list of all the lines in all the files matching ++ that glob, ignores comments and blank lines, ++ optional paramater 'line_as_list tells whether to ++ treat each line as a space or comma-separated list, defaults to True""" ++ results = [] ++ for fname in glob.glob(thisglob): ++ for line in open(fname): ++ if re.match('\s*(#|$)', line): ++ continue ++ line = line.rstrip() # no more trailing \n's ++ line = line.lstrip() # be nice ++ if not line: ++ continue ++ if line_as_list: ++ line = line.replace('\n', ' ') ++ line = line.replace(',', ' ') ++ results.extend(line.split()) ++ continue ++ results.append(line) ++ return results + - #~ msgid "Exiting." - #~ msgstr "Saindo." + - #~ msgid "" - #~ "asking for package %s.%s - does not exist in nevral - bailing out - check " - #~ "rpmdb for errors" - #~ msgstr "" - #~ "perguntando pelo pacote %s.%s - não existe no nevral - saindo " - #~ "abruptamente - verifique por erros no rpmdb" +-- +1.7.0.1 + + +From 70832dba9026ca0018e8ea97668564781c5b0736 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Mon, 26 Apr 2010 09:52:49 -0400 +Subject: [PATCH 77] add docs for globdir: syntax + +--- + docs/yum.conf.5 | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index dfc09b7..a809faa 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -734,6 +734,14 @@ The configuration file will be inserted at the position of the "include=" line. + Included files may contain further include lines. Yum will abort with an error + if an inclusion loop is detected. + ++.SH "GLOBDIR FOR LIST OPTIONS" ++.LP ++Any of the configurations options which are a list of items can be specfied ++using the globdir syntax: \fBglobdir:/etc/path/somewhere.d/*.conf\fR. This ++will read in all files matching that glob and include all lines in each file ++(excluding comments and blank lines) as items in the list. ++.LP + - #~ msgid "Errors reported doing trial run" - #~ msgstr "Erros reportados na execução experimental" + .SH "VARIABLES" + .LP + There are a number of variables you can use to ease maintenance of yum's +-- +1.7.0.1 + + +From 37ceeb9a73f872100c7a53b32fd0174516761acc Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Mon, 26 Apr 2010 16:37:50 -0400 +Subject: [PATCH 78] change globdir -> glob + +--- + docs/yum.conf.5 | 4 ++-- + yum/config.py | 12 ++++++------ + 2 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index a809faa..8200d43 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -734,10 +734,10 @@ The configuration file will be inserted at the position of the "include=" line. + Included files may contain further include lines. Yum will abort with an error + if an inclusion loop is detected. + +-.SH "GLOBDIR FOR LIST OPTIONS" ++.SH "GLOB: FOR LIST OPTIONS" + .LP + Any of the configurations options which are a list of items can be specfied +-using the globdir syntax: \fBglobdir:/etc/path/somewhere.d/*.conf\fR. This ++using the glob syntax: \fBglob:/etc/path/somewhere.d/*.conf\fR. This + will read in all files matching that glob and include all lines in each file + (excluding comments and blank lines) as items in the list. + .LP +diff --git a/yum/config.py b/yum/config.py +index 55b0b7d..37d4d10 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -172,9 +172,9 @@ class ListOption(Option): + s = s.replace(',', ' ') + results = [] + for item in s.split(): +- if item.startswith('globdir:'): +- globdir = item.replace('globdir:', '') +- results.extend(read_in_items_from_dot_dir(globdir)) ++ if item.startswith('glob:'): ++ thisglob = item.replace('glob:', '') ++ results.extend(read_in_items_from_dot_dir(thisglob)) + continue + results.append(item) + +@@ -239,9 +239,9 @@ class UrlListOption(ListOption): + items = [ item.replace(' ', '%20') for item in shlex.split(s) ] + tmp = [] + for item in items: +- if item.startswith('globdir:'): +- globdir = item.replace('globdir:', '') +- tmp.extend(read_in_items_from_dot_dir(globdir)) ++ if item.startswith('glob:'): ++ thisglob = item.replace('glob:', '') ++ tmp.extend(read_in_items_from_dot_dir(thisglob)) + continue + tmp.append(item) + +-- +1.7.0.1 + + +From f9a70c4fdb7c6c141359028c7249d0d8df1a0036 Mon Sep 17 00:00:00 2001 +From: Tim Lauridsen +Date: Wed, 28 Apr 2010 13:08:45 +0200 +Subject: [PATCH 79] Fix the following pylint errors/warnings + +************* Module cli +W0311:169: Bad indentation. Found 19 spaces, expected 20 +W0311:170: Bad indentation. Found 19 spaces, expected 20 +E0602:728:YumBaseCli.distroSyncPkgs: Undefined variable 'Errors' +************* Module yum +W0311:903: Bad indentation. Found 15 spaces, expected 16 +************* Module yum.pgpmsg +W0311:1074: Bad indentation. Found 28 spaces, expected 24 +W0108:623:signature.deserialize_subpacket.: Lambda may not be necessary +************* Module yum.update_md +W0311: 79: Bad indentation. Found 7 spaces, expected 8 +************* Module yum.history +W0611: 25: Unused import sql_esc +************* Module yum.pkgtag_db +E0601: 85:PackageTagDB.search_names: Using variable 'tag' before assignment +W0611: 20: Unused import sql_esc_glob +************* Module yum.rpmsack +W0311:482: Bad indentation. Found 28 spaces, expected 24 +E1103:481:RPMDBPackageSack.returnPackages: Instance of 'list' has no 'name' member (but some types could not be inferred) +E1103:482:RPMDBPackageSack.returnPackages: Instance of 'list' has no 'name' member (but some types could not be inferred) +E1103:489:RPMDBPackageSack._uncached_returnConflictPackages: Instance of 'list' has no 'conflicts' member (but some types could not be inferred) +E1103:675:RPMDBPackageSack.fileRequiresData: Instance of 'list' has no 'requires' member (but some types could not be inferred) +E1103:678:RPMDBPackageSack.fileRequiresData: Instance of 'list' has no 'pkgtup' member (but some types could not be inferred) +E9905:1470:RPMDBAdditionalDataPackage._delete: Too many arguments for format string +--- + cli.py | 6 +++--- + test/yum-pylintrc | 3 ++- + yum/__init__.py | 2 +- + yum/history.py | 2 +- + yum/pgpmsg.py | 7 ++++++- + yum/pkgtag_db.py | 4 ++-- + yum/rpmsack.py | 4 ++-- + yum/update_md.py | 2 +- + 8 files changed, 18 insertions(+), 12 deletions(-) + +diff --git a/cli.py b/cli.py +index 4479a5e..2977ca8 100644 +--- a/cli.py ++++ b/cli.py +@@ -166,8 +166,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + repo = k[:period] + k = k[period+1:] + if repo not in repoopts: +- repoopts[repo] = yum.misc.GenericHolder() +- repoopts[repo].items = [] ++ repoopts[repo] = yum.misc.GenericHolder() ++ repoopts[repo].items = [] + setattr(repoopts[repo], k, v) + repoopts[repo].items.append(k) + else: +@@ -725,7 +725,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + if ipkgs: + try: + pkgs = self.pkgSack.returnNewestByName(patterns=ipkgs.keys()) +- except Errors.PackageSackError: ++ except yum.Errors.PackageSackError: + pkgs = [] + + for pkg in pkgs: +diff --git a/test/yum-pylintrc b/test/yum-pylintrc +index dd3db57..fa3e57c 100644 +--- a/test/yum-pylintrc ++++ b/test/yum-pylintrc +@@ -82,7 +82,8 @@ disable-msg-cat=C,R + # W0703: *Catch "Exception"* + # W0710: *Exception doesn't inherit from standard "Exception" class* (give false positives on ex. KeyboardInterrupt) + # W0631: *Using possibly undefined loop variable %r* (Gives to many false positives) +-disable-msg=E1101,F0401,W0704,W0612,W0212,W0613,W0602,W0511,W0401,W0614,W0232,W0201,W0603,W0621,W0142,W0102,W0105,W0702,W0231,E0202,W0622,W0403,W0223,W0104,W1001,W0221,W0703,W0710,W0631 ++# E1103: *%s %r has no %r member (but some types could not be inferred)* ++disable-msg=E1101,F0401,W0704,W0612,W0212,W0613,W0602,W0511,W0401,W0614,W0232,W0201,W0603,W0621,W0142,W0102,W0105,W0702,W0231,E0202,W0622,W0403,W0223,W0104,W1001,W0221,W0703,W0710,W0631,E1103 + + + [REPORTS] +diff --git a/yum/__init__.py b/yum/__init__.py +index a2851bd..60adcbd 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -900,7 +900,7 @@ class YumBase(depsolve.Depsolve): + # Try another depsolve + if self.conf.skip_broken and rescode==1: + if clear_skipped: +- self.skipped_packages = [] # reset the public list of skipped packages. ++ self.skipped_packages = [] # reset the public list of skipped packages. + sb_st = time.time() + rescode, restring = self._skipPackagesWithProblems(rescode, restring) + self._printTransaction() +diff --git a/yum/history.py b/yum/history.py +index 3ef5f74..608f9b7 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -22,7 +22,7 @@ import os, os.path + import glob + from weakref import proxy as weakref + +-from sqlutils import sqlite, executeSQL, sql_esc, sql_esc_glob ++from sqlutils import sqlite, executeSQL, sql_esc_glob + import yum.misc as misc + import yum.constants + from yum.constants import * +diff --git a/yum/pgpmsg.py b/yum/pgpmsg.py +index ffd275f..9cf8217 100644 +--- a/yum/pgpmsg.py ++++ b/yum/pgpmsg.py +@@ -18,6 +18,11 @@ import struct, time, cStringIO, base64, types + # We use this so that we can work on python-2.4 and python-2.6, and thus. + # use import md5/import sha on the older one and import hashlib on the newer. + # Stupid deprecation warnings. + - #~ msgid "Lilo found - adding kernel to lilo and making it the default" - #~ msgstr "Lilo encontrado - adicionando o kernel ao lilo e tornando-o padrão" ++# pylint: disable-msg=W0108 ++# Ignore :W0108: *Lambda may not be necessary* + - #~ msgid "[update: %s]" - #~ msgstr "[atualizar: %s]" + - #~ msgid "ERROR: Url Return no Content-Length - something is wrong" - #~ msgstr "ERRO: A URL retornou conteúdo vazio - algo está errado" + try: + import hashlib + except ImportError: +@@ -1071,7 +1076,7 @@ be scanned to make sure they are valid for a pgp certificate.""" + if pkt_idx >= len(pkts) : + raise ValueError('subkey at index %d was not followed by a signature' % (pkt_idx-1)) + if pkts[pkt_idx].pkt_typ != CTB_PKT_SIG or pkts[pkt_idx].sig_type != SIG_TYPE_SUBKEY_BIND : +- raise ValueError('signature %d doesn\'t bind subkey to key, type is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_typ))) ++ raise ValueError('signature %d doesn\'t bind subkey to key, type is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_typ))) + subkey.append(pkts[pkt_idx]) + + pkt_idx = pkt_idx + 1 +diff --git a/yum/pkgtag_db.py b/yum/pkgtag_db.py +index d2836e4..016dd41 100644 +--- a/yum/pkgtag_db.py ++++ b/yum/pkgtag_db.py +@@ -17,7 +17,7 @@ + + # parse sqlite tag database + # return pkgnames and tag that was matched +-from sqlutils import sqlite, executeSQL, sql_esc, sql_esc_glob ++from sqlutils import sqlite, executeSQL, sql_esc + from Errors import PkgTagsError + import sqlutils + import sys +@@ -82,7 +82,7 @@ class PackageTagDB(object): + """Search by package name/glob. + Return dict of dict[packagename] = [tag1, tag2, tag3, tag4, ...]""" + res = {} +- (name, esc) = sql_esc(tag) ++ (name, esc) = sql_esc(name) + query = "SELECT name, tag, score FROM packagetags where name like ?%s " % esc + name = '%' + name + '%' + rows = self._sql_exec(query, (name,)) +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 444e6d9..83268cc 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -479,7 +479,7 @@ class RPMDBPackageSack(PackageSackBase): + for pkg in pkgobjlist: + for pat in patterns: + if pkg.name == pat: +- self._pkgnames_loaded.add(pkg.name) ++ self._pkgnames_loaded.add(pkg.name) + return pkgobjlist + + def _uncached_returnConflictPackages(self): +@@ -1467,7 +1467,7 @@ class RPMDBAdditionalDataPackage(object): + try: + os.unlink(fn) + except (IOError, OSError): +- raise AttributeError, "Cannot delete attribute %s on " % (attr, self) ++ raise AttributeError, "Cannot delete attribute %s on %s " % (attr, self) + + def __getattr__(self, attr): + return self._read(attr) +diff --git a/yum/update_md.py b/yum/update_md.py +index c6e2d37..90c5582 100644 +--- a/yum/update_md.py ++++ b/yum/update_md.py +@@ -76,7 +76,7 @@ class UpdateNotice(object): + return self._md.get(item) or None + + def __setitem__(self, item, val): +- self._md[item] = val ++ self._md[item] = val + + def __str__(self): + head = """ +-- +1.7.0.1 + + +From ab34fabf5ce21ea63aa989a65aad06a71fd604dc Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sat, 24 Apr 2010 01:49:38 -0400 +Subject: [PATCH 80] Move protect-packages plugin into core, and fix some bugs in it. + Added some docs. for yum.conf => protected_packages, and yum on the + remove command. + + Add parse_default to Option, ListOption, UrlListOption ... so we can +use the .parse() behaviour. + + Default: yum, glob:/etc/yum/protected.d/*.conf + Created dir. and owned it. +--- + docs/yum.8 | 3 +++ + docs/yum.conf.5 | 8 ++++++++ + etc/Makefile | 1 + + yum.spec | 1 + + yum/__init__.py | 39 +++++++++++++++++++++++++++++++++++++++ + yum/config.py | 16 +++++++++++----- + 6 files changed, 63 insertions(+), 5 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index 1089b7d..b9ee5ec 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -138,6 +138,9 @@ Are used to remove the specified packages from the system + as well as removing any packages which depend on the package being + removed\&. remove operates on groups, files, provides and filelists just like + the "install" command\&.(See \fBSpecifying package names\fP for more information) + - #~ msgid "Got a file - yay" - #~ msgstr "Obteve um arquivo - yay" ++Note that "yum" is included in the protected_packages configuration, by default. ++So you can't accidentally remove yum itself. + .IP + .IP "\fBlist\fP" + Is used to list various information about available +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index 8200d43..5f1a5c7 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -62,6 +62,14 @@ Debug scriptlet output level. 'info' is the default, other + options are: 'critical', 'emergency', 'error', 'warn' and 'debug'. + + .IP ++\fBprotected_packages\fR ++This is a list of packages that yum should never completely remove. They are ++protected via. Obsoletes as well as user/plugin removals. + - #~ msgid "From %s updating %s" - #~ msgstr "A partir de %s, atualizando %s" ++The default is: yum glob:/etc/yum/protected.d/*.conf ++So any packages which should be protected can do so by including a file in ++/etc/yum/protected.d with their package name in it. ++.IP + \fBlogfile\fR + Full directory and file name for where yum should write its log file. + +diff --git a/etc/Makefile b/etc/Makefile +index 91b1791..a512cdf 100644 +--- a/etc/Makefile ++++ b/etc/Makefile +@@ -8,6 +8,7 @@ clean: + + install: + mkdir -p $(DESTDIR)/etc/yum/ ++ mkdir -p $(DESTDIR)/etc/yum/protected.d + mkdir -p $(DESTDIR)/etc/yum/repos.d + mkdir -p $(DESTDIR)/etc/yum/vars + +diff --git a/yum.spec b/yum.spec +index a559eda..909354e 100644 +--- a/yum.spec ++++ b/yum.spec +@@ -87,6 +87,7 @@ exit 0 + %config(noreplace) %{_sysconfdir}/yum/yum.conf + %config(noreplace) %{_sysconfdir}/yum/version-groups.conf + %dir %{_sysconfdir}/yum ++%dir %{_sysconfdir}/yum/protected.d + %dir %{_sysconfdir}/yum/repos.d + %dir %{_sysconfdir}/yum/vars + %config %{_sysconfdir}/logrotate.d/%{name} +diff --git a/yum/__init__.py b/yum/__init__.py +index 60adcbd..99b0bc1 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -888,6 +888,45 @@ class YumBase(depsolve.Depsolve): + + if self.tsInfo.pkgSack is not None: # rm Transactions don't have pkgSack + self.tsInfo.pkgSack.dropCachedData() + - #~ msgid "" - #~ "Usage:\n" - #~ "yum-arch [-v] [-z] [-l] [-c] [-n] [-d] [-q] [-vv] (path of dir where " -@@ -3009,54 +3288,74 @@ msgstr "Erro ao abrir o rpm %s - erro %s" - #~ " -l = utiliza links simbólicos como rpms válidos ao compilar " - #~ "cabeçalhos\n" - #~ " -q = faz uma exibição mais discreta" ++ # This is a version of the old "protect-packages" plugin, it allows ++ # you to erase duplicates and do remove+install. ++ # But we don't allow you to turn it off!:) ++ protect_states = [TS_OBSOLETED, TS_ERASE] ++ txmbrs = [] ++ if rescode == 2 and self.conf.protected_packages: ++ protected = set(self.conf.protected_packages) ++ txmbrs = self.tsInfo.getMembersWithState(None, protect_states) ++ bad_togo = {} ++ for txmbr in txmbrs: ++ if txmbr.name not in protected: ++ continue ++ if txmbr.name not in bad_togo: ++ bad_togo[txmbr.name] = [] ++ bad_togo[txmbr.name].append(txmbr.pkgtup) ++ for ipkg in self.rpmdb.searchNames(bad_togo.keys()): ++ if ipkg.name not in bad_togo: ++ continue ++ # If there is at least one version not being removed, allow it ++ if ipkg.pkgtup not in bad_togo[ipkg.name]: ++ del bad_togo[ipkg.name] ++ for pkgname in bad_togo.keys(): ++ for txmbr in self.tsInfo.matchNaevr(name=pkgname): ++ if txmbr.name not in bad_togo: ++ continue ++ if txmbr.pkgtup in bad_togo[ipkg.name]: ++ continue ++ # If we are installing one version we aren't removing, allow it ++ if txmbr.output_state in TS_INSTALL_STATES: ++ del bad_togo[ipkg.name] + - #~ msgid "The file %s is damaged." - #~ msgstr "O arquivo %s está danificado." ++ if bad_togo: ++ rescode = 1 ++ restring = [] ++ for pkgname in sorted(bad_togo): ++ restring.append(_('Trying to remove "%s", which is protected') % ++ pkgname) + - #~ msgid "Repo" - #~ msgstr "Repo" + self.rpmdb.dropCachedData() + + self.verbose_logger.debug('Depsolve time: %0.3f' % (time.time() - ds_st)) +diff --git a/yum/config.py b/yum/config.py +index 37d4d10..1b78fcd 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -55,9 +55,11 @@ class Option(object): + definition easy and consise. + ''' + +- def __init__(self, default=None): ++ def __init__(self, default=None, parse_default=False): + self._setattrname() + self.inherit = False ++ if parse_default: ++ default = self.parse(default) + self.default = default + + def _setattrname(self): +@@ -155,10 +157,10 @@ class ListOption(Option): + An option containing a list of strings. + """ + +- def __init__(self, default=None): ++ def __init__(self, default=None, parse_default=False): + if default is None: + default = [] +- super(ListOption, self).__init__(default) ++ super(ListOption, self).__init__(default, parse_default) + + def parse(self, s): + """Converts a string from the config file to a workable list, parses +@@ -226,8 +228,9 @@ class UrlListOption(ListOption): + Option for handling lists of URLs with validation of the URL scheme. + ''' + +- def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https')): +- super(UrlListOption, self).__init__(default) ++ def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https'), ++ parse_default=False): ++ super(UrlListOption, self).__init__(default, parse_default) + + # Hold a UrlOption instance to assist with parsing + self._urloption = UrlOption(schemes=schemes) +@@ -730,6 +733,9 @@ class YumConf(StartupConf): + + rpmverbosity = Option('info') + ++ protected_packages = ListOption("yum, glob:/etc/yum/protected.d/*.conf", ++ parse_default=True) + - #~ msgid "No bootloader found, Cannot configure kernel." - #~ msgstr "" - #~ "Nenhum gerenciador de inicialização encontrado. Não é possível configurar " - #~ "o kernel." + _reposlist = [] + + def dump(self): +-- +1.7.0.1 + + +From 435ca1f5f443f9725e5125ee5467381cdf5b54f9 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 27 Apr 2010 12:30:25 -0400 +Subject: [PATCH 81] Add install/remove leak checking test + +--- + test/yum-leak-test.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 files changed, 51 insertions(+), 3 deletions(-) + +diff --git a/test/yum-leak-test.py b/test/yum-leak-test.py +index 299db51..9ea23c6 100755 +--- a/test/yum-leak-test.py ++++ b/test/yum-leak-test.py +@@ -1,6 +1,6 @@ + #! /usr/bin/python -tt + +-import yum, os, time, gc ++import yum, os, time, gc, sys + from urlgrabber.progress import format_number + + def out_mem(pid): +@@ -17,8 +17,12 @@ def out_mem(pid): + (format_number(int(ps['vmrss']) * 1024), + format_number(int(ps['vmsize']) * 1024)) + +-out_mem(os.getpid()) +-while True: ++print "Running:", yum.__version__ + - #~ msgid "Name" - #~ msgstr "Nome" ++def _leak_tst_yb(): ++ print "Doing YumBase leak test. " ++ out_mem(os.getpid()) ++ while True: + yb = yum.YumBase() + yb.repos.setCacheDir(yum.misc.getCacheDir()) + yb.rpmdb.returnPackages() +@@ -33,3 +37,47 @@ while True: + print gc.garbage[0] + print gc.get_referrers(gc.garbage[0]) + # print "DBG:", gc.get_referrers(yb) + - #~ msgid "Downloading needed headers" - #~ msgstr "Baixando os cabeçalhos necessários" ++def _leak_tst_ir(): ++ print "Doing install/remove leak test. " + - #~ msgid "Header for pkg %s not found" - #~ msgstr "O cabeçalho para o pacote %s não foi encontrado" ++ sys.path.insert(0, '/usr/share/yum-cli') ++ import cli ++ out_mem(os.getpid()) ++ yb = cli.YumBaseCli() # Need doTransaction() etc. ++ yb.preconf.debuglevel = 0 ++ yb.preconf.errorlevel = 0 ++ yb.repos.setCacheDir(yum.misc.getCacheDir()) ++ yb.conf.assumeyes = True + - #~ msgid "Cleaning all headers" - #~ msgstr "Limpando todos os cabeçalhos" ++ def _run(yb): ++ print " Run" ++ (code, msgs) = yb.buildTransaction() ++ if code == 1: ++ print "ERROR:", core, msgs ++ sys.exit(1) ++ returnval = yb.doTransaction() ++ if returnval != 0: # We could allow 1 too, but meh. ++ print "ERROR:", returnval ++ sys.exit(1) ++ yb.closeRpmDB() + - #~ msgid "depcheck: package %s needs %s" - #~ msgstr "verificação de dependências: o pacote %s precisa do %s" ++ last = None ++ while True: ++ out_mem(os.getpid()) ++ print " Install:", sys.argv[1:] ++ for pat in sys.argv[1:]: ++ yb.install(pattern=pat) ++ out_mem(os.getpid()) ++ _run(yb) + - #~ msgid "Error - %s cannot be found" - #~ msgstr "Erro - %s não pôde ser encontrado" ++ print " Remove:", sys.argv[1:] ++ for pat in sys.argv[1:]: ++ yb.remove(pattern=pat) ++ out_mem(os.getpid()) ++ _run(yb) + - #~ msgid "Erasing: %s %d/%d" - #~ msgstr "Apagando: %s %d/%d" ++if sys.argv[1:]: ++ _leak_tst_ir() ++else: ++ _leak_tst_yb() +-- +1.7.0.1 + + +From f1ee44352ada90be62721f6511d90e97d805a18c Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 27 Apr 2010 17:53:26 -0400 +Subject: [PATCH 82] Add more code paths to the leak command, runs transactions/etc. + +--- + test/yum-leak-test.py | 56 ++++++++++++++++++++++++++++++++++++++++++------ + 1 files changed, 49 insertions(+), 7 deletions(-) + +diff --git a/test/yum-leak-test.py b/test/yum-leak-test.py +index 9ea23c6..760b770 100755 +--- a/test/yum-leak-test.py ++++ b/test/yum-leak-test.py +@@ -1,5 +1,9 @@ + #! /usr/bin/python -tt + ++# Do either: ++# ./yum-leak-test.py ++# ./yum-leak-test.py zip + - #~ msgid "Nothing in any group to update or install" - #~ msgstr "Nada em nenhum grupo para atualizar ou instalar" + import yum, os, time, gc, sys + from urlgrabber.progress import format_number + +@@ -24,6 +28,8 @@ def _leak_tst_yb(): + out_mem(os.getpid()) + while True: + yb = yum.YumBase() ++ yb.preconf.debuglevel = 0 ++ yb.preconf.errorlevel = 0 + yb.repos.setCacheDir(yum.misc.getCacheDir()) + yb.rpmdb.returnPackages() + yb.pkgSack.returnPackages() +@@ -38,17 +44,48 @@ def _leak_tst_yb(): + print gc.get_referrers(gc.garbage[0]) + # print "DBG:", gc.get_referrers(yb) + ++def _leak_tst_cl(): ++ print "Doing closeRpmDB and .up test. " ++ yb = yum.YumBase() ++ yb.preconf.debuglevel = 0 ++ yb.preconf.errorlevel = 0 ++ yb.repos.setCacheDir(yum.misc.getCacheDir()) ++ while True: ++ out_mem(os.getpid()) ++ print "up:", ++ yb.up ++ print "done" ++ out_mem(os.getpid()) + - #~ msgid "Grub found - making this kernel the default" - #~ msgstr "Grub encontrado - tornando este kernel o padrão" ++ print "rpmdb pkgs:", ++ yb.rpmdb.returnPackages() ++ print "done" ++ out_mem(os.getpid()) + - #~ msgid "Digesting rpm - %s - %d/%d" - #~ msgstr "Preparando rpm - %s - %d/%d" ++ print "pkgSack pkgs:", ++ yb.pkgSack.returnPackages() ++ print "done" ++ out_mem(os.getpid()) + - #~ msgid "Damaged RPM %s, removing." - #~ msgstr "RPM %s danificado, removendo." ++ print "close:", ++ yb.closeRpmDB() ++ print "done" + - #~ msgid "" - #~ "Bad Header for pkg %s.%s trying to get headers for the nevral - exiting" - #~ msgstr "" - #~ "Cabeçalho danificado para o pacote %s.%s, tentando obter cabeçalhos para " - #~ "o nevral - saindo" + def _leak_tst_ir(): + print "Doing install/remove leak test. " + +- sys.path.insert(0, '/usr/share/yum-cli') ++ def _init(): ++ yb = cli.YumBaseCli() # Need doTransaction() etc. ++ yb.preconf.debuglevel = 0 ++ yb.preconf.errorlevel = 0 ++ yb.repos.setCacheDir(yum.misc.getCacheDir()) ++ yb.conf.assumeyes = True ++ return yb + - #~ msgid "" - #~ "Error: You may also check that you have the correct GPG keys installed" - #~ msgstr "" - #~ "Erro: Você também pode verificar se tem as Chaves GPG corretas instaladas" ++ sys.path.append('/usr/share/yum-cli') + import cli ++ yb = _init() + out_mem(os.getpid()) +- yb = cli.YumBaseCli() # Need doTransaction() etc. +- yb.preconf.debuglevel = 0 +- yb.preconf.errorlevel = 0 +- yb.repos.setCacheDir(yum.misc.getCacheDir()) +- yb.conf.assumeyes = True + + def _run(yb): + print " Run" +@@ -64,12 +101,15 @@ def _leak_tst_ir(): + + last = None + while True: ++ if True: ++ yb = _init() + out_mem(os.getpid()) + print " Install:", sys.argv[1:] + for pat in sys.argv[1:]: + yb.install(pattern=pat) + out_mem(os.getpid()) + _run(yb) ++ out_mem(os.getpid()) + + print " Remove:", sys.argv[1:] + for pat in sys.argv[1:]: +@@ -77,7 +117,9 @@ def _leak_tst_ir(): + out_mem(os.getpid()) + _run(yb) + +-if sys.argv[1:]: ++if len(sys.argv) == 2 and sys.argv[1] == 'closeRpmDB': ++ _leak_tst_cl() ++elif sys.argv[1:]: + _leak_tst_ir() + else: + _leak_tst_yb() +-- +1.7.0.1 + + +From 5f11f1c9dde04f1619728ae2642698d6bab28612 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 27 Apr 2010 17:54:17 -0400 +Subject: [PATCH 83] Drop indexes, on internal package classes, in dropCachedData + +--- + yum/packageSack.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/packageSack.py b/yum/packageSack.py +index b09fee9..d822394 100644 +--- a/yum/packageSack.py ++++ b/yum/packageSack.py +@@ -643,7 +643,7 @@ class PackageSack(PackageSackBase): + + def dropCachedData(self): + """ Do nothing, mainly for the testing code. """ +- pass ++ self.clearIndexes() + + def setCompatArchs(self, compatarchs): + self.compatarchs = compatarchs +-- +1.7.0.1 + + +From e992a90d5f2468084e99744d0764c5b97870ecd1 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 27 Apr 2010 17:55:44 -0400 +Subject: [PATCH 84] Add protected_packages to FakeConf + +--- + test/testbase.py | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/test/testbase.py b/test/testbase.py +index fa2e512..48611d8 100644 +--- a/test/testbase.py ++++ b/test/testbase.py +@@ -45,6 +45,7 @@ class FakeConf(object): + self.showdupesfromrepos = False + self.uid = 0 + self.groupremove_leaf_only = False ++ self.protected_packages = [] + + class FakeSack: + """ Fake PackageSack to use with FakeRepository""" +-- +1.7.0.1 + + +From 68550ee432472c792c30380f2d210969f13f5590 Mon Sep 17 00:00:00 2001 +From: Taylon Silmer +Date: Wed, 28 Apr 2010 22:17:54 +0000 +Subject: [PATCH 85] l10n: Updates to Portuguese (Brazilian) (pt_BR) translation + +New status: 568 messages complete with 1 fuzzy and 0 untranslated. + +Transmitted-via: Transifex (www.transifex.net). +--- + po/pt_BR.po | 1723 +++++++++++++++++++++++++++++++++++------------------------ + 1 files changed, 1011 insertions(+), 712 deletions(-) + +diff --git a/po/pt_BR.po b/po/pt_BR.po +index 32a16af..91cea8f 100644 +--- a/po/pt_BR.po ++++ b/po/pt_BR.po +@@ -1,15 +1,15 @@ + # Brazilian Portuguese translation of Yum + # This file is distributed under the same license as the Yum package. + # Igor Pires Soares , 2007,2008,2009. +-# ++# Taylon Silmer , 2010. + msgid "" + msgstr "" + "Project-Id-Version: Yum\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2009-10-15 15:45+0200\n" +-"PO-Revision-Date: 2009-11-02 11:15-0300\n" +-"Last-Translator: Igor Pires Soares \n" +-"Language-Team: Brazilian Portuguese \n" ++"POT-Creation-Date: 2010-02-11 10:54-0500\n" ++"PO-Revision-Date: 2010-04-28 19:15-0300\n" ++"Last-Translator: Taylon Silmer \n" ++"Language-Team: Brazilian Portuguese \n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" +@@ -17,49 +17,34 @@ msgstr "" + "X-Poedit-Language: Portuguese\n" + "X-Poedit-Country: BRAZIL\n" + +-#: ../callback.py:48 +-#: ../output.py:940 +-#: ../yum/rpmtrans.py:71 ++#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 + msgid "Updating" + msgstr "Atualizando" + +-#: ../callback.py:49 +-#: ../yum/rpmtrans.py:72 ++#: ../callback.py:49 ../yum/rpmtrans.py:73 + msgid "Erasing" + msgstr "Apagando" + +-#: ../callback.py:50 +-#: ../callback.py:51 +-#: ../callback.py:53 +-#: ../output.py:939 +-#: ../yum/rpmtrans.py:73 +-#: ../yum/rpmtrans.py:74 +-#: ../yum/rpmtrans.py:76 ++#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 ++#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 ++#: ../yum/rpmtrans.py:77 + msgid "Installing" + msgstr "Instalando" + +-#: ../callback.py:52 +-#: ../callback.py:58 +-#: ../yum/rpmtrans.py:75 ++#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 + msgid "Obsoleted" + msgstr "Obsoletos" + +-#: ../callback.py:54 +-#: ../output.py:1063 +-#: ../output.py:1403 ++#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 + msgid "Updated" + msgstr "Atualizados" + +-#: ../callback.py:55 +-#: ../output.py:1399 ++#: ../callback.py:55 ../output.py:1438 + msgid "Erased" + msgstr "Removidos" + +-#: ../callback.py:56 +-#: ../callback.py:57 +-#: ../callback.py:59 +-#: ../output.py:1061 +-#: ../output.py:1395 ++#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 ++#: ../output.py:1434 ../output.py:1646 + msgid "Installed" + msgstr "Instalados" + +@@ -81,73 +66,73 @@ msgstr "Erro: estado de saída inválido: %s de %s" + msgid "Erased: %s" + msgstr "Removidos: %s" + +-#: ../callback.py:217 +-#: ../output.py:941 ++#: ../callback.py:217 ../output.py:948 ../output.py:1648 + msgid "Removing" + msgstr "Removendo" + +-#: ../callback.py:219 +-#: ../yum/rpmtrans.py:77 ++#: ../callback.py:219 ../yum/rpmtrans.py:78 + msgid "Cleanup" + msgstr "Limpeza" + +-#: ../cli.py:106 ++#: ../cli.py:107 + #, python-format + msgid "Command \"%s\" already defined" + msgstr "Comando \"%s\" já definido" + +-#: ../cli.py:118 ++#: ../cli.py:119 + msgid "Setting up repositories" + msgstr "Configurando repositórios" + +-#: ../cli.py:129 ++#: ../cli.py:130 + msgid "Reading repository metadata in from local files" + msgstr "Lendo metadados do repositório a partir dos arquivos locais" + +-#: ../cli.py:192 +-#: ../utils.py:107 ++#: ../cli.py:194 ../utils.py:193 + #, python-format + msgid "Config Error: %s" + msgstr "Erro de configuração: %s" + +-#: ../cli.py:195 +-#: ../cli.py:1251 +-#: ../utils.py:110 ++#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 + #, python-format + msgid "Options Error: %s" + msgstr "Erro nas opções: %s" + +-#: ../cli.py:223 ++#: ../cli.py:227 + #, python-format + msgid " Installed: %s-%s at %s" + msgstr " Instalados: %s-%s em %s" + +-#: ../cli.py:225 ++#: ../cli.py:229 + #, python-format + msgid " Built : %s at %s" + msgstr " Construídos : %s em %s" + +-#: ../cli.py:227 ++#: ../cli.py:231 + #, python-format + msgid " Committed: %s at %s" + msgstr " Enviados: %s em %s" + +-#: ../cli.py:266 ++#: ../cli.py:270 + msgid "You need to give some command" + msgstr "Você precisa dar algum comando" + +-#: ../cli.py:309 ++#: ../cli.py:284 ++#, python-format ++msgid "No such command: %s. Please use %s --help" ++msgstr "Comando não encontrado: %s. Por favor, utilize %s --help" + - #~ msgid "No rpms to work with and no header dir. Exiting." - #~ msgstr "" - #~ "Nenhum diretório de cabeçalhos e nenhum rpm para ser utilizado. Saindo." ++#: ../cli.py:314 + msgid "Disk Requirements:\n" + msgstr "Requisitos de disco:\n" + +-#: ../cli.py:311 ++#: ../cli.py:316 + #, python-format +-msgid " At least %dMB needed on the %s filesystem.\n" +-msgstr " Pelo menos %d MB são necessários no sistema de arquivos %s.\n" ++msgid " At least %dMB more space needed on the %s filesystem.\n" ++msgstr " Pelo menos mais %dMB são necessários no sistema de arquivos %s.\n" + + #. TODO: simplify the dependency errors? + #. Fixup the summary +-#: ../cli.py:316 ++#: ../cli.py:321 + msgid "" + "Error Summary\n" + "-------------\n" +@@ -155,266 +140,262 @@ msgstr "" + "Sumário de erros\n" + "-------------\n" + +-#: ../cli.py:359 ++#: ../cli.py:364 + msgid "Trying to run the transaction but nothing to do. Exiting." + msgstr "Tentando executar a transação, mas não há nada a ser feito. Saindo." + +-#: ../cli.py:395 ++#: ../cli.py:403 + msgid "Exiting on user Command" + msgstr "Saindo pelo comando do usuário" + +-#: ../cli.py:399 ++#: ../cli.py:407 + msgid "Downloading Packages:" + msgstr "Baixando pacotes:" + +-#: ../cli.py:404 ++#: ../cli.py:412 + msgid "Error Downloading Packages:\n" + msgstr "Erro ao baixar pacotes:\n" + +-#: ../cli.py:418 +-#: ../yum/__init__.py:4014 ++#: ../cli.py:426 ../yum/__init__.py:4195 + msgid "Running rpm_check_debug" + msgstr "Executando o rpm_check_debug" + +-#: ../cli.py:427 +-#: ../yum/__init__.py:4023 ++#: ../cli.py:435 ../yum/__init__.py:4204 + msgid "ERROR You need to update rpm to handle:" + msgstr "ERRO. Você precisa atualizar o rpm para manipular:" + +-#: ../cli.py:429 +-#: ../yum/__init__.py:4026 ++#: ../cli.py:437 ../yum/__init__.py:4207 + msgid "ERROR with rpm_check_debug vs depsolve:" + msgstr "Erro com o rpm_check_debug vs depsolve:" + +-#: ../cli.py:435 ++#: ../cli.py:443 + msgid "RPM needs to be updated" + msgstr "O RPM precisa ser atualizado" + +-#: ../cli.py:436 ++#: ../cli.py:444 + #, python-format + msgid "Please report this error in %s" + msgstr "Por favor, relate esse erro em %s" + +-#: ../cli.py:442 ++#: ../cli.py:450 + msgid "Running Transaction Test" + msgstr "Executando teste de transação" + +-#: ../cli.py:458 +-msgid "Finished Transaction Test" +-msgstr "Teste de transação finalizado" +- +-#: ../cli.py:460 ++#: ../cli.py:466 + msgid "Transaction Check Error:\n" + msgstr "Erro na verificação da transação:\n" + +-#: ../cli.py:467 ++#: ../cli.py:473 + msgid "Transaction Test Succeeded" + msgstr "Teste de transação completo" + +-#: ../cli.py:489 ++#: ../cli.py:495 + msgid "Running Transaction" + msgstr "Executando a transação" + +-#: ../cli.py:519 ++#: ../cli.py:525 + msgid "" + "Refusing to automatically import keys when running unattended.\n" + "Use \"-y\" to override." + msgstr "" +-"Recusa de importação automática das chaves ao executar de forma não assistida.\n" ++"Recusa de importação automática das chaves ao executar de forma não " ++"assistida.\n" + "Use \"-y\" para sobrescrever." + +-#: ../cli.py:538 +-#: ../cli.py:572 ++#: ../cli.py:544 ../cli.py:578 + msgid " * Maybe you meant: " + msgstr " * Talvez você queira dizer: " + +-#: ../cli.py:555 +-#: ../cli.py:563 ++#: ../cli.py:561 ../cli.py:569 + #, python-format + msgid "Package(s) %s%s%s available, but not installed." + msgstr "Pacotes %s%s%s disponíveis, mas já instalados." + +-#: ../cli.py:569 +-#: ../cli.py:600 +-#: ../cli.py:678 ++#: ../cli.py:575 ../cli.py:607 ../cli.py:687 + #, python-format + msgid "No package %s%s%s available." + msgstr "Nenhum pacote %s%s%s disponível." + +-#: ../cli.py:605 +-#: ../cli.py:738 ++#: ../cli.py:612 ../cli.py:748 + msgid "Package(s) to install" + msgstr "Pacotes a serem instalados" + +-#: ../cli.py:606 +-#: ../cli.py:684 +-#: ../cli.py:717 +-#: ../cli.py:739 +-#: ../yumcommands.py:159 ++#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 ++#: ../yumcommands.py:160 + msgid "Nothing to do" + msgstr "Nada a ser feito" + +-#: ../cli.py:639 ++#: ../cli.py:647 + #, python-format + msgid "%d packages marked for Update" + msgstr "%d pacotes marcados para atualização" + +-#: ../cli.py:642 ++#: ../cli.py:650 + msgid "No Packages marked for Update" + msgstr "Nenhum pacote marcado para atualização" + +-#: ../cli.py:656 ++#: ../cli.py:664 + #, python-format + msgid "%d packages marked for removal" + msgstr "%d pacotes marcados para remoção" + +-#: ../cli.py:659 ++#: ../cli.py:667 + msgid "No Packages marked for removal" + msgstr "Nenhum pacote marcado para remoção" + +-#: ../cli.py:683 ++#: ../cli.py:692 + msgid "Package(s) to downgrade" + msgstr "Pacote(s) a ser(em) retrocedido(s)" + +-#: ../cli.py:707 ++#: ../cli.py:717 + #, python-format + msgid " (from %s)" + msgstr " (a partir de %s)" + +-#: ../cli.py:709 ++#: ../cli.py:719 + #, python-format + msgid "Installed package %s%s%s%s not available." + msgstr "O pacote instalado %s%s%s%s não está disponível." + +-#: ../cli.py:716 ++#: ../cli.py:726 + msgid "Package(s) to reinstall" + msgstr "Pacote(s) a ser(em) reinstalado(s)" + +-#: ../cli.py:729 ++#: ../cli.py:739 + msgid "No Packages Provided" + msgstr "Nenhum pacote fornecido" + +-#: ../cli.py:813 ++#: ../cli.py:818 ++#, python-format ++msgid "Matched: %s" ++msgstr "Encontrado: %s" + - #~ msgid "ignoring bad rpm: %s" - #~ msgstr "ignorando rpm danificado: %s" ++#: ../cli.py:825 + #, python-format + msgid "Warning: No matches found for: %s" + msgstr "Aviso: nenhum resultado para: %s" + +-#: ../cli.py:816 ++#: ../cli.py:828 + msgid "No Matches found" + msgstr "Nenhum pacote localizado" + +-#: ../cli.py:855 ++#: ../cli.py:868 + #, python-format + msgid "" + "Warning: 3.0.x versions of yum would erroneously match against filenames.\n" + " You can use \"%s*/%s%s\" and/or \"%s*bin/%s%s\" to get that behaviour" + msgstr "" +-"Aviso: as versões 3.0.x do yum iriam corresponder erroneamente pelos nomes de arquivos.\n" +-" Você pode usar \"%s*/%s%s\" e/ou \"%s*bin/%s%s\" para obter esse comportamento." ++"Aviso: as versões 3.0.x do yum iriam corresponder erroneamente pelos nomes " ++"de arquivos.\n" ++" Você pode usar \"%s*/%s%s\" e/ou \"%s*bin/%s%s\" para obter esse " ++"comportamento." + +-#: ../cli.py:871 ++#: ../cli.py:884 + #, python-format + msgid "No Package Found for %s" + msgstr "Nenhum pacote localizado para %s" + +-#: ../cli.py:883 ++#: ../cli.py:896 + msgid "Cleaning up Everything" + msgstr "Limpando tudo" + +-#: ../cli.py:897 ++#: ../cli.py:912 + msgid "Cleaning up Headers" + msgstr "Limpando cabeçalhos" + +-#: ../cli.py:900 ++#: ../cli.py:915 + msgid "Cleaning up Packages" + msgstr "Limpando pacotes" + +-#: ../cli.py:903 ++#: ../cli.py:918 + msgid "Cleaning up xml metadata" + msgstr "Limpando metadados em xml" + +-#: ../cli.py:906 ++#: ../cli.py:921 + msgid "Cleaning up database cache" + msgstr "Limpando cache do banco de dados" + +-#: ../cli.py:909 ++#: ../cli.py:924 + msgid "Cleaning up expire-cache metadata" + msgstr "Limpando metadados expirados do cache" + +-#: ../cli.py:912 ++#: ../cli.py:927 ++msgid "Cleaning up cached rpmdb data" ++msgstr "Limpando dados rpmdb em cache" + - #~ msgid "Directory of rpms must be a directory." - #~ msgstr "O diretório de rpms deve ser um diretório." ++#: ../cli.py:930 + msgid "Cleaning up plugins" + msgstr "Limpando plugins" + +-#: ../cli.py:937 ++#: ../cli.py:955 + msgid "Installed Groups:" + msgstr "Grupos instalados:" + +-#: ../cli.py:949 ++#: ../cli.py:967 + msgid "Available Groups:" + msgstr "Grupos disponíveis:" + +-#: ../cli.py:959 ++#: ../cli.py:977 + msgid "Done" + msgstr "Concluído" + +-#: ../cli.py:970 +-#: ../cli.py:988 +-#: ../cli.py:994 +-#: ../yum/__init__.py:2629 ++#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 + #, python-format + msgid "Warning: Group %s does not exist." + msgstr "Aviso: O grupo %s não existe." + +-#: ../cli.py:998 ++#: ../cli.py:1016 + msgid "No packages in any requested group available to install or update" +-msgstr "Nenhum pacote disponível para instalação ou atualização nos grupos requisitados" ++msgstr "" ++"Nenhum pacote disponível para instalação ou atualização nos grupos " ++"requisitados" + +-#: ../cli.py:1000 ++#: ../cli.py:1018 + #, python-format + msgid "%d Package(s) to Install" + msgstr "%d pacote(s) a ser(em) instalado(s)" + +-#: ../cli.py:1010 +-#: ../yum/__init__.py:2641 ++#: ../cli.py:1028 ../yum/__init__.py:2800 + #, python-format + msgid "No group named %s exists" + msgstr "Nenhum grupo de nome %s existe" + +-#: ../cli.py:1016 ++#: ../cli.py:1034 + msgid "No packages to remove from groups" + msgstr "Nenhum pacote a ser removido a partir dos grupos" + +-#: ../cli.py:1018 ++#: ../cli.py:1036 + #, python-format + msgid "%d Package(s) to remove" + msgstr "%d pacote(s) a ser(em) removido(s)" + +-#: ../cli.py:1060 ++#: ../cli.py:1078 + #, python-format + msgid "Package %s is already installed, skipping" + msgstr "O pacote %s já está instalado, ignorando" + +-#: ../cli.py:1071 ++#: ../cli.py:1089 + #, python-format + msgid "Discarding non-comparable pkg %s.%s" + msgstr "Descartando pacote não comparável %s.%s" + + #. we've not got any installed that match n or n+a +-#: ../cli.py:1097 ++#: ../cli.py:1115 + #, python-format + msgid "No other %s installed, adding to list for potential install" +-msgstr "Nenhum outro %s instalado, adicionado à lista para potencial instalação" ++msgstr "" ++"Nenhum outro %s instalado, adicionado à lista para potencial instalação" + +-#: ../cli.py:1117 ++#: ../cli.py:1135 + msgid "Plugin Options" + msgstr "Opções do plugin" + +-#: ../cli.py:1125 ++#: ../cli.py:1143 + #, python-format + msgid "Command line error: %s" + msgstr "Erro na linha de comando: %s" + +-#: ../cli.py:1138 ++#: ../cli.py:1156 + #, python-format + msgid "" + "\n" +@@ -425,106 +406,117 @@ msgstr "" + "\n" + "%s: a opção %s requer um argumento" + +-#: ../cli.py:1191 ++#: ../cli.py:1209 + msgid "--color takes one of: auto, always, never" + msgstr "--color aceita uma destas opções: auto, always, never" + +-#: ../cli.py:1298 ++#: ../cli.py:1319 + msgid "show this help message and exit" + msgstr "mostrar essa mensagem ajuda e sai" + +-#: ../cli.py:1302 ++#: ../cli.py:1323 + msgid "be tolerant of errors" + msgstr "ser tolerante com os erros" + +-#: ../cli.py:1304 +-msgid "run entirely from cache, don't update cache" +-msgstr "executar por completo a partir do cache, não atualiza o cache" ++#: ../cli.py:1326 ++msgid "run entirely from system cache, don't update cache" ++msgstr "" ++"executar por completo a partir do cache do sistema, não atualiza o cache" + +-#: ../cli.py:1306 ++#: ../cli.py:1329 + msgid "config file location" + msgstr "configurar localização do arquivo" + +-#: ../cli.py:1308 ++#: ../cli.py:1332 + msgid "maximum command wait time" + msgstr "Tempo máximo de espera do comando" + +-#: ../cli.py:1310 ++#: ../cli.py:1334 + msgid "debugging output level" + msgstr "nível de depuração na saída" + +-#: ../cli.py:1314 ++#: ../cli.py:1338 + msgid "show duplicates, in repos, in list/search commands" + msgstr "mostrar duplicados em repos e em comandos de pesquisa/listagem" + +-#: ../cli.py:1316 ++#: ../cli.py:1340 + msgid "error output level" + msgstr "nível de erro na saída" + +-#: ../cli.py:1319 ++#: ../cli.py:1343 ++msgid "debugging output level for rpm" ++msgstr "nível de depuração na saída para o rpm" + - #~ msgid "failover: out of servers to try" - #~ msgstr "recuperação: não há mais servidores para tentar" ++#: ../cli.py:1346 + msgid "quiet operation" + msgstr "operação discreta" + +-#: ../cli.py:1321 ++#: ../cli.py:1348 + msgid "verbose operation" + msgstr "operação detalhada" + +-#: ../cli.py:1323 ++#: ../cli.py:1350 + msgid "answer yes for all questions" + msgstr "responder sim para todas as perguntas" + +-#: ../cli.py:1325 ++#: ../cli.py:1352 + msgid "show Yum version and exit" + msgstr "mostrar versão do Yum ao sair" + +-#: ../cli.py:1326 ++#: ../cli.py:1353 + msgid "set install root" + msgstr "definir raiz de instalação" + +-#: ../cli.py:1330 ++#: ../cli.py:1357 + msgid "enable one or more repositories (wildcards allowed)" + msgstr "habilitar um ou mais repositórios (curingas são permitidos)" + +-#: ../cli.py:1334 ++#: ../cli.py:1361 + msgid "disable one or more repositories (wildcards allowed)" + msgstr "desabilitar um ou mais repositórios (curingas são permitidos)" + +-#: ../cli.py:1337 ++#: ../cli.py:1364 + msgid "exclude package(s) by name or glob" + msgstr "excluir pacote(s) por nome ou glob" + +-#: ../cli.py:1339 ++#: ../cli.py:1366 + msgid "disable exclude from main, for a repo or for everything" +-msgstr "desabilitar a exclusão a partir do principal, para um repositório ou para tudo" ++msgstr "" ++"desabilitar a exclusão a partir do principal, para um repositório ou para " ++"tudo" + +-#: ../cli.py:1342 ++#: ../cli.py:1369 + msgid "enable obsoletes processing during updates" + msgstr "Habilitar processo de obsolescência durante as atualizações" + +-#: ../cli.py:1344 ++#: ../cli.py:1371 + msgid "disable Yum plugins" + msgstr "desabilitar plugins do Yum" + +-#: ../cli.py:1346 ++#: ../cli.py:1373 + msgid "disable gpg signature checking" + msgstr "desabilitar verificação de assinaturas gpg" + +-#: ../cli.py:1348 ++#: ../cli.py:1375 + msgid "disable plugins by name" + msgstr "desabilitar plugins pelo nome" + +-#: ../cli.py:1351 ++#: ../cli.py:1378 + msgid "enable plugins by name" + msgstr "habilita plugins pelo nome" + +-#: ../cli.py:1354 ++#: ../cli.py:1381 + msgid "skip packages with depsolving problems" + msgstr "ignorar pacotes com problemas de solução de dependências" + +-#: ../cli.py:1356 ++#: ../cli.py:1383 + msgid "control whether color is used" + msgstr "controla o uso da cor" + ++#: ../cli.py:1385 ++msgid "set value of $releasever in yum config and repo files" ++msgstr "defina o valor de $releasever nos arquivos repo e yum config" + - #~ msgid "Getting header.info from server" - #~ msgstr "Obtendo header.info do servidor" -- -diff --git a/po/ru.po b/po/ru.po -index a1b946e..ed31858 100644 ---- a/po/ru.po -+++ b/po/ru.po -@@ -2,56 +2,76 @@ - # Copyright (C) 2010 yum's COPYRIGHT HOLDER - # This file is distributed under the same license as the yum package. - # --# Vladimir Bormotov , 2002. --# Grigory Bakunov , 2002,2003. --# Timur Malikin , 2010. -+# Vladimir Bormotov , 2002 -+# Grigory Bakunov , 2002, 2003 -+# Timur Malikin , 2010 -+# Misha Shnurapet , 2010 + #: ../output.py:305 + msgid "Jan" + msgstr "Jan" +@@ -577,105 +569,104 @@ msgstr "Dez" + msgid "Trying other mirror." + msgstr "Tentando outro espelho." + +-#: ../output.py:538 ++#: ../output.py:534 + #, python-format + msgid "Name : %s%s%s" + msgstr "Nome : %s%s%s" + +-#: ../output.py:539 ++#: ../output.py:535 + #, python-format + msgid "Arch : %s" + msgstr "Arq. : %s" + +-#: ../output.py:541 ++#: ../output.py:537 + #, python-format + msgid "Epoch : %s" + msgstr "Período : %s" + +-#: ../output.py:542 ++#: ../output.py:538 + #, python-format + msgid "Version : %s" + msgstr "Versão : %s" + +-#: ../output.py:543 ++#: ../output.py:539 + #, python-format + msgid "Release : %s" + msgstr "Lançamento : %s" + +-#: ../output.py:544 ++#: ../output.py:540 + #, python-format + msgid "Size : %s" + msgstr "Tamanho : %s" + +-#: ../output.py:545 ++#: ../output.py:541 + #, python-format + msgid "Repo : %s" + msgstr "Repo : %s" + +-#: ../output.py:547 ++#: ../output.py:543 + #, python-format + msgid "From repo : %s" + msgstr "Do repositório: %s" + +-#: ../output.py:549 ++#: ../output.py:545 + #, python-format + msgid "Committer : %s" + msgstr "Enviado por : %s" + +-#: ../output.py:550 ++#: ../output.py:546 + #, python-format + msgid "Committime : %s" + msgstr "Horário do envio : %s" + +-#: ../output.py:551 ++#: ../output.py:547 + #, python-format + msgid "Buildtime : %s" + msgstr "Horário da construção : %s" + +-#: ../output.py:553 ++#: ../output.py:549 + #, python-format + msgid "Installtime: %s" + msgstr "Horário da instalação: %s" + +-#: ../output.py:554 ++#: ../output.py:550 + msgid "Summary : " + msgstr "Sumário : " + +-#: ../output.py:556 ++#: ../output.py:552 + #, python-format + msgid "URL : %s" + msgstr "URL : %s" + +-#: ../output.py:557 +-#, python-format +-msgid "License : %s" +-msgstr "Licença : %s" ++#: ../output.py:553 ++msgid "License : " ++msgstr "Licença : " + +-#: ../output.py:558 ++#: ../output.py:554 + msgid "Description: " + msgstr "Descrição: " + +-#: ../output.py:626 ++#: ../output.py:622 + msgid "y" + msgstr "s" + +-#: ../output.py:626 ++#: ../output.py:622 + msgid "yes" + msgstr "sim" + +-#: ../output.py:627 ++#: ../output.py:623 + msgid "n" + msgstr "n" + +-#: ../output.py:627 ++#: ../output.py:623 + msgid "no" + msgstr "não" + +-#: ../output.py:631 ++#: ../output.py:627 + msgid "Is this ok [y/N]: " + msgstr "Correto? [s/N]:" + +-#: ../output.py:722 ++#: ../output.py:715 + #, python-format msgid "" - msgstr "" - "Project-Id-Version: yum\n" - "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2010-02-11 10:54-0500\n" --"PO-Revision-Date: 2010-03-15 21:44+0300\n" --"Last-Translator: Timur Malikin \n" -+"PO-Revision-Date: 2010-04-24 00:18+0800\n" -+"Last-Translator: Misha Shnurapet \n" - "Language-Team: ru \n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Generated-By: pygettext.py 1.1\n" + "\n" +@@ -684,151 +675,151 @@ msgstr "" + "\n" + "Grupo: %s" --#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 -+#: ../callback.py:48 -+#: ../output.py:947 -+#: ../yum/rpmtrans.py:72 - msgid "Updating" - msgstr "Обновление" +-#: ../output.py:726 ++#: ../output.py:719 + #, python-format + msgid " Group-Id: %s" + msgstr " Group-Id: %s" --#: ../callback.py:49 ../yum/rpmtrans.py:73 -+#: ../callback.py:49 -+#: ../yum/rpmtrans.py:73 - msgid "Erasing" - msgstr "Удаление" +-#: ../output.py:731 ++#: ../output.py:724 + #, python-format + msgid " Description: %s" + msgstr " Descrição: %s" + +-#: ../output.py:733 ++#: ../output.py:726 + msgid " Mandatory Packages:" + msgstr " Pacotes obrigatórios:" + +-#: ../output.py:734 ++#: ../output.py:727 + msgid " Default Packages:" + msgstr " Pacotes padrão:" + +-#: ../output.py:735 ++#: ../output.py:728 + msgid " Optional Packages:" + msgstr " Pacotes opcionais:" + +-#: ../output.py:736 ++#: ../output.py:729 + msgid " Conditional Packages:" + msgstr " Pacotes condicionais:" + +-#: ../output.py:756 ++#: ../output.py:749 + #, python-format + msgid "package: %s" + msgstr "pacote: %s" + +-#: ../output.py:758 ++#: ../output.py:751 + msgid " No dependencies for this package" + msgstr " Nenhuma dependência para este pacote" + +-#: ../output.py:763 ++#: ../output.py:756 + #, python-format + msgid " dependency: %s" + msgstr " dependência: %s" + +-#: ../output.py:765 ++#: ../output.py:758 + msgid " Unsatisfied dependency" + msgstr " Dependência não satisfeita" + +-#: ../output.py:837 ++#: ../output.py:830 + #, python-format + msgid "Repo : %s" + msgstr "Repo : %s" + +-#: ../output.py:838 ++#: ../output.py:831 + msgid "Matched from:" + msgstr "Resultado a partir de:" + +-#: ../output.py:847 ++#: ../output.py:840 + msgid "Description : " + msgstr "Descrição : " + +-#: ../output.py:850 ++#: ../output.py:843 + #, python-format + msgid "URL : %s" + msgstr "URL : %s" + +-#: ../output.py:853 ++#: ../output.py:846 + #, python-format + msgid "License : %s" + msgstr "Licença : %s" + +-#: ../output.py:856 ++#: ../output.py:849 + #, python-format + msgid "Filename : %s" + msgstr "Nome de arquivo : %s" + +-#: ../output.py:860 ++#: ../output.py:853 + msgid "Other : " + msgstr "Outro : " + +-#: ../output.py:893 ++#: ../output.py:896 + msgid "There was an error calculating total download size" + msgstr "Houve um erro no cálculo do tamanho total do download" + +-#: ../output.py:898 ++#: ../output.py:901 + #, python-format + msgid "Total size: %s" + msgstr "Tamanho total: %s" + +-#: ../output.py:901 ++#: ../output.py:904 + #, python-format + msgid "Total download size: %s" + msgstr "Tamanho total do download: %s" + +-#: ../output.py:942 ++#: ../output.py:908 ++#, python-format ++msgid "Installed size: %s" ++msgstr "Tamanho depois de instalado: %s" ++ ++#: ../output.py:949 + msgid "Reinstalling" + msgstr "Reinstalando" + +-#: ../output.py:943 ++#: ../output.py:950 + msgid "Downgrading" + msgstr "Desatualizando" + +-#: ../output.py:944 ++#: ../output.py:951 + msgid "Installing for dependencies" + msgstr "Instalando para as dependências" + +-#: ../output.py:945 ++#: ../output.py:952 + msgid "Updating for dependencies" + msgstr "Atualizando para as dependências" + +-#: ../output.py:946 ++#: ../output.py:953 + msgid "Removing for dependencies" + msgstr "Removendo para as dependências" + +-#: ../output.py:953 +-#: ../output.py:1065 ++#: ../output.py:960 ../output.py:1072 + msgid "Skipped (dependency problems)" + msgstr "Ignorado (problemas de dependências)" + +-#: ../output.py:976 ++#: ../output.py:983 + msgid "Package" + msgstr "Pacote" + +-#: ../output.py:976 ++#: ../output.py:983 + msgid "Arch" + msgstr "Arq." + +-#: ../output.py:977 ++#: ../output.py:984 + msgid "Version" + msgstr "Versão" --#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 --#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 -+#: ../callback.py:50 -+#: ../callback.py:51 -+#: ../callback.py:53 -+#: ../output.py:946 -+#: ../output.py:1659 -+#: ../yum/rpmtrans.py:74 -+#: ../yum/rpmtrans.py:75 - #: ../yum/rpmtrans.py:77 - msgid "Installing" - msgstr "Установка" +-#: ../output.py:977 ++#: ../output.py:984 + msgid "Repository" + msgstr "Repo" --#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 -+#: ../callback.py:52 -+#: ../callback.py:58 -+#: ../output.py:1484 -+#: ../yum/rpmtrans.py:76 - msgid "Obsoleted" --msgstr "Заменено" -+msgstr "Исключено" +-#: ../output.py:978 ++#: ../output.py:985 + msgid "Size" + msgstr "Tam." --#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 -+#: ../callback.py:54 -+#: ../output.py:1070 -+#: ../output.py:1442 -+#: ../output.py:1491 - msgid "Updated" - msgstr "Обновлено" +-#: ../output.py:990 ++#: ../output.py:997 + #, python-format +-msgid "" +-" replacing %s%s%s.%s %s\n" +-"\n" +-msgstr "" +-" substituindo %s%s%s.%s %s\n" +-"\n" ++msgid " replacing %s%s%s.%s %s\n" ++msgstr " substituindo %s%s%s.%s %s\n" --#: ../callback.py:55 ../output.py:1438 -+#: ../callback.py:55 -+#: ../output.py:1438 - msgid "Erased" - msgstr "Удалено" +-#: ../output.py:999 ++#: ../output.py:1006 + #, python-format + msgid "" + "\n" +@@ -839,7 +830,7 @@ msgstr "" + "Resumo da transação\n" + "%s\n" --#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 --#: ../output.py:1434 ../output.py:1646 -+#: ../callback.py:56 -+#: ../callback.py:57 -+#: ../callback.py:59 -+#: ../output.py:1068 -+#: ../output.py:1434 -+#: ../output.py:1646 - msgid "Installed" - msgstr "Установлено" +-#: ../output.py:1006 ++#: ../output.py:1013 + #, python-format + msgid "" + "Install %5.5s Package(s)\n" +@@ -848,7 +839,7 @@ msgstr "" + "Instalar %5.5s Pacote(s)\n" + "Atualizar %5.5s Pacote(s)\n" - #: ../callback.py:130 - msgid "No header - huh?" --msgstr "Нет заголовка?" -+msgstr "Заголовка нет — ага?" +-#: ../output.py:1015 ++#: ../output.py:1022 + #, python-format + msgid "" + "Remove %5.5s Package(s)\n" +@@ -859,32 +850,32 @@ msgstr "" + "Reinstalar %5.5s Pacote(s)\n" + "Desatualizar %5.5s Pacote(s)\n" - #: ../callback.py:168 - msgid "Repackage" -@@ -67,11 +87,14 @@ msgstr "Ошибка: неверный выходной статус: %s для - msgid "Erased: %s" - msgstr "Удалено: %s" +-#: ../output.py:1059 ++#: ../output.py:1066 + msgid "Removed" + msgstr "Removido(s)" --#: ../callback.py:217 ../output.py:948 ../output.py:1648 -+#: ../callback.py:217 -+#: ../output.py:948 -+#: ../output.py:1648 - msgid "Removing" - msgstr "Удаление" +-#: ../output.py:1060 ++#: ../output.py:1067 + msgid "Dependency Removed" + msgstr "Dependência(s) removida(s)" --#: ../callback.py:219 ../yum/rpmtrans.py:78 -+#: ../callback.py:219 -+#: ../yum/rpmtrans.py:78 - msgid "Cleanup" - msgstr "Очистка" +-#: ../output.py:1062 ++#: ../output.py:1069 + msgid "Dependency Installed" + msgstr "Dependência(s) instalada(s)" -@@ -86,14 +109,17 @@ msgstr "Настройка репозиториев" +-#: ../output.py:1064 ++#: ../output.py:1071 + msgid "Dependency Updated" + msgstr "Dependência(s) atualizada(s)" - #: ../cli.py:130 - msgid "Reading repository metadata in from local files" --msgstr "Чтение метаданных репозиториев с локальных файлов " -+msgstr "Чтение локальных метаданных для репозиториев" +-#: ../output.py:1066 ++#: ../output.py:1073 + msgid "Replaced" + msgstr "Substituído(s)" --#: ../cli.py:194 ../utils.py:193 -+#: ../cli.py:194 -+#: ../utils.py:193 - #, python-format - msgid "Config Error: %s" - msgstr "Ошибка конфигурации: %s" +-#: ../output.py:1067 ++#: ../output.py:1074 + msgid "Failed" + msgstr "Falhou" --#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 -+#: ../cli.py:197 -+#: ../cli.py:1272 -+#: ../utils.py:196 + #. Delta between C-c's so we treat as exit +-#: ../output.py:1133 ++#: ../output.py:1140 + msgid "two" + msgstr "dois" + +@@ -892,227 +883,380 @@ msgstr "dois" + #. Current download cancelled, interrupt (ctrl-c) again within two seconds + #. to exit. + #. Where "interupt (ctrl-c) again" and "two" are highlighted. +-#: ../output.py:1144 ++#: ../output.py:1151 #, python-format - msgid "Options Error: %s" - msgstr "Ошибка опции: %s" -@@ -143,7 +169,7 @@ msgstr "" + msgid "" + "\n" +-" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s seconds\n" ++" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s " ++"seconds\n" + "to exit.\n" + msgstr "" + "\n" +-" Download atual cancelado, %sinterrompa com (ctrl-c) novamente%s dentro de %s%s%s segundos\n" ++" Download atual cancelado, %sinterrompa com (ctrl-c) novamente%s dentro de %s" ++"%s%s segundos\n" + "para sair.\n" - #: ../cli.py:364 - msgid "Trying to run the transaction but nothing to do. Exiting." --msgstr "Попытка запуска транзакции, но нет задач для выполнения. Выход." -+msgstr "Попытка предпринята, делать нечего. Завершение." +-#: ../output.py:1155 ++#: ../output.py:1162 + msgid "user interrupt" + msgstr "interrupção do usuário" - #: ../cli.py:403 - msgid "Exiting on user Command" -@@ -157,21 +183,24 @@ msgstr "Загрузка пакетов:" - msgid "Error Downloading Packages:\n" - msgstr "Ошибка загрузки пакетов:\n" +-#: ../output.py:1173 ++#: ../output.py:1180 + msgid "Total" + msgstr "Total" --#: ../cli.py:426 ../yum/__init__.py:4195 -+#: ../cli.py:426 -+#: ../yum/__init__.py:4195 - msgid "Running rpm_check_debug" - msgstr "Запуск rpm_check_debug" ++#: ../output.py:1202 ++msgid "I" ++msgstr "I" ++ + #: ../output.py:1203 ++msgid "O" ++msgstr "O" ++ ++#: ../output.py:1204 ++msgid "E" ++msgstr "E" ++ ++#: ../output.py:1205 ++msgid "R" ++msgstr "R" ++ ++#: ../output.py:1206 ++msgid "D" ++msgstr "D" ++ ++#: ../output.py:1207 ++msgid "U" ++msgstr "U" ++ ++#: ../output.py:1217 + msgid "" + msgstr "" --#: ../cli.py:435 ../yum/__init__.py:4204 -+#: ../cli.py:435 -+#: ../yum/__init__.py:4204 - msgid "ERROR You need to update rpm to handle:" - msgstr "ОШИБКА Вам необходимо обновить пакет вручную" +-#: ../output.py:1204 ++#: ../output.py:1218 + msgid "System" + msgstr "Sistema" --#: ../cli.py:437 ../yum/__init__.py:4207 -+#: ../cli.py:437 -+#: ../yum/__init__.py:4207 - msgid "ERROR with rpm_check_debug vs depsolve:" - msgstr "ОШИБКА rpm_check_debug и разрешение зависимостей:" +-#: ../output.py:1240 ++#: ../output.py:1254 + msgid "Bad transaction IDs, or package(s), given" + msgstr "IDs de transação ou pacote(s) fornecido(s) inválido(s)" - #: ../cli.py:443 - msgid "RPM needs to be updated" --msgstr "RPM пакет должен быть обновлён" -+msgstr "RPM пакет должен быть обновлен" +-#: ../output.py:1284 +-#: ../yumcommands.py:1149 +-#: ../yum/__init__.py:1067 +-msgid "Warning: RPMDB has been altered since the last yum transaction." +-msgstr "Aviso: o RPMDB foi alterado desde a última transação do yum." ++#: ../output.py:1266 ++msgid "ID" ++msgstr "ID" ++ ++#: ../output.py:1267 ../output.py:1520 ++msgid "Login user" ++msgstr "Usuário de login" ++ ++#: ../output.py:1268 ++msgid "Date and time" ++msgstr "Data e hora" ++ ++#: ../output.py:1269 ../output.py:1522 ++msgid "Action(s)" ++msgstr "Ação(ões)" - #: ../cli.py:444 - #, python-format -@@ -180,19 +209,19 @@ msgstr "Пожалуйста, сообщите об этой ошибке %s" +-#: ../output.py:1289 ++#: ../output.py:1270 ../output.py:1523 ++msgid "Altered" ++msgstr "Alterado" ++ ++#: ../output.py:1310 + msgid "No transaction ID given" + msgstr "Nenhum ID de transação fornecido" - #: ../cli.py:450 - msgid "Running Transaction Test" --msgstr "Проверка транзакций" -+msgstr "Проверяем сценарий..." +-#: ../output.py:1297 ++#: ../output.py:1336 + msgid "Bad transaction ID given" + msgstr "O ID de transação fornecido é inválido" - #: ../cli.py:466 - msgid "Transaction Check Error:\n" --msgstr "Ошибка проверки транзакции:\n" -+msgstr "Завершено с ошибкой:\n" +-#: ../output.py:1302 ++#: ../output.py:1341 + msgid "Not found given transaction ID" + msgstr "O ID de transação dado não foi localizado" - #: ../cli.py:473 - msgid "Transaction Test Succeeded" --msgstr "Проверка прошла успешно" -+msgstr "Успешно." +-#: ../output.py:1310 ++#: ../output.py:1349 + msgid "Found more than one transaction ID!" + msgstr "Foi localizado mais de um ID de transação!" - #: ../cli.py:495 - msgid "Running Transaction" --msgstr "Запуск транзакции" -+msgstr "Выполняем команды" +-#: ../output.py:1331 ++#: ../output.py:1370 + msgid "No transaction ID, or package, given" + msgstr "Nenhum ID de transação ou pacote fornecido" - #: ../cli.py:525 - msgid "" -@@ -202,28 +231,36 @@ msgstr "" - "Отмена автоматического импорта ключей во время запуска без контроля.\n" - "Используйте \"-y\" для игнорирования." +-#: ../output.py:1357 ++#: ../output.py:1396 + msgid "Transaction ID :" + msgstr "ID de transação:" --#: ../cli.py:544 ../cli.py:578 -+#: ../cli.py:544 -+#: ../cli.py:578 - msgid " * Maybe you meant: " - msgstr "* Возможно вы имели в виду:" +-#: ../output.py:1359 ++#: ../output.py:1398 + msgid "Begin time :" + msgstr "Horário de início:" --#: ../cli.py:561 ../cli.py:569 -+#: ../cli.py:561 -+#: ../cli.py:569 - #, python-format - msgid "Package(s) %s%s%s available, but not installed." - msgstr "Пакет(ы) %s%s%s доступны, но не установлены." +-#: ../output.py:1362 +-#: ../output.py:1364 ++#: ../output.py:1401 ../output.py:1403 + msgid "Begin rpmdb :" + msgstr "Início do rpmdb:" --#: ../cli.py:575 ../cli.py:607 ../cli.py:687 -+#: ../cli.py:575 -+#: ../cli.py:607 -+#: ../cli.py:687 +-#: ../output.py:1378 ++#: ../output.py:1417 #, python-format - msgid "No package %s%s%s available." - msgstr "Пакет %s%s%s недоступен." + msgid "(%s seconds)" + msgstr "(%s segundos)" --#: ../cli.py:612 ../cli.py:748 -+#: ../cli.py:612 -+#: ../cli.py:748 - msgid "Package(s) to install" - msgstr "Пакет(ы) для установки" +-#: ../output.py:1379 ++#: ../output.py:1418 + msgid "End time :" + msgstr "Horário do fim:" --#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 -+#: ../cli.py:613 -+#: ../cli.py:693 -+#: ../cli.py:727 -+#: ../cli.py:749 - #: ../yumcommands.py:160 - msgid "Nothing to do" --msgstr "Нечего выполнять" -+msgstr "Выполнять нечего" +-#: ../output.py:1382 +-#: ../output.py:1384 ++#: ../output.py:1421 ../output.py:1423 + msgid "End rpmdb :" + msgstr "Fim do rpmdb:" - #: ../cli.py:647 - #, python-format -@@ -232,7 +269,7 @@ msgstr "%d пакеты отмечены для обновления" +-#: ../output.py:1385 ++#: ../output.py:1424 + msgid "User :" + msgstr "Usuário:" - #: ../cli.py:650 - msgid "No Packages marked for Update" --msgstr "Нет пакетов отмеченных для обновления" -+msgstr "Нет пакетов, отмеченных для обновления" +-#: ../output.py:1387 +-#: ../output.py:1389 +-#: ../output.py:1391 ++#: ../output.py:1426 ../output.py:1428 ../output.py:1430 + msgid "Return-Code :" + msgstr "Código de retorno:" - #: ../cli.py:664 - #, python-format -@@ -241,11 +278,11 @@ msgstr "%d пакеты отмечены для удаления" +-#: ../output.py:1387 ++#: ../output.py:1426 + msgid "Aborted" + msgstr "Interrompido" - #: ../cli.py:667 - msgid "No Packages marked for removal" --msgstr "Нет пакетов отмеченных для удаления" -+msgstr "Нет пакетов, отмеченных для удаления" +-#: ../output.py:1389 ++#: ../output.py:1428 + msgid "Failure:" + msgstr "Falha:" - #: ../cli.py:692 - msgid "Package(s) to downgrade" --msgstr "Пакет(ы) для возврата к предыдущей версии" -+msgstr "Пакет(ы) для отката версии" +-#: ../output.py:1391 ++#: ../output.py:1430 + msgid "Success" + msgstr "Sucesso" - #: ../cli.py:717 - #, python-format -@@ -273,7 +310,7 @@ msgstr "Совпадений: %s" - #: ../cli.py:825 - #, python-format - msgid "Warning: No matches found for: %s" --msgstr "Внимание: Нет совпадений для: %s" -+msgstr "Внимание: совпадений для %s не найдено" +-#: ../output.py:1392 ++#: ../output.py:1431 + msgid "Transaction performed with:" + msgstr "Transação realizada com:" - #: ../cli.py:828 - msgid "No Matches found" -@@ -324,42 +361,46 @@ msgstr "Очистка кэша данных базы RPM" +-#: ../output.py:1405 ++#: ../output.py:1444 ../output.py:1489 + msgid "Downgraded" + msgstr "Desatualizados" - #: ../cli.py:930 - msgid "Cleaning up plugins" --msgstr "Очистка плагинов" -+msgstr "Сброс модулей" + #. multiple versions installed, both older and newer +-#: ../output.py:1407 ++#: ../output.py:1446 + msgid "Weird" + msgstr "Estranho" - #: ../cli.py:955 - msgid "Installed Groups:" --msgstr "Установлены группы: " -+msgstr "Установлены коллекции: " +-#: ../output.py:1409 ++#: ../output.py:1448 + msgid "Packages Altered:" + msgstr "Pacotes alterados:" - #: ../cli.py:967 - msgid "Available Groups:" --msgstr "Доступные группы:" -+msgstr "Доступные коллекции:" +-#: ../output.py:1412 ++#: ../output.py:1451 + msgid "Scriptlet output:" + msgstr "Saída do scriptlet:" - #: ../cli.py:977 - msgid "Done" - msgstr "Выполнено" +-#: ../output.py:1418 ++#: ../output.py:1457 + msgid "Errors:" + msgstr "Erros:" --#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 -+#: ../cli.py:988 -+#: ../cli.py:1006 -+#: ../cli.py:1012 -+#: ../yum/__init__.py:2788 - #, python-format - msgid "Warning: Group %s does not exist." --msgstr "Внимание: группа %s не существует." -+msgstr "Внимание: коллекции %s не существует." +-#: ../output.py:1489 ++#: ../output.py:1481 ../output.py:1482 ++msgid "Install" ++msgstr "Instalar" ++ ++#: ../output.py:1483 ++msgid "Dep-Install" ++msgstr "Dep-Install" ++ ++#: ../output.py:1485 ++msgid "Obsoleting" ++msgstr "Obsoletos" ++ ++#: ../output.py:1486 ++msgid "Erase" ++msgstr "Apagar" ++ ++#: ../output.py:1487 ++msgid "Reinstall" ++msgstr "Reinstalar" ++ ++#: ../output.py:1488 ++#, fuzzy ++msgid "Downgrade" ++msgstr "Regredir" ++ ++#: ../output.py:1490 ++msgid "Update" ++msgstr "Atualizar" ++ ++#: ../output.py:1521 ++msgid "Time" ++msgstr "Hora" ++ ++#: ../output.py:1547 + msgid "Last day" + msgstr "Ontem" - #: ../cli.py:1016 - msgid "No packages in any requested group available to install or update" --msgstr "В запрашиваемых группах недоступны пакеты для обновления или установки" -+msgstr "Во всех указанных коллекциях пакеты для установки или обновления отсутствуют" +-#: ../output.py:1490 ++#: ../output.py:1548 + msgid "Last week" + msgstr "Uma semana atrás" - #: ../cli.py:1018 - #, python-format - msgid "%d Package(s) to Install" - msgstr "%d Пакет(ы) для установки" +-#: ../output.py:1491 ++#: ../output.py:1549 + msgid "Last 2 weeks" + msgstr "2 semanas atrás" --#: ../cli.py:1028 ../yum/__init__.py:2800 -+#: ../cli.py:1028 -+#: ../yum/__init__.py:2800 - #, python-format - msgid "No group named %s exists" --msgstr "Группы с именем %s не существует" -+msgstr "Коллекции с названием %s не существует" + #. US default :p +-#: ../output.py:1492 ++#: ../output.py:1550 + msgid "Last 3 months" + msgstr "3 meses atrás" - #: ../cli.py:1034 - msgid "No packages to remove from groups" --msgstr "Нет пакетов для удаления с групп" -+msgstr "Нет пакетов для удаления из коллекций" +-#: ../output.py:1493 ++#: ../output.py:1551 + msgid "Last 6 months" + msgstr "6 meses atrás" - #: ../cli.py:1036 - #, python-format -@@ -369,7 +410,7 @@ msgstr "%d Пакет(ы) для удаления" - #: ../cli.py:1078 - #, python-format - msgid "Package %s is already installed, skipping" --msgstr "Пакет %s уже установлен, пропуск" -+msgstr "Пакет %s уже установлен, пропускаем" +-#: ../output.py:1494 ++#: ../output.py:1552 + msgid "Last year" + msgstr "Ano passado" - #: ../cli.py:1089 - #, python-format -@@ -380,11 +421,11 @@ msgstr "Исключение несовместимого пакета %s.%s" - #: ../cli.py:1115 - #, python-format - msgid "No other %s installed, adding to list for potential install" --msgstr "Другое %s не установлено, добавляем в список потенциальных установок" -+msgstr "Других %s не установлено, добавляем в список для возможной установки" +-#: ../output.py:1495 ++#: ../output.py:1553 + msgid "Over a year ago" + msgstr "Há mais de um ano" - #: ../cli.py:1135 - msgid "Plugin Options" --msgstr "Опции плагина" -+msgstr "Опции модуля" +-#: ../output.py:1524 ++#: ../output.py:1585 + msgid "installed" + msgstr "instalado" - #: ../cli.py:1143 - #, python-format -@@ -416,7 +457,7 @@ msgstr "игнорировать ошибки" +-#: ../output.py:1525 ++#: ../output.py:1586 + msgid "updated" + msgstr "atualizado" - #: ../cli.py:1326 - msgid "run entirely from system cache, don't update cache" --msgstr "запуск только из системного кэша, не обновляйте кэш" -+msgstr "брать полностью из системного кэша, не обновлять его" +-#: ../output.py:1526 ++#: ../output.py:1587 + msgid "obsoleted" + msgstr "obsoleto" - #: ../cli.py:1329 - msgid "config file location" -@@ -464,13 +505,11 @@ msgstr "настройка корневой папки" +-#: ../output.py:1527 ++#: ../output.py:1588 + msgid "erased" + msgstr "removido" - #: ../cli.py:1357 - msgid "enable one or more repositories (wildcards allowed)" --msgstr "" --"включение одного и более репозиториев (поиск по шаблону поддерживается)" -+msgstr "включение одного и более репозиториев (поиск по шаблону поддерживается)" +-#: ../output.py:1531 ++#: ../output.py:1592 + #, python-format + msgid "---> Package %s.%s %s:%s-%s set to be %s" + msgstr "---> Pacote %s.%s %s:%s-%s definido para ser %s" - #: ../cli.py:1361 - msgid "disable one or more repositories (wildcards allowed)" --msgstr "" --"выключение одного и более репозиториев (поиск по шаблону поддерживается)" -+msgstr "выключение одного и более репозиториев (поиск по шаблону поддерживается)" +-#: ../output.py:1538 ++#: ../output.py:1599 + msgid "--> Running transaction check" + msgstr "--> Executando verificação da transação" - #: ../cli.py:1364 - msgid "exclude package(s) by name or glob" -@@ -482,11 +521,11 @@ msgstr "отключает исключения для конкретного р +-#: ../output.py:1543 ++#: ../output.py:1604 + msgid "--> Restarting Dependency Resolution with new changes." + msgstr "--> Reiniciando resolução de dependências com as novas alterações." - #: ../cli.py:1369 - msgid "enable obsoletes processing during updates" --msgstr "включить процесс замены во время обновления" -+msgstr "включить обработку недействительных во время обновления" +-#: ../output.py:1548 ++#: ../output.py:1609 + msgid "--> Finished Dependency Resolution" + msgstr "--> Resolução de dependências finalizada" - #: ../cli.py:1371 - msgid "disable Yum plugins" --msgstr "отключить плагины Yum" -+msgstr "отключить модули Yum" +-#: ../output.py:1553 +-#: ../output.py:1558 ++#: ../output.py:1614 ../output.py:1619 + #, python-format + msgid "--> Processing Dependency: %s for package: %s" + msgstr "--> Processando dependência: %s para o pacote: %s" - #: ../cli.py:1373 - msgid "disable gpg signature checking" -@@ -494,11 +533,11 @@ msgstr "отключить проверку подписи gpg" +-#: ../output.py:1562 ++#: ../output.py:1623 + #, python-format + msgid "--> Unresolved Dependency: %s" + msgstr "--> Dependência não resolvida: %s" - #: ../cli.py:1375 - msgid "disable plugins by name" --msgstr "отключить плагин по имени" -+msgstr "отключить модуль по названию" +-#: ../output.py:1568 +-#: ../output.py:1573 ++#: ../output.py:1634 ++#, python-format ++msgid "Package: %s" ++msgstr "Pacote: %s" ++ ++#: ../output.py:1636 ++#, python-format ++msgid "" ++"\n" ++" Requires: %s" ++msgstr "" ++"\n" ++" Requer: %s" ++ ++#: ../output.py:1649 ../output.py:1660 ++#, python-format ++msgid "" ++"\n" ++" %s: %s (%s)" ++msgstr "" ++"\n" ++" %s: %s (%s)" ++ ++#: ../output.py:1657 ++msgid "Available" ++msgstr "Disponível" ++ ++#: ../output.py:1665 ../output.py:1670 + #, python-format + msgid "--> Processing Conflict: %s conflicts %s" + msgstr "--> Processando conflito: %s conflita com %s" - #: ../cli.py:1378 - msgid "enable plugins by name" --msgstr "включить плагин по имени" -+msgstr "включить модуль по названию" +-#: ../output.py:1577 ++#: ../output.py:1674 + msgid "--> Populating transaction set with selected packages. Please wait." +-msgstr "--> Construindo conjunto de transações com os pacotes selecionados. Por favor aguarde." ++msgstr "" ++"--> Construindo conjunto de transações com os pacotes selecionados. Por " ++"favor aguarde." - #: ../cli.py:1381 - msgid "skip packages with depsolving problems" -@@ -510,9 +549,7 @@ msgstr "Использовать ли цветовые схемы" +-#: ../output.py:1581 ++#: ../output.py:1678 + #, python-format + msgid "---> Downloading header for %s to pack into transaction set." + msgstr "--> Baixando cabeçalho do %s para inclusão no conjunto de transações." - #: ../cli.py:1385 - msgid "set value of $releasever in yum config and repo files" --msgstr "" --"установите значение $releasever в конфигурационном файле yum и в файлах " --"репозиториев (repo)" -+msgstr "установите значение $releasever в конфигурационном файле yum и в файлах репозиториев (repo)" +-#: ../utils.py:137 +-#: ../yummain.py:42 ++#: ../utils.py:93 ++msgid "Running" ++msgstr "Executando" ++ ++#: ../utils.py:94 ++msgid "Sleeping" ++msgstr "Dormindo" ++ ++#: ../utils.py:95 ++msgid "Uninterruptible" ++msgstr "Ininterrompível" ++ ++#: ../utils.py:96 ++msgid "Zombie" ++msgstr "Zumbi" ++ ++#: ../utils.py:97 ++msgid "Traced/Stopped" ++msgstr "Rastreado/Parado" ++ ++#: ../utils.py:98 ../yumcommands.py:917 ++msgid "Unknown" ++msgstr "Desconhecido" ++ ++#: ../utils.py:109 ++msgid " The other application is: PackageKit" ++msgstr " O outro aplicativo é: PackageKit" ++ ++#: ../utils.py:111 ++#, python-format ++msgid " The other application is: %s" ++msgstr " O outro aplicativo é: %s" ++ ++#: ../utils.py:114 ++#, python-format ++msgid " Memory : %5s RSS (%5sB VSZ)" ++msgstr " Memória: %5s RSS (%5sB VSZ)" ++ ++#: ../utils.py:119 ++#, python-format ++msgid " Started: %s - %s ago" ++msgstr " Iniciado: %s - %s atrás" ++ ++#: ../utils.py:121 ++#, python-format ++msgid " State : %s, pid: %d" ++msgstr " Estado: %s, pid: %d" ++ ++#: ../utils.py:199 ++#, python-format ++msgid "PluginExit Error: %s" ++msgstr "Erro PluginExit: %s" ++ ++#: ../utils.py:202 ++#, python-format ++msgid "Yum Error: %s" ++msgstr "Error do Yum: %s" ++ ++#: ../utils.py:235 ../yummain.py:42 + msgid "" + "\n" + "\n" +@@ -1122,8 +1266,7 @@ msgstr "" + "\n" + "Saindo pelo cancelamento do usuário" - #: ../output.py:305 - msgid "Jan" -@@ -637,7 +674,7 @@ msgstr "Ссылка: %s" +-#: ../utils.py:143 +-#: ../yummain.py:48 ++#: ../utils.py:241 ../yummain.py:48 + msgid "" + "\n" + "\n" +@@ -1133,8 +1276,7 @@ msgstr "" + "\n" + "Saindo por um pipe defeituoso" - #: ../output.py:553 - msgid "License : " --msgstr "Лицензия : %s" -+msgstr "Лицензия : " +-#: ../utils.py:145 +-#: ../yummain.py:50 ++#: ../utils.py:243 ../yummain.py:50 + #, python-format + msgid "" + "\n" +@@ -1145,20 +1287,20 @@ msgstr "" + "\n" + "%s" - #: ../output.py:554 - msgid "Description: " -@@ -661,7 +698,7 @@ msgstr "Нет" +-#: ../utils.py:184 +-#: ../yummain.py:273 ++#: ../utils.py:282 ../yummain.py:211 + msgid "Complete!" + msgstr "Concluído!" - #: ../output.py:627 - msgid "Is this ok [y/N]: " --msgstr "Выполнить [y/N]: " -+msgstr "Продолжить? [y/N]: " +-#: ../yumcommands.py:42 ++#: ../yumcommands.py:43 + msgid "You need to be root to perform this command." + msgstr "Você precisa ser root para executar este comando." - #: ../output.py:715 - #, python-format -@@ -670,12 +707,12 @@ msgid "" - "Group: %s" +-#: ../yumcommands.py:49 ++#: ../yumcommands.py:50 + msgid "" + "\n" + "You have enabled checking of packages via GPG keys. This is a good thing. \n" +-"However, you do not have any GPG public keys installed. You need to download\n" ++"However, you do not have any GPG public keys installed. You need to " ++"download\n" + "the keys for packages you wish to install and install them.\n" + "You can do that by running the command:\n" + " rpm --import public.gpg.key\n" +@@ -1171,8 +1313,10 @@ msgid "" + "For more information contact your distribution or package provider.\n" msgstr "" "\n" --"Группа: %s" -+"Коллекция: %s" +-"Você habilitou a verificação de pacotes através de chaves GPG. Isso é uma boa coisa.\n" +-"Entretanto, você não tem nenhuma chave GPG pública instalada. Você precisa baixar\n" ++"Você habilitou a verificação de pacotes através de chaves GPG. Isso é uma " ++"boa coisa.\n" ++"Entretanto, você não tem nenhuma chave GPG pública instalada. Você precisa " ++"baixar\n" + "e instalar essas chaves para os pacotes que deseja instalar.\n" + "Você pode fazer isso executando o comando:\n" + " rpm --import public.gpg.key\n" +@@ -1182,345 +1326,338 @@ msgstr "" + " do repositório, a url da chave que você gostaria de usar\n" + "para ele e o yum irá instalá-la para você.\n" + "\n" +-"Para mais informações contate o fornecedor da sua distribuição ou do pacote.\n" ++"Para mais informações contate o fornecedor da sua distribuição ou do " ++"pacote.\n" - #: ../output.py:719 +-#: ../yumcommands.py:69 ++#: ../yumcommands.py:70 #, python-format - msgid " Group-Id: %s" --msgstr " Идентификатор группы: %s" -+msgstr "Код коллекции: %s" + msgid "Error: Need to pass a list of pkgs to %s" + msgstr "Erro: É necessário passar uma lista de pacotes para %s" - #: ../output.py:724 - #, python-format -@@ -750,7 +787,7 @@ msgstr "Другое:" +-#: ../yumcommands.py:75 ++#: ../yumcommands.py:76 + msgid "Error: Need an item to match" + msgstr "Erro: É necessário um item para corresponder" - #: ../output.py:896 - msgid "There was an error calculating total download size" --msgstr "Произошла ошибка при подсчёте общего объёма загрузки" -+msgstr "Произошла ошибка при подсчете общего объема загрузки" +-#: ../yumcommands.py:81 ++#: ../yumcommands.py:82 + msgid "Error: Need a group or list of groups" + msgstr "Erro: É necessário um grupo ou uma lista de grupos" - #: ../output.py:901 - #, python-format -@@ -760,20 +797,20 @@ msgstr "Общий размер: %s" - #: ../output.py:904 +-#: ../yumcommands.py:90 ++#: ../yumcommands.py:91 #, python-format - msgid "Total download size: %s" --msgstr "Общий объем загрузки: %s" -+msgstr "Объем загрузки: %s" + msgid "Error: clean requires an option: %s" + msgstr "Erro: a limpeza requer uma opção: %s" - #: ../output.py:908 +-#: ../yumcommands.py:95 ++#: ../yumcommands.py:96 #, python-format - msgid "Installed size: %s" --msgstr "установленный размер: %s" -+msgstr "Будет установлено: %s" - - #: ../output.py:949 - msgid "Reinstalling" --msgstr "Переустановка:" -+msgstr "Переустановка" - - #: ../output.py:950 - msgid "Downgrading" --msgstr "Возврат к предыдущей версии" -+msgstr "Откат версии" - - #: ../output.py:951 - msgid "Installing for dependencies" -@@ -787,7 +824,8 @@ msgstr "Обновление зависимостей" - msgid "Removing for dependencies" - msgstr "Удаление зависимостей" - --#: ../output.py:960 ../output.py:1072 -+#: ../output.py:960 -+#: ../output.py:1072 - msgid "Skipped (dependency problems)" - msgstr "Пропущено (ошибка зависимостей)" + msgid "Error: invalid clean argument: %r" + msgstr "Erro: argumento de limpeza inválido: %r" -@@ -824,7 +862,7 @@ msgid "" - "%s\n" - msgstr "" - "\n" --"Итог\n" -+"Результат операции\n" - "%s\n" +-#: ../yumcommands.py:108 ++#: ../yumcommands.py:109 + msgid "No argument to shell" + msgstr "Nenhum argumento para o shell" - #: ../output.py:1013 -@@ -845,7 +883,7 @@ msgid "" - msgstr "" - "Удаление %5.5s пакет(ов)\n" - "Переустановка %5.5s пакета(ов)\n" --"Возврат к предыдущей версии %5.5s пакета(ов)\n" -+"Откат версии %5.5s пакета(ов)\n" +-#: ../yumcommands.py:110 ++#: ../yumcommands.py:111 + #, python-format + msgid "Filename passed to shell: %s" + msgstr "Nome de arquivo passado para o shell: %s" - #: ../output.py:1066 - msgid "Removed" -@@ -884,13 +922,11 @@ msgstr "два" +-#: ../yumcommands.py:114 ++#: ../yumcommands.py:115 #, python-format - msgid "" - "\n" --" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s " --"seconds\n" -+" Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s seconds\n" - "to exit.\n" - msgstr "" - "\n" --"Текущая закачка отменена, %sвызвано (ctrl-c) повторите %s в течении%s%s%s " --"секунд\n" -+"Текущая закачка отменена, %sвызвано (ctrl-c) повторите %s в течении%s%s%s секунд\n" - "для выхода.\n" + msgid "File %s given as argument to shell does not exist." + msgstr "O arquivo %s, passado como um argumento para o shell, não existe." - #: ../output.py:1162 -@@ -935,13 +971,14 @@ msgstr "Система" +-#: ../yumcommands.py:120 ++#: ../yumcommands.py:121 + msgid "Error: more than one file given as argument to shell." + msgstr "Erro: mais de um arquivo passado como argumento para o shell." - #: ../output.py:1254 - msgid "Bad transaction IDs, or package(s), given" --msgstr "Передан плохой идентификатор транзакции или пакет(ы)" -+msgstr "Передан(ы) неверный код действий или пакет(ы)" +-#: ../yumcommands.py:169 ++#: ../yumcommands.py:170 + msgid "PACKAGE..." + msgstr "PACOTE..." - #: ../output.py:1266 - msgid "ID" - msgstr "ID" +-#: ../yumcommands.py:172 ++#: ../yumcommands.py:173 + msgid "Install a package or packages on your system" + msgstr "Instala um ou mais pacotes no seu sistema" --#: ../output.py:1267 ../output.py:1520 -+#: ../output.py:1267 -+#: ../output.py:1520 - msgid "Login user" - msgstr "Вход пользователя" +-#: ../yumcommands.py:180 ++#: ../yumcommands.py:181 + msgid "Setting up Install Process" + msgstr "Configurando o processo de instalação" -@@ -949,43 +986,46 @@ msgstr "Вход пользователя" - msgid "Date and time" - msgstr "Дата и время" +-#: ../yumcommands.py:191 ++#: ../yumcommands.py:192 + msgid "[PACKAGE...]" + msgstr "[PACOTE...]" --#: ../output.py:1269 ../output.py:1522 -+#: ../output.py:1269 -+#: ../output.py:1522 - msgid "Action(s)" - msgstr "Действия" +-#: ../yumcommands.py:194 ++#: ../yumcommands.py:195 + msgid "Update a package or packages on your system" + msgstr "Atualiza um ou mais pacotes do seu sistema" --#: ../output.py:1270 ../output.py:1523 -+#: ../output.py:1270 -+#: ../output.py:1523 - msgid "Altered" - msgstr "Изменено" +-#: ../yumcommands.py:201 ++#: ../yumcommands.py:202 + msgid "Setting up Update Process" + msgstr "Configurando o processo de atualização" - #: ../output.py:1310 - msgid "No transaction ID given" --msgstr "Идентификатор транзакции недоступен" -+msgstr "Код действия не задан" +-#: ../yumcommands.py:246 ++#: ../yumcommands.py:244 + msgid "Display details about a package or group of packages" + msgstr "Mostra detalhes sobre um pacote ou grupos de pacotes" + +-#: ../yumcommands.py:295 ++#: ../yumcommands.py:293 + msgid "Installed Packages" + msgstr "Pacotes instalados" - #: ../output.py:1336 - msgid "Bad transaction ID given" --msgstr "Плохой идентификатор транзакции" -+msgstr "Код действия неверен" +-#: ../yumcommands.py:303 ++#: ../yumcommands.py:301 + msgid "Available Packages" + msgstr "Pacotes disponíveis" - #: ../output.py:1341 - msgid "Not found given transaction ID" --msgstr "Не найден данный ID транзакции" -+msgstr "Указанный код действия не найден" +-#: ../yumcommands.py:307 ++#: ../yumcommands.py:305 + msgid "Extra Packages" + msgstr "Pacotes extras" - #: ../output.py:1349 - msgid "Found more than one transaction ID!" --msgstr "Найдено более одного ID транзакции!" -+msgstr "Указано более одной операции!" +-#: ../yumcommands.py:311 ++#: ../yumcommands.py:309 + msgid "Updated Packages" + msgstr "Pacotes atualizados" - #: ../output.py:1370 - msgid "No transaction ID, or package, given" --msgstr "Нет данного ID транзакции или пакета" -+msgstr "Не задан код действия или пакет" + #. This only happens in verbose mode +-#: ../yumcommands.py:319 +-#: ../yumcommands.py:326 +-#: ../yumcommands.py:603 ++#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 + msgid "Obsoleting Packages" + msgstr "Tornando pacotes obsoletos" - #: ../output.py:1396 - msgid "Transaction ID :" --msgstr "Идентификатор транзакции:" -+msgstr "Код операции:" +-#: ../yumcommands.py:328 ++#: ../yumcommands.py:326 + msgid "Recently Added Packages" + msgstr "Pacotes adicionados recentemente" - #: ../output.py:1398 - msgid "Begin time :" - msgstr "Время начала:" +-#: ../yumcommands.py:335 ++#: ../yumcommands.py:333 + msgid "No matching Packages to list" + msgstr "Nenhum pacote correspondente a ser listado" --#: ../output.py:1401 ../output.py:1403 -+#: ../output.py:1401 -+#: ../output.py:1403 - msgid "Begin rpmdb :" - msgstr "Начало базы данных RPM:" +-#: ../yumcommands.py:349 ++#: ../yumcommands.py:347 + msgid "List a package or groups of packages" + msgstr "Lista um pacote ou grupos de pacotes" -@@ -998,7 +1038,8 @@ msgstr "(%s секунд)" - msgid "End time :" - msgstr "Конечное время:" +-#: ../yumcommands.py:361 ++#: ../yumcommands.py:359 + msgid "Remove a package or packages from your system" + msgstr "Remove um ou mais pacotes do seu sistema" --#: ../output.py:1421 ../output.py:1423 -+#: ../output.py:1421 -+#: ../output.py:1423 - msgid "End rpmdb :" - msgstr "Конец базы данных RPM:" +-#: ../yumcommands.py:368 ++#: ../yumcommands.py:366 + msgid "Setting up Remove Process" + msgstr "Configurando o processo de remoção" -@@ -1006,7 +1047,9 @@ msgstr "Конец базы данных RPM:" - msgid "User :" - msgstr "Пользователь:" +-#: ../yumcommands.py:382 ++#: ../yumcommands.py:380 + msgid "Setting up Group Process" + msgstr "Configurando o processo de grupos" --#: ../output.py:1426 ../output.py:1428 ../output.py:1430 -+#: ../output.py:1426 -+#: ../output.py:1428 -+#: ../output.py:1430 - msgid "Return-Code :" - msgstr "Код возврата:" +-#: ../yumcommands.py:388 ++#: ../yumcommands.py:386 + msgid "No Groups on which to run command" + msgstr "Não há grupos nos quais executar o comando" -@@ -1024,11 +1067,12 @@ msgstr "Успешно" +-#: ../yumcommands.py:401 ++#: ../yumcommands.py:399 + msgid "List available package groups" + msgstr "Lista os grupos de pacotes disponíveis" - #: ../output.py:1431 - msgid "Transaction performed with:" --msgstr "Транзакция выполняется с:" -+msgstr "Действие выполнено:" +-#: ../yumcommands.py:418 ++#: ../yumcommands.py:416 + msgid "Install the packages in a group on your system" + msgstr "Instala pacotes em um grupo ou no seu sistema" --#: ../output.py:1444 ../output.py:1489 -+#: ../output.py:1444 -+#: ../output.py:1489 - msgid "Downgraded" --msgstr "Возвращено к предыдущей версии" -+msgstr "Откат версии" +-#: ../yumcommands.py:440 ++#: ../yumcommands.py:438 + msgid "Remove the packages in a group from your system" + msgstr "Remove pacotes de um grupo ou do seu sistema" - #. multiple versions installed, both older and newer - #: ../output.py:1446 -@@ -1047,7 +1091,8 @@ msgstr "Вывод сценария:" - msgid "Errors:" - msgstr "Ошибки:" +-#: ../yumcommands.py:467 ++#: ../yumcommands.py:465 + msgid "Display details about a package group" + msgstr "Mostra detalhes sobre um grupo de pacotes" --#: ../output.py:1481 ../output.py:1482 -+#: ../output.py:1481 -+#: ../output.py:1482 - msgid "Install" - msgstr "Установка " +-#: ../yumcommands.py:491 ++#: ../yumcommands.py:489 + msgid "Generate the metadata cache" + msgstr "Gera o cache de metadados" -@@ -1057,7 +1102,7 @@ msgstr "Установка зависимостей" +-#: ../yumcommands.py:497 ++#: ../yumcommands.py:495 + msgid "Making cache files for all metadata files." + msgstr "Realizando cache de arquivos para todos os metadados." - #: ../output.py:1485 - msgid "Obsoleting" --msgstr "Замена" -+msgstr "Исключаем" +-#: ../yumcommands.py:498 ++#: ../yumcommands.py:496 + msgid "This may take a while depending on the speed of this computer" + msgstr "Isso pode demorar um pouco, dependendo da velocidade deste computador" - #: ../output.py:1486 - msgid "Erase" -@@ -1069,7 +1114,7 @@ msgstr "Переустановка" +-#: ../yumcommands.py:519 ++#: ../yumcommands.py:517 + msgid "Metadata Cache Created" + msgstr "Cache de metadados criado" - #: ../output.py:1488 - msgid "Downgrade" --msgstr "Возврат к предыдущей версии" -+msgstr "Откат версии" +-#: ../yumcommands.py:533 ++#: ../yumcommands.py:531 + msgid "Remove cached data" + msgstr "Remove os dados do cache" - #: ../output.py:1490 - msgid "Update" -@@ -1110,38 +1155,39 @@ msgstr "Более года назад" +-#: ../yumcommands.py:553 ++#: ../yumcommands.py:551 + msgid "Find what package provides the given value" + msgstr "Localiza qual pacote fornece o valor dado" - #: ../output.py:1585 - msgid "installed" --msgstr "Установлено" -+msgstr "для установки" +-#: ../yumcommands.py:573 ++#: ../yumcommands.py:571 + msgid "Check for available package updates" + msgstr "Verifica por atualizações de pacotes disponíveis" - #: ../output.py:1586 - msgid "updated" --msgstr "Обновлено" -+msgstr "для обновления" +-#: ../yumcommands.py:623 ++#: ../yumcommands.py:621 + msgid "Search package details for the given string" + msgstr "Pesquisa detalhes do pacote para a string fornecida" - #: ../output.py:1587 - msgid "obsoleted" --msgstr "Заменено" -+msgstr "как недействительный" +-#: ../yumcommands.py:629 ++#: ../yumcommands.py:627 + msgid "Searching Packages: " + msgstr "Pesquisando por pacotes:" - #: ../output.py:1588 - msgid "erased" --msgstr "удалено" -+msgstr "для удаления" +-#: ../yumcommands.py:646 ++#: ../yumcommands.py:644 + msgid "Update packages taking obsoletes into account" + msgstr "Atualiza pacotes levando em conta os obsoletos" - #: ../output.py:1592 - #, python-format - msgid "---> Package %s.%s %s:%s-%s set to be %s" --msgstr "---> Пакет %s.%s %s:%s-%s должен %s" -+msgstr "---> Пакет %s.%s %s:%s-%s помечен %s" +-#: ../yumcommands.py:654 ++#: ../yumcommands.py:652 + msgid "Setting up Upgrade Process" + msgstr "Configurando o processo de atualização" - #: ../output.py:1599 - msgid "--> Running transaction check" --msgstr "--> Запуск проверки транзакции" -+msgstr "--> Проверка сценария" +-#: ../yumcommands.py:668 ++#: ../yumcommands.py:666 + msgid "Install a local RPM" + msgstr "Instala um RPM local" - #: ../output.py:1604 - msgid "--> Restarting Dependency Resolution with new changes." --msgstr "--> Перезапуск разрешения зависимостей с новыми параметрами." -+msgstr "--> Перепроверка зависимостей с новыми параметрами." +-#: ../yumcommands.py:676 ++#: ../yumcommands.py:674 + msgid "Setting up Local Package Process" + msgstr "Configurando o processo de pacote local" - #: ../output.py:1609 - msgid "--> Finished Dependency Resolution" --msgstr "--> Окончание разрешения зависимостей" -+msgstr "--> Проверка зависимостей окончена" +-#: ../yumcommands.py:695 ++#: ../yumcommands.py:693 + msgid "Determine which package provides the given dependency" + msgstr "Determina qual pacote fornece a dependência dada" --#: ../output.py:1614 ../output.py:1619 -+#: ../output.py:1614 -+#: ../output.py:1619 - #, python-format - msgid "--> Processing Dependency: %s for package: %s" - msgstr "--> Обработка зависимостей: %s для пакета: %s" -@@ -1149,7 +1195,7 @@ msgstr "--> Обработка зависимостей: %s для пакета: - #: ../output.py:1623 - #, python-format - msgid "--> Unresolved Dependency: %s" --msgstr "--> Неразрешённая зависимость: %s" -+msgstr "--> Неразрешенная зависимость: %s" +-#: ../yumcommands.py:698 ++#: ../yumcommands.py:696 + msgid "Searching Packages for Dependency:" + msgstr "Pesquisando pacotes por dependência:" - #: ../output.py:1634 - #, python-format -@@ -1165,7 +1211,8 @@ msgstr "" - "\n" - " Необходимо: %s" +-#: ../yumcommands.py:712 ++#: ../yumcommands.py:710 + msgid "Run an interactive yum shell" + msgstr "Executa um shell interativo do yum" --#: ../output.py:1649 ../output.py:1660 -+#: ../output.py:1649 -+#: ../output.py:1660 - #, python-format - msgid "" - "\n" -@@ -1178,20 +1225,20 @@ msgstr "" - msgid "Available" - msgstr "Доступно" +-#: ../yumcommands.py:718 ++#: ../yumcommands.py:716 + msgid "Setting up Yum Shell" + msgstr "Configurando o shell do Yum" --#: ../output.py:1665 ../output.py:1670 -+#: ../output.py:1665 -+#: ../output.py:1670 - #, python-format - msgid "--> Processing Conflict: %s conflicts %s" --msgstr "--> Конфликт обработки: %s конфликтует %s" -+msgstr "--> Обработка конфликта: %s конфликтует с %s" +-#: ../yumcommands.py:736 ++#: ../yumcommands.py:734 + msgid "List a package's dependencies" + msgstr "Lista as dependências de um pacote" - #: ../output.py:1674 - msgid "--> Populating transaction set with selected packages. Please wait." --msgstr "" --"--> Формирование транзакций для выбранных пакетов. Пожалуйста подождите." -+msgstr "--> Заполнение списка действий выбранными пакетами. Подождите, пожалуйста." +-#: ../yumcommands.py:742 ++#: ../yumcommands.py:740 + msgid "Finding dependencies: " + msgstr "Localizando dependências:" - #: ../output.py:1678 - #, python-format - msgid "---> Downloading header for %s to pack into transaction set." --msgstr "-- > Загрузка заголовков %s для создания набора транзакций" -+msgstr "---> Загрузка заголовка %s для включения в список." +-#: ../yumcommands.py:758 ++#: ../yumcommands.py:756 + msgid "Display the configured software repositories" + msgstr "Exibe os repositórios de software configurados" - #: ../utils.py:93 - msgid "Running" -@@ -1213,7 +1260,8 @@ msgstr "Зомби" - msgid "Traced/Stopped" - msgstr "Трассировано/Остановлено" +-#: ../yumcommands.py:810 +-#: ../yumcommands.py:811 ++#: ../yumcommands.py:822 ../yumcommands.py:823 + msgid "enabled" + msgstr "habilitado" --#: ../utils.py:98 ../yumcommands.py:917 -+#: ../utils.py:98 -+#: ../yumcommands.py:917 - msgid "Unknown" - msgstr "Неизвестно" +-#: ../yumcommands.py:819 +-#: ../yumcommands.py:820 ++#: ../yumcommands.py:849 ../yumcommands.py:850 + msgid "disabled" + msgstr "desabilitado" -@@ -1234,7 +1282,7 @@ msgstr " Память: %5s RSS (%5sB VSZ)" - #: ../utils.py:119 - #, python-format - msgid " Started: %s - %s ago" --msgstr " Запущено: %s - %s назад" -+msgstr " Запущено: %s — %s назад" +-#: ../yumcommands.py:834 ++#: ../yumcommands.py:866 + msgid "Repo-id : " + msgstr "Repo-id : " - #: ../utils.py:121 - #, python-format -@@ -1244,14 +1292,15 @@ msgstr " Статус: %s, pid: %d" - #: ../utils.py:199 - #, python-format - msgid "PluginExit Error: %s" --msgstr "Ошибка выхода плагина: %s" -+msgstr "Ошибка PluginExit: %s" +-#: ../yumcommands.py:835 ++#: ../yumcommands.py:867 + msgid "Repo-name : " + msgstr "Repo-name : " - #: ../utils.py:202 - #, python-format - msgid "Yum Error: %s" - msgstr "Ошибка Yum: %s" +-#: ../yumcommands.py:836 ++#: ../yumcommands.py:870 + msgid "Repo-status : " + msgstr "Repo-status : " --#: ../utils.py:235 ../yummain.py:42 -+#: ../utils.py:235 -+#: ../yummain.py:42 - msgid "" - "\n" - "\n" -@@ -1261,7 +1310,8 @@ msgstr "" - "\n" - "Выход по запросу пользователя" +-#: ../yumcommands.py:838 ++#: ../yumcommands.py:873 + msgid "Repo-revision: " + msgstr "Repo-revision: " --#: ../utils.py:241 ../yummain.py:48 -+#: ../utils.py:241 -+#: ../yummain.py:48 - msgid "" - "\n" - "\n" -@@ -1271,7 +1321,8 @@ msgstr "" - "\n" - "Выход из-за разрыва связи" +-#: ../yumcommands.py:842 ++#: ../yumcommands.py:877 + msgid "Repo-tags : " + msgstr "Repo-tags : " --#: ../utils.py:243 ../yummain.py:50 -+#: ../utils.py:243 -+#: ../yummain.py:50 - #, python-format - msgid "" - "\n" -@@ -1282,9 +1333,10 @@ msgstr "" - "\n" - "%s" +-#: ../yumcommands.py:848 ++#: ../yumcommands.py:883 + msgid "Repo-distro-tags: " + msgstr "Repo-distro-tags: " --#: ../utils.py:282 ../yummain.py:211 -+#: ../utils.py:282 -+#: ../yummain.py:211 - msgid "Complete!" --msgstr "Выполнено!" -+msgstr "Готово!" +-#: ../yumcommands.py:853 ++#: ../yumcommands.py:888 + msgid "Repo-updated : " + msgstr "Repo-updated : " - #: ../yumcommands.py:43 - msgid "You need to be root to perform this command." -@@ -1294,8 +1346,7 @@ msgstr "Необходимы привилегии суперпользовате - msgid "" - "\n" - "You have enabled checking of packages via GPG keys. This is a good thing. \n" --"However, you do not have any GPG public keys installed. You need to " --"download\n" -+"However, you do not have any GPG public keys installed. You need to download\n" - "the keys for packages you wish to install and install them.\n" - "You can do that by running the command:\n" - " rpm --import public.gpg.key\n" -@@ -1319,8 +1370,7 @@ msgstr "" - "для репозитория. Опция \"gpgkey\" в секции репозитория и Yum\n" - "установит его.\n" - "\n" --"Чтобы узнать больше, пожалуйста, свяжитесь с поставщиком дистрибутива или " --"пакета.\n" -+"Чтобы узнать больше, пожалуйста, свяжитесь с поставщиком дистрибутива или пакета.\n" +-#: ../yumcommands.py:855 ++#: ../yumcommands.py:890 + msgid "Repo-pkgs : " + msgstr "Repo-pkgs : " - #: ../yumcommands.py:70 - #, python-format -@@ -1333,7 +1383,7 @@ msgstr "Ошибка: Необходим параметр для соответ +-#: ../yumcommands.py:856 ++#: ../yumcommands.py:891 + msgid "Repo-size : " + msgstr "Repo-size : " - #: ../yumcommands.py:82 - msgid "Error: Need a group or list of groups" --msgstr "Ошибка: Необходима группа или список групп" -+msgstr "Ошибка: нужна коллекция или список групп" +-#: ../yumcommands.py:863 ++#: ../yumcommands.py:898 + msgid "Repo-baseurl : " + msgstr "Repo-baseurl : " - #: ../yumcommands.py:91 - #, python-format -@@ -1357,14 +1407,11 @@ msgstr "Имя файла принятое для командной оболо - #: ../yumcommands.py:115 - #, python-format - msgid "File %s given as argument to shell does not exist." --msgstr "" --"Файл %s переданный в качестве аргумента для командной оболочки не существует." -+msgstr "Файл %s переданный в качестве аргумента для командной оболочки не существует." +-#: ../yumcommands.py:871 ++#: ../yumcommands.py:906 + msgid "Repo-metalink: " + msgstr "Repo-metalink: " - #: ../yumcommands.py:121 - msgid "Error: more than one file given as argument to shell." --msgstr "" --"Ошибка: более чем один файл указан в качестве аргумента для командной " --"оболочки." -+msgstr "Ошибка: более чем один файл указан в качестве аргумента для командной оболочки." +-#: ../yumcommands.py:875 ++#: ../yumcommands.py:910 + msgid " Updated : " + msgstr " Atualizados :" - #: ../yumcommands.py:170 - msgid "PACKAGE..." -@@ -1372,11 +1419,11 @@ msgstr "ПАКЕТ..." +-#: ../yumcommands.py:878 ++#: ../yumcommands.py:913 + msgid "Repo-mirrors : " + msgstr "Repo-mirrors : " - #: ../yumcommands.py:173 - msgid "Install a package or packages on your system" --msgstr "Установка пакета(пакетов) в вашей системе" -+msgstr "Установка пакета(ов) в систему" +-#: ../yumcommands.py:882 +-#: ../yummain.py:133 +-msgid "Unknown" +-msgstr "Desconhecido" +- +-#: ../yumcommands.py:888 ++#: ../yumcommands.py:923 + #, python-format + msgid "Never (last: %s)" + msgstr "Nunca (último: %s)" - #: ../yumcommands.py:181 - msgid "Setting up Install Process" --msgstr "Настройка процесса установки" -+msgstr "Подготовка к установке" +-#: ../yumcommands.py:890 ++#: ../yumcommands.py:925 + #, python-format + msgid "Instant (last: %s)" + msgstr "Instante (último: %s)" - #: ../yumcommands.py:192 - msgid "[PACKAGE...]" -@@ -1384,15 +1431,15 @@ msgstr "[ПАКЕТ...]" +-#: ../yumcommands.py:893 ++#: ../yumcommands.py:928 + #, python-format + msgid "%s second(s) (last: %s)" + msgstr "%s segundo(s) (último: %s)" - #: ../yumcommands.py:195 - msgid "Update a package or packages on your system" --msgstr "Обновление пакета(ов) в вашей системе" -+msgstr "Обновление пакета(ов) в системе" +-#: ../yumcommands.py:895 ++#: ../yumcommands.py:930 + msgid "Repo-expire : " + msgstr "Repo-expire : " - #: ../yumcommands.py:202 - msgid "Setting up Update Process" --msgstr "Настройка процесса обновления" -+msgstr "Подготовка к обновлению" +-#: ../yumcommands.py:898 ++#: ../yumcommands.py:933 + msgid "Repo-exclude : " + msgstr "Repo-exclude : " - #: ../yumcommands.py:244 - msgid "Display details about a package or group of packages" --msgstr "Отобразить подробности о пакете или о группе пакетов" -+msgstr "Отобразить информацию о пакете или о коллекции пакетов" +-#: ../yumcommands.py:902 ++#: ../yumcommands.py:937 + msgid "Repo-include : " + msgstr "Repo-include : " - #: ../yumcommands.py:293 - msgid "Installed Packages" -@@ -1408,12 +1455,14 @@ msgstr "Дополнительные пакеты" ++#: ../yumcommands.py:941 ++msgid "Repo-excluded: " ++msgstr "Repo-excluded: " ++ + #. Work out the first (id) and last (enabled/disalbed/count), + #. then chop the middle (name)... +-#: ../yumcommands.py:912 +-#: ../yumcommands.py:938 ++#: ../yumcommands.py:951 ../yumcommands.py:980 + msgid "repo id" + msgstr "id do repo" - #: ../yumcommands.py:309 - msgid "Updated Packages" --msgstr "Обновлённые пакеты" -+msgstr "Обновленные пакеты" +-#: ../yumcommands.py:926 +-#: ../yumcommands.py:927 +-#: ../yumcommands.py:941 ++#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 + msgid "status" + msgstr "status" - #. This only happens in verbose mode --#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 -+#: ../yumcommands.py:317 -+#: ../yumcommands.py:324 -+#: ../yumcommands.py:601 - msgid "Obsoleting Packages" --msgstr "Заменённые пакеты" -+msgstr "Исключенные пакеты" +-#: ../yumcommands.py:939 ++#: ../yumcommands.py:981 + msgid "repo name" + msgstr "nome do repo" - #: ../yumcommands.py:326 - msgid "Recently Added Packages" -@@ -1421,43 +1470,43 @@ msgstr "Недавно добавленные пакеты" +-#: ../yumcommands.py:965 ++#: ../yumcommands.py:1018 + msgid "Display a helpful usage message" + msgstr "Exibe uma mensagem de uso para ajuda" - #: ../yumcommands.py:333 - msgid "No matching Packages to list" --msgstr "Нет совпадений с списком пакетов" -+msgstr "Совпадений среди пакетов не найдено" +-#: ../yumcommands.py:999 ++#: ../yumcommands.py:1052 + #, python-format + msgid "No help available for %s" + msgstr "Nenhuma ajuda disponível para %s" - #: ../yumcommands.py:347 - msgid "List a package or groups of packages" --msgstr "Список пакетов или группы пакетов" -+msgstr "Вывести список пакетов или коллекций пакетов" +-#: ../yumcommands.py:1004 ++#: ../yumcommands.py:1057 + msgid "" + "\n" + "\n" +@@ -1530,7 +1667,7 @@ msgstr "" + "\n" + "apelidos: " - #: ../yumcommands.py:359 - msgid "Remove a package or packages from your system" --msgstr "Удаление пакета(пакетов) с вашей системы" -+msgstr "Удаление пакета(ов) из системы" +-#: ../yumcommands.py:1006 ++#: ../yumcommands.py:1059 + msgid "" + "\n" + "\n" +@@ -1540,143 +1677,99 @@ msgstr "" + "\n" + "apelido: " - #: ../yumcommands.py:366 - msgid "Setting up Remove Process" --msgstr "Настройка процесса удаления" -+msgstr "Подготовка к удалению" +-#: ../yumcommands.py:1034 ++#: ../yumcommands.py:1087 + msgid "Setting up Reinstall Process" + msgstr "Configurando o processo de reinstalação" - #: ../yumcommands.py:380 - msgid "Setting up Group Process" --msgstr "Настройка группового процесса" -+msgstr "Подготовка к обработке коллекции" +-#: ../yumcommands.py:1042 ++#: ../yumcommands.py:1095 + msgid "reinstall a package" + msgstr "reinstala um pacote" - #: ../yumcommands.py:386 - msgid "No Groups on which to run command" --msgstr "Нет групп для запуска команды" -+msgstr "Коллекций пакетов к обработке нет" +-#: ../yumcommands.py:1060 ++#: ../yumcommands.py:1113 + msgid "Setting up Downgrade Process" + msgstr "Configurando o processo de retrocesso" - #: ../yumcommands.py:399 - msgid "List available package groups" --msgstr "Список доступных групп пакетов" -+msgstr "Список доступных коллекций пакетов" +-#: ../yumcommands.py:1067 ++#: ../yumcommands.py:1120 + msgid "downgrade a package" + msgstr "retrocedendo um pacote" - #: ../yumcommands.py:416 - msgid "Install the packages in a group on your system" --msgstr "Установка пакетов из группы в вашу систему" -+msgstr "Установка коллекции пакетов в систему" +-#: ../yumcommands.py:1081 ++#: ../yumcommands.py:1134 + msgid "Display a version for the machine and/or available repos." + msgstr "Exibe uma versão para a máquina e/ou os repositórios disponíveis." - #: ../yumcommands.py:438 - msgid "Remove the packages in a group from your system" --msgstr "Удаление пакета(пакетов) с вашей системы из группы" -+msgstr "Удаление коллекции пакета(ов) из системы" +-#: ../yumcommands.py:1111 ++#: ../yumcommands.py:1173 + msgid " Yum version groups:" + msgstr " Grupos da versão do Yum:" - #: ../yumcommands.py:465 - msgid "Display details about a package group" --msgstr "Отображение подробностей о группе пакетов" -+msgstr "Показать информацию о коллекции пакетов" +-#: ../yumcommands.py:1121 ++#: ../yumcommands.py:1183 + msgid " Group :" + msgstr " Grupo:" - #: ../yumcommands.py:489 - msgid "Generate the metadata cache" -@@ -1469,7 +1518,7 @@ msgstr "Создание кэша для всех метаданных файл +-#: ../yumcommands.py:1122 ++#: ../yumcommands.py:1184 + msgid " Packages:" + msgstr " Pacotes:" - #: ../yumcommands.py:496 - msgid "This may take a while depending on the speed of this computer" --msgstr "Это займёт немного времени, в зависимости от скорости компьютера" -+msgstr "Это займет немного времени, в зависимости от скорости компьютера" +-#: ../yumcommands.py:1152 ++#: ../yumcommands.py:1213 + msgid "Installed:" + msgstr "Instalados:" - #: ../yumcommands.py:517 - msgid "Metadata Cache Created" -@@ -1497,7 +1546,7 @@ msgstr "Поиск пакетов:" +-#: ../yumcommands.py:1157 ++#: ../yumcommands.py:1218 + msgid "Group-Installed:" + msgstr "Grupos instalados:" - #: ../yumcommands.py:644 - msgid "Update packages taking obsoletes into account" --msgstr "Обновить пакеты, учитывая замены" -+msgstr "Обновить пакеты, учитывая недействительные" +-#: ../yumcommands.py:1166 ++#: ../yumcommands.py:1227 + msgid "Available:" + msgstr "Disponíveis:" - #: ../yumcommands.py:652 - msgid "Setting up Upgrade Process" -@@ -1509,7 +1558,7 @@ msgstr "Установка локального пакета" +-#: ../yumcommands.py:1172 ++#: ../yumcommands.py:1233 + msgid "Group-Available:" + msgstr "Grupos disponíveis:" - #: ../yumcommands.py:674 - msgid "Setting up Local Package Process" --msgstr "Настройка процесса для локального пакета" -+msgstr "Подготовка действий с локальным пакетом" +-#: ../yumcommands.py:1211 ++#: ../yumcommands.py:1272 + msgid "Display, or use, the transaction history" + msgstr "Exibir ou usar o histórico de transações" - #: ../yumcommands.py:693 - msgid "Determine which package provides the given dependency" -@@ -1539,17 +1588,19 @@ msgstr "Поиск зависимостей:" - msgid "Display the configured software repositories" - msgstr "Отобразить сконфигурированные репозитории ПО" +-#: ../yumcommands.py:1239 ++#: ../yumcommands.py:1300 + #, python-format + msgid "Invalid history sub-command, use: %s." + msgstr "Subcomando de histórico inválido, use: %s." --#: ../yumcommands.py:822 ../yumcommands.py:823 -+#: ../yumcommands.py:822 -+#: ../yumcommands.py:823 - msgid "enabled" - msgstr "включено" +-#: ../yummain.py:128 +-msgid "Running" +-msgstr "Executando" +- +-#: ../yummain.py:129 +-msgid "Sleeping" +-msgstr "Dormindo" +- +-#: ../yummain.py:130 +-msgid "Uninteruptable" +-msgstr "Ininterrompível" +- +-#: ../yummain.py:131 +-msgid "Zombie" +-msgstr "Zumbi" +- +-#: ../yummain.py:132 +-msgid "Traced/Stopped" +-msgstr "Rastreado/Parado" +- +-#: ../yummain.py:137 +-msgid " The other application is: PackageKit" +-msgstr " O outro aplicativo é: PackageKit" +- +-#: ../yummain.py:139 +-#, python-format +-msgid " The other application is: %s" +-msgstr " O outro aplicativo é: %s" +- +-#: ../yummain.py:142 +-#, python-format +-msgid " Memory : %5s RSS (%5sB VSZ)" +-msgstr " Memória: %5s RSS (%5sB VSZ)" +- +-#: ../yummain.py:146 +-#, python-format +-msgid " Started: %s - %s ago" +-msgstr " Iniciado: %s - %s atrás" +- +-#: ../yummain.py:148 +-#, python-format +-msgid " State : %s, pid: %d" +-msgstr " Estado: %s, pid: %d" ++#: ../yumcommands.py:1345 ++msgid "Check for problems in the rpmdb" ++msgstr "Procurar por problemas no rpmdb" --#: ../yumcommands.py:849 ../yumcommands.py:850 -+#: ../yumcommands.py:849 -+#: ../yumcommands.py:850 - msgid "disabled" - msgstr "отключено" +-#: ../yummain.py:173 +-msgid "Another app is currently holding the yum lock; waiting for it to exit..." +-msgstr "Outro aplicativo está retendo o bloqueio do yum; esperando por ele para sair..." ++#: ../yummain.py:102 ++msgid "" ++"Another app is currently holding the yum lock; waiting for it to exit..." ++msgstr "" ++"Outro aplicativo está retendo o bloqueio do yum; esperando por ele para " ++"sair..." - #: ../yumcommands.py:866 - msgid "Repo-id : " --msgstr "Идентификатор репозитория:" -+msgstr "Код репозитория:" +-#: ../yummain.py:201 +-#: ../yummain.py:240 ++#: ../yummain.py:130 ../yummain.py:169 + #, python-format + msgid "Error: %s" + msgstr "Error: %s" - #: ../yumcommands.py:867 - msgid "Repo-name : " -@@ -1557,7 +1608,7 @@ msgstr "Имя репозитория:" +-#: ../yummain.py:211 +-#: ../yummain.py:253 ++#: ../yummain.py:140 ../yummain.py:182 + #, python-format + msgid "Unknown Error(s): Exit Code: %d:" + msgstr "Erro(s) desconhecido(s): código de saída: %d:" - #: ../yumcommands.py:870 - msgid "Repo-status : " --msgstr "Статус репозитория:" -+msgstr "Состояние репозитория:" + #. Depsolve stage +-#: ../yummain.py:218 ++#: ../yummain.py:147 + msgid "Resolving Dependencies" + msgstr "Resolvendo dependências" - #: ../yumcommands.py:873 - msgid "Repo-revision: " -@@ -1573,7 +1624,7 @@ msgstr "Метки репозитория дистрибутива:" +-#: ../yummain.py:242 ++#: ../yummain.py:173 + msgid " You could try using --skip-broken to work around the problem" +-msgstr " Você pode tentar usar o parâmetro --skip-broken para contornar o problema" +- +-#: ../yummain.py:243 +-msgid "" +-" You could try running: package-cleanup --problems\n" +-" package-cleanup --dupes\n" +-" rpm -Va --nofiles --nodigest" + msgstr "" +-" Você pode tentar executar: package-cleanup --problems\n" +-" package-cleanup --dupes\n" +-" rpm -Va --nofiles --nodigest" ++" Você pode tentar usar o parâmetro --skip-broken para contornar o problema" ++ ++#: ../yummain.py:175 ../yummain.py:208 ++msgid " You could try running: rpm -Va --nofiles --nodigest" ++msgstr " Você pode tentar executar: rpm -Va --nofiles --nodigest" - #: ../yumcommands.py:888 - msgid "Repo-updated : " --msgstr "Репозиторий обновлён:" -+msgstr "Репозиторий обновлен:" +-#: ../yummain.py:259 ++#: ../yummain.py:188 + msgid "" + "\n" + "Dependencies Resolved" +@@ -1684,7 +1777,7 @@ msgstr "" + "\n" + "Dependências resolvidas" - #: ../yumcommands.py:890 - msgid "Repo-pkgs : " -@@ -1632,21 +1683,24 @@ msgstr "Исключено из репозитория:" +-#: ../yummain.py:326 ++#: ../yummain.py:265 + msgid "" + "\n" + "\n" +@@ -1700,7 +1793,8 @@ msgstr "doTsSetup() será removida em uma futura versão do Yum.\n" - #. Work out the first (id) and last (enabled/disalbed/count), - #. then chop the middle (name)... --#: ../yumcommands.py:951 ../yumcommands.py:980 -+#: ../yumcommands.py:951 -+#: ../yumcommands.py:980 - msgid "repo id" - msgstr "Идентификатор репозитория" + #: ../yum/depsolve.py:97 + msgid "Setting up TransactionSets before config class is up" +-msgstr "Configurando TransactionSets antes da ativação da classe de configuração" ++msgstr "" ++"Configurando TransactionSets antes da ativação da classe de configuração" --#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 -+#: ../yumcommands.py:968 -+#: ../yumcommands.py:969 -+#: ../yumcommands.py:987 - msgid "status" --msgstr "статус" -+msgstr "состояние" + #: ../yum/depsolve.py:148 + #, python-format +@@ -1722,173 +1816,165 @@ msgstr "Correspondência potencial para o %s a partir de %s" + msgid "Matched %s to require for %s" + msgstr "%s encontrado para solicitar o %s" - #: ../yumcommands.py:981 - msgid "repo name" --msgstr "имя репозитория" -+msgstr "репозиторий" +-#: ../yum/depsolve.py:224 ++#: ../yum/depsolve.py:225 + #, python-format + msgid "Member: %s" + msgstr "Membro: %s" - #: ../yumcommands.py:1018 - msgid "Display a helpful usage message" --msgstr "Отобразить сообщение помощи" -+msgstr "Отобразить подсказку к использованию" +-#: ../yum/depsolve.py:238 +-#: ../yum/depsolve.py:749 ++#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 + #, python-format + msgid "%s converted to install" + msgstr "%s convertido para instalar" - #: ../yumcommands.py:1052 +-#: ../yum/depsolve.py:245 ++#: ../yum/depsolve.py:246 #, python-format -@@ -1675,19 +1729,19 @@ msgstr "" + msgid "Adding Package %s in mode %s" + msgstr "Adicionando pacote %s no modo %s" - #: ../yumcommands.py:1087 - msgid "Setting up Reinstall Process" --msgstr "Настройка процесса переустановки" -+msgstr "Подготовка к повторной установке" +-#: ../yum/depsolve.py:255 ++#: ../yum/depsolve.py:256 + #, python-format + msgid "Removing Package %s" + msgstr "Removendo pacote %s" - #: ../yumcommands.py:1095 - msgid "reinstall a package" --msgstr "Переустановка пакета" -+msgstr "переустановка пакета" +-#: ../yum/depsolve.py:277 ++#: ../yum/depsolve.py:278 + #, python-format + msgid "%s requires: %s" + msgstr "%s requer: %s" - #: ../yumcommands.py:1113 - msgid "Setting up Downgrade Process" --msgstr "Настройка процесса возврата к предыдущей версии" -+msgstr "Подготовка к откату версии" +-#: ../yum/depsolve.py:335 ++#: ../yum/depsolve.py:319 ++#, python-format ++msgid "%s requires %s" ++msgstr "%s requer %s" ++ ++#: ../yum/depsolve.py:346 + msgid "Needed Require has already been looked up, cheating" + msgstr "O requerimento necessário já foi localizado, enganando" - #: ../yumcommands.py:1120 - msgid "downgrade a package" --msgstr "Возврат к предыдущей версии пакета" -+msgstr "откат к предыдущей версии пакета" +-#: ../yum/depsolve.py:345 ++#: ../yum/depsolve.py:356 + #, python-format + msgid "Needed Require is not a package name. Looking up: %s" + msgstr "O requerimento necessário não é o nome de um pacote. Localizando: %s" - #: ../yumcommands.py:1134 - msgid "Display a version for the machine and/or available repos." -@@ -1699,7 +1753,7 @@ msgstr " Группы версий Yum:" +-#: ../yum/depsolve.py:352 ++#: ../yum/depsolve.py:363 + #, python-format + msgid "Potential Provider: %s" + msgstr "Fornecedor em potencial: %s" - #: ../yumcommands.py:1183 - msgid " Group :" --msgstr " Группа:" -+msgstr "Коллекция:" +-#: ../yum/depsolve.py:375 ++#: ../yum/depsolve.py:386 + #, python-format + msgid "Mode is %s for provider of %s: %s" + msgstr "O modo é %s para o fornecedor do %s: %s" - #: ../yumcommands.py:1184 - msgid " Packages:" -@@ -1707,44 +1761,45 @@ msgstr " Пакеты:" +-#: ../yum/depsolve.py:379 ++#: ../yum/depsolve.py:390 + #, python-format + msgid "Mode for pkg providing %s: %s" + msgstr "Modo para o pacote que fornece o %s: %s" - #: ../yumcommands.py:1213 - msgid "Installed:" --msgstr "Установлено: " -+msgstr "Установлен(ы):" +-#: ../yum/depsolve.py:383 ++#: ../yum/depsolve.py:394 + #, python-format + msgid "TSINFO: %s package requiring %s marked as erase" + msgstr "TSINFO: o pacote %s que requer o %s foi marcado para remoção" - #: ../yumcommands.py:1218 - msgid "Group-Installed:" --msgstr "Группа установленных:" -+msgstr "Установлены коллекцей:" +-#: ../yum/depsolve.py:396 ++#: ../yum/depsolve.py:407 + #, python-format + msgid "TSINFO: Obsoleting %s with %s to resolve dep." + msgstr "TSINFO: Tornando %s obsoleto com o %s para resolver a dependência." - #: ../yumcommands.py:1227 - msgid "Available:" --msgstr "Доступно:" -+msgstr "Доступен(ы):" +-#: ../yum/depsolve.py:399 ++#: ../yum/depsolve.py:410 + #, python-format + msgid "TSINFO: Updating %s to resolve dep." + msgstr "TSINFO: Atualizando %s para resolver a dependência." - #: ../yumcommands.py:1233 - msgid "Group-Available:" --msgstr "Группа доступных:" -+msgstr "Доступны коллекцией:" +-#: ../yum/depsolve.py:407 ++#: ../yum/depsolve.py:418 + #, python-format + msgid "Cannot find an update path for dep for: %s" +-msgstr "Não foi possível encontrar um caminho de atualização para a dep. para: %s" +- +-#: ../yum/depsolve.py:417 +-#, python-format +-msgid "Unresolvable requirement %s for %s" +-msgstr "Requerimento %s insolúvel para o %s" ++msgstr "" ++"Não foi possível encontrar um caminho de atualização para a dep. para: %s" - #: ../yumcommands.py:1272 - msgid "Display, or use, the transaction history" --msgstr "Отображать или использовать историю транзакций" -+msgstr "Отобразить (или использовать) журнал операций" +-#: ../yum/depsolve.py:440 ++#: ../yum/depsolve.py:449 + #, python-format + msgid "Quick matched %s to require for %s" + msgstr "%s localizado rapidamente a ser requerido por %s" - #: ../yumcommands.py:1300 + #. is it already installed? +-#: ../yum/depsolve.py:482 ++#: ../yum/depsolve.py:491 #, python-format - msgid "Invalid history sub-command, use: %s." --msgstr "Неверная субкоманда истории, используйте:%s." -+msgstr "Неверная подкоманда журнала, используйте: %s." + msgid "%s is in providing packages but it is already installed, removing." + msgstr "%s está nos pacotes fornecedores mas já está instalado, removendo." - #: ../yumcommands.py:1345 - msgid "Check for problems in the rpmdb" - msgstr "Проверка проблем в базе данных RPM" +-#: ../yum/depsolve.py:498 ++#: ../yum/depsolve.py:507 + #, python-format + msgid "Potential resolving package %s has newer instance in ts." + msgstr "O pacote de solução em potencial %s tem uma instância mais nova no ct." - #: ../yummain.py:102 --msgid "" --"Another app is currently holding the yum lock; waiting for it to exit..." -+msgid "Another app is currently holding the yum lock; waiting for it to exit..." - msgstr "Еще одно приложение, в настоящее время блокирует Yum. Подождите..." +-#: ../yum/depsolve.py:509 ++#: ../yum/depsolve.py:518 + #, python-format + msgid "Potential resolving package %s has newer instance installed." +-msgstr "O pacote de solução em potencial %s tem uma instância mais nova instalada." +- +-#: ../yum/depsolve.py:517 +-#: ../yum/depsolve.py:563 +-#, python-format +-msgid "Missing Dependency: %s is needed by package %s" +-msgstr "Dependência faltando: %s é requerido pelo pacote %s" ++msgstr "" ++"O pacote de solução em potencial %s tem uma instância mais nova instalada." --#: ../yummain.py:130 ../yummain.py:169 -+#: ../yummain.py:130 -+#: ../yummain.py:169 +-#: ../yum/depsolve.py:530 ++#: ../yum/depsolve.py:536 #, python-format - msgid "Error: %s" - msgstr "Ошибка: %s" + msgid "%s already in ts, skipping this one" + msgstr "%s já está no ct, pulando esse" --#: ../yummain.py:140 ../yummain.py:182 -+#: ../yummain.py:140 -+#: ../yummain.py:182 +-#: ../yum/depsolve.py:573 ++#: ../yum/depsolve.py:578 #, python-format - msgid "Unknown Error(s): Exit Code: %d:" - msgstr "Неизвестная ошибка(ошибки): Код выхода:%d:" -@@ -1758,7 +1813,8 @@ msgstr "Разрешение зависимостей" - msgid " You could try using --skip-broken to work around the problem" - msgstr " Вы можете попробовать --skip-broken чтобы обойти проблему." + msgid "TSINFO: Marking %s as update for %s" + msgstr "TSINFO: Marcando %s como uma atualização para o %s" --#: ../yummain.py:175 ../yummain.py:208 -+#: ../yummain.py:175 -+#: ../yummain.py:208 - msgid " You could try running: rpm -Va --nofiles --nodigest" - msgstr " Вы можете попробовать запустить: rpm -Va --nofiles --nodigest" +-#: ../yum/depsolve.py:581 ++#: ../yum/depsolve.py:586 + #, python-format + msgid "TSINFO: Marking %s as install for %s" + msgstr "TSINFO: Marcando %s como uma instalação para o %s" -@@ -1782,11 +1838,11 @@ msgstr "" +-#: ../yum/depsolve.py:685 +-#: ../yum/depsolve.py:767 ++#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 + msgid "Success - empty transaction" + msgstr "Sucesso - transação vazia" - #: ../yum/depsolve.py:82 - msgid "doTsSetup() will go away in a future version of Yum.\n" --msgstr "doTsSetup() будет устранён в следующей версии Yum\n" -+msgstr "doTsSetup() будет устранен в следующей версии Yum\n" +-#: ../yum/depsolve.py:724 +-#: ../yum/depsolve.py:739 ++#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 + msgid "Restarting Loop" + msgstr "Reiniciando o loop" - #: ../yum/depsolve.py:97 - msgid "Setting up TransactionSets before config class is up" --msgstr "Настройка набора транзакций до включения класса конфигурации" -+msgstr "Составление списка действий до включения класса конфигурации" +-#: ../yum/depsolve.py:755 ++#: ../yum/depsolve.py:760 + msgid "Dependency Process ending" + msgstr "Término do processo de dependências" - #: ../yum/depsolve.py:148 - #, python-format -@@ -1801,22 +1857,23 @@ msgstr "Поиск набора пакетов для зависимости: %s - #: ../yum/depsolve.py:175 +-#: ../yum/depsolve.py:761 ++#: ../yum/depsolve.py:774 #, python-format - msgid "Potential match for %s from %s" --msgstr "Потенциальное совпадение для %s из %s" -+msgstr "Возможное совпадение для %s из %s" + msgid "%s from %s has depsolving problems" + msgstr "%s a partir de %s tem problemas de resolução de dependências" - #: ../yum/depsolve.py:183 - #, python-format - msgid "Matched %s to require for %s" --msgstr "%s подходит в качестве требования для %s" -+msgstr "%s подходит как требуемый для %s" +-#: ../yum/depsolve.py:768 ++#: ../yum/depsolve.py:782 + msgid "Success - deps resolved" + msgstr "Sucesso - dependências resolvidas" - #: ../yum/depsolve.py:225 +-#: ../yum/depsolve.py:782 ++#: ../yum/depsolve.py:796 #, python-format - msgid "Member: %s" - msgstr "Член: %s" + msgid "Checking deps for %s" + msgstr "Verificando dependências para %s" --#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 -+#: ../yum/depsolve.py:239 -+#: ../yum/depsolve.py:754 +-#: ../yum/depsolve.py:865 ++#: ../yum/depsolve.py:874 #, python-format - msgid "%s converted to install" --msgstr "%s сконвертировано для установки" -+msgstr "%s преобразован для установки" + msgid "looking for %s as a requirement of %s" + msgstr "procurando por %s como um requerimento do %s" - #: ../yum/depsolve.py:246 +-#: ../yum/depsolve.py:1007 ++#: ../yum/depsolve.py:1090 #, python-format -@@ -1850,7 +1907,7 @@ msgstr "Требуемая зависимость не является имен - #: ../yum/depsolve.py:363 + msgid "Running compare_providers() for %s" + msgstr "Executando compare_providers() para %s" + +-#: ../yum/depsolve.py:1041 +-#: ../yum/depsolve.py:1047 ++#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 #, python-format - msgid "Potential Provider: %s" --msgstr "Потенциальный поставщик:%s" -+msgstr "Возможный поставщик:%s" + msgid "better arch in po %s" + msgstr "melhor arquitetura no po %s" - #: ../yum/depsolve.py:386 +-#: ../yum/depsolve.py:1142 ++#: ../yum/depsolve.py:1218 #, python-format -@@ -1870,8 +1927,7 @@ msgstr "TSINFO: %s пакет необходимый для %s был помеч - #: ../yum/depsolve.py:407 + msgid "%s obsoletes %s" + msgstr "%s torna %s obsoleto" + +-#: ../yum/depsolve.py:1154 ++#: ../yum/depsolve.py:1230 #, python-format - msgid "TSINFO: Obsoleting %s with %s to resolve dep." --msgstr "" --"TSINFO: Замена устаревшего %s пакета пакетом %s чтобы разрешить зависимости." -+msgstr "TSINFO: Замена устаревшего %s пакета пакетом %s чтобы разрешить зависимости." + msgid "" + "archdist compared %s to %s on %s\n" +@@ -1897,117 +1983,141 @@ msgstr "" + "archdist comparou %s com %s em %s\n" + " Vencedor: %s" - #: ../yum/depsolve.py:410 +-#: ../yum/depsolve.py:1161 ++#: ../yum/depsolve.py:1237 #, python-format -@@ -1881,7 +1937,7 @@ msgstr "TSINFO: Обновление %s для разрешения зависи - #: ../yum/depsolve.py:418 + msgid "common sourcerpm %s and %s" + msgstr "Sourcerpm comum %s e %s" + +-#: ../yum/depsolve.py:1167 ++#: ../yum/depsolve.py:1241 ++#, python-format ++msgid "base package %s is installed for %s" ++msgstr "o pacote base %s está instalado para o %s" ++ ++#: ../yum/depsolve.py:1247 #, python-format - msgid "Cannot find an update path for dep for: %s" --msgstr "Не удаётся найти путь обновления зависимости для: %s" -+msgstr "Не удается найти путь обновления зависимости для: %s" + msgid "common prefix of %s between %s and %s" + msgstr "prefixo comum de %s entre %s e %s" - #: ../yum/depsolve.py:449 +-#: ../yum/depsolve.py:1175 ++#: ../yum/depsolve.py:1256 #, python-format -@@ -1897,19 +1953,17 @@ msgstr "Зависимый пакет %s уже установлен и буде - #: ../yum/depsolve.py:507 + msgid "Best Order: %s" + msgstr "Melhor ordem: %s" + +-#: ../yum/__init__.py:187 ++#: ../yum/__init__.py:192 + msgid "doConfigSetup() will go away in a future version of Yum.\n" + msgstr "doConfigSetup() será removida em uma futura versão do Yum.\n" + +-#: ../yum/__init__.py:412 ++#: ../yum/__init__.py:424 #, python-format - msgid "Potential resolving package %s has newer instance in ts." --msgstr "" --"Пакет %s новой версии, потенциально разрешающий, находится в составе " --"транзакции." -+msgstr "Пакет %s в сценарии новее доступного" + msgid "Repository %r is missing name in configuration, using id" + msgstr "O repositório %r não tem nome na configuração, usando o id" - #: ../yum/depsolve.py:518 +-#: ../yum/__init__.py:450 ++#: ../yum/__init__.py:462 + msgid "plugins already initialised" + msgstr "plugins já inicializados" + +-#: ../yum/__init__.py:457 ++#: ../yum/__init__.py:469 + msgid "doRpmDBSetup() will go away in a future version of Yum.\n" + msgstr "doRpmDBSetup() será removida em uma futura versão do Yum.\n" + +-#: ../yum/__init__.py:468 ++#: ../yum/__init__.py:480 + msgid "Reading Local RPMDB" + msgstr "Lendo RPMDB local" + +-#: ../yum/__init__.py:489 ++#: ../yum/__init__.py:504 + msgid "doRepoSetup() will go away in a future version of Yum.\n" + msgstr "doRepoSetup() será removida em uma futura versão do Yum.\n" + +-#: ../yum/__init__.py:509 ++#: ../yum/__init__.py:524 + msgid "doSackSetup() will go away in a future version of Yum.\n" + msgstr "doSackSetup() será removida em uma futura versão do Yum.\n" + +-#: ../yum/__init__.py:539 ++#: ../yum/__init__.py:554 + msgid "Setting up Package Sacks" + msgstr "Configurando sacos de pacotes" + +-#: ../yum/__init__.py:584 ++#: ../yum/__init__.py:599 #, python-format - msgid "Potential resolving package %s has newer instance installed." --msgstr "Пакет %s ,потенциально разрешающий, установлен новой версии." -+msgstr "Более новый пакет %s уже установлен в систему" + msgid "repo object for repo %s lacks a _resetSack method\n" + msgstr "o objeto de repositório para o %s necessita de um método _resetSack\n" - #: ../yum/depsolve.py:536 +-#: ../yum/__init__.py:585 ++#: ../yum/__init__.py:600 + msgid "therefore this repo cannot be reset.\n" + msgstr "conseqüentemente este repo não pode ser restaurado.\n" + +-#: ../yum/__init__.py:590 ++#: ../yum/__init__.py:605 + msgid "doUpdateSetup() will go away in a future version of Yum.\n" + msgstr "doUpdateSetup() será removida em uma futura versão do Yum.\n" + +-#: ../yum/__init__.py:602 ++#: ../yum/__init__.py:617 + msgid "Building updates object" + msgstr "Construindo objeto de atualizações" + +-#: ../yum/__init__.py:637 ++#: ../yum/__init__.py:652 + msgid "doGroupSetup() will go away in a future version of Yum.\n" + msgstr "doGroupSetup() será removida em uma futura versão do Yum.\n" + +-#: ../yum/__init__.py:662 ++#: ../yum/__init__.py:677 + msgid "Getting group metadata" + msgstr "Obtendo metadados do grupo" + +-#: ../yum/__init__.py:688 ++#: ../yum/__init__.py:703 #, python-format - msgid "%s already in ts, skipping this one" --msgstr "%s уже находится в наборе транзакций, пропуск" -+msgstr "%s уже в списке к действию, пропускаем его" + msgid "Adding group file from repository: %s" + msgstr "Adicionando arquivo de grupo a partir do repositório: %s" - #: ../yum/depsolve.py:578 +-#: ../yum/__init__.py:697 ++#: ../yum/__init__.py:712 #, python-format -@@ -1921,11 +1975,13 @@ msgstr "TSINFO: %s отмечен как обновление для %s" - msgid "TSINFO: Marking %s as install for %s" - msgstr "TSINFO: Отмечен %s чтобы установить %s" + msgid "Failed to add groups file for repository: %s - %s" + msgstr "Falha ao adicionar o arquivo de grupos para o repositório: %s - %s" --#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 -+#: ../yum/depsolve.py:690 -+#: ../yum/depsolve.py:781 - msgid "Success - empty transaction" --msgstr "Успех - пустая транзакция" -+msgstr "Успешно — холостое задание" +-#: ../yum/__init__.py:703 ++#: ../yum/__init__.py:718 + msgid "No Groups Available in any repository" + msgstr "Nenhum grupo disponível em nenhum repositório" --#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 -+#: ../yum/depsolve.py:729 -+#: ../yum/depsolve.py:744 - msgid "Restarting Loop" - msgstr "Перезапуск петли" +-#: ../yum/__init__.py:763 ++#: ../yum/__init__.py:730 ++msgid "Getting pkgtags metadata" ++msgstr "Obtendo metadados do pkgtags" ++ ++#: ../yum/__init__.py:740 ++#, python-format ++msgid "Adding tags from repository: %s" ++msgstr "Adicionando tags do repositório: %s" ++ ++#: ../yum/__init__.py:749 ++#, python-format ++msgid "Failed to add Pkg Tags for repository: %s - %s" ++msgstr "Falha ao adicionar as Pkg Tags para o repositório: %s - %s" ++ ++#: ../yum/__init__.py:827 + msgid "Importing additional filelist information" + msgstr "Importando informações adicionais da lista de arquivos" -@@ -1940,7 +1996,7 @@ msgstr "%s из %s имеет проблемы с разрешением зав +-#: ../yum/__init__.py:777 ++#: ../yum/__init__.py:841 + #, python-format + msgid "The program %s%s%s is found in the yum-utils package." + msgstr "O programa %s%s%s está localizado no pacote yum-utils." - #: ../yum/depsolve.py:782 - msgid "Success - deps resolved" --msgstr "Успешно - зависимости разрешены" -+msgstr "Успешно — зависимости разрешены" +-#: ../yum/__init__.py:785 +-msgid "There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them." +-msgstr "Há transações não finalizadas restantes. Você pode considerar executar o yum-complete-transaction primeiro para finalizá-las." ++#: ../yum/__init__.py:849 ++msgid "" ++"There are unfinished transactions remaining. You might consider running yum-" ++"complete-transaction first to finish them." ++msgstr "" ++"Há transações não finalizadas restantes. Você pode considerar executar o yum-" ++"complete-transaction primeiro para finalizá-las." - #: ../yum/depsolve.py:796 +-#: ../yum/__init__.py:853 ++#. Kind of hacky ++#: ../yum/__init__.py:922 #, python-format -@@ -1957,7 +2013,8 @@ msgstr "поиск %s требуется для %s" - msgid "Running compare_providers() for %s" - msgstr "Запуск compare_providers() для %s" + msgid "Skip-broken round %i" + msgstr "Rodada de ignoração de dependências quebradas %i" --#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 -+#: ../yum/depsolve.py:1117 -+#: ../yum/depsolve.py:1123 - #, python-format - msgid "better arch in po %s" - msgstr "Лучший архив в %s" -@@ -1965,7 +2022,7 @@ msgstr "Лучший архив в %s" - #: ../yum/depsolve.py:1218 +-#: ../yum/__init__.py:906 ++#: ../yum/__init__.py:975 #, python-format - msgid "%s obsoletes %s" --msgstr "%s заменяет %s" -+msgstr "%s исключает %s" + msgid "Skip-broken took %i rounds " + msgstr "A ignoração de dependências quebradas levou %i rodadas" - #: ../yum/depsolve.py:1230 +-#: ../yum/__init__.py:907 ++#: ../yum/__init__.py:976 + msgid "" + "\n" + "Packages skipped because of dependency problems:" +@@ -2015,76 +2125,93 @@ msgstr "" + "\n" + "Pacotes ignorados devido a problemas de dependências:" + +-#: ../yum/__init__.py:911 ++#: ../yum/__init__.py:980 #, python-format -@@ -1998,7 +2055,7 @@ msgstr "Лучший выбор: %s" + msgid " %s from %s" + msgstr " %s a partir de %s" - #: ../yum/__init__.py:192 - msgid "doConfigSetup() will go away in a future version of Yum.\n" --msgstr "doConfigSetup() будет устранён в следующей версии Yum.\n" -+msgstr "doConfigSetup() будет устранен в следующей версии Yum.\n" +-#: ../yum/__init__.py:1083 +-msgid "Warning: scriptlet or other non-fatal errors occurred during transaction." +-msgstr "Aviso: scriptlet ou outros erros não fatais ocorreram durante a transação." ++#: ../yum/__init__.py:1121 ++msgid "Warning: RPMDB altered outside of yum." ++msgstr "Aviso: o RPMDB foi alterado de fora do yum." - #: ../yum/__init__.py:424 +-#: ../yum/__init__.py:1101 ++#: ../yum/__init__.py:1126 ++msgid "missing requires" ++msgstr "faltando exigências" ++ ++#: ../yum/__init__.py:1127 ++msgid "installed conflict" ++msgstr "conflito instalado" ++ ++#: ../yum/__init__.py:1180 ++msgid "" ++"Warning: scriptlet or other non-fatal errors occurred during transaction." ++msgstr "" ++"Aviso: scriptlet ou outros erros não fatais ocorreram durante a transação." ++ ++#: ../yum/__init__.py:1198 #, python-format -@@ -2007,11 +2064,11 @@ msgstr "Хранилище %r не имеет названия в конфиг - - #: ../yum/__init__.py:462 - msgid "plugins already initialised" --msgstr "плагин уже инициализирован" -+msgstr "модули уже загружены" + msgid "Failed to remove transaction file %s" + msgstr "Falha ao remover o arquivo de transação %s" - #: ../yum/__init__.py:469 - msgid "doRpmDBSetup() will go away in a future version of Yum.\n" --msgstr "doRpmDBSetup() будет устранён в следующей версии Yum.\n" -+msgstr "doRpmDBSetup() будет устранен в следующей версии Yum.\n" + #. maybe a file log here, too + #. but raising an exception is not going to do any good +-#: ../yum/__init__.py:1130 ++#: ../yum/__init__.py:1227 + #, python-format + msgid "%s was supposed to be installed but is not!" + msgstr "%s deveria ter sido instalado mas não foi!" - #: ../yum/__init__.py:480 - msgid "Reading Local RPMDB" -@@ -2019,11 +2076,11 @@ msgstr "Чтение локальной базы данных RPM" + #. maybe a file log here, too + #. but raising an exception is not going to do any good +-#: ../yum/__init__.py:1169 ++#: ../yum/__init__.py:1266 + #, python-format + msgid "%s was supposed to be removed but is not!" + msgstr "%s deveria ter sido removido mas não foi!" - #: ../yum/__init__.py:504 - msgid "doRepoSetup() will go away in a future version of Yum.\n" --msgstr "doRepoSetup() будет устранён в следующей версии Yum.\n" -+msgstr "doRepoSetup() будет устранен в следующей версии Yum.\n" + #. Whoa. What the heck happened? +-#: ../yum/__init__.py:1289 ++#: ../yum/__init__.py:1386 + #, python-format + msgid "Unable to check if PID %s is active" + msgstr "Não foi possível verificar se o PID %s está ativo" - #: ../yum/__init__.py:524 - msgid "doSackSetup() will go away in a future version of Yum.\n" --msgstr "doSackSetup() будет устранён в следующей версии Yum.\n" -+msgstr "doSackSetup() будет устранен в следующей версии Yum.\n" + #. Another copy seems to be running. +-#: ../yum/__init__.py:1293 ++#: ../yum/__init__.py:1390 + #, python-format + msgid "Existing lock %s: another copy is running as pid %s." + msgstr "Bloqueio existente em %s: outra cópia está em execução com o pid %s." - #: ../yum/__init__.py:554 - msgid "Setting up Package Sacks" -@@ -2040,7 +2097,7 @@ msgstr "поэтому этот репозиторий не может быть + #. Whoa. What the heck happened? +-#: ../yum/__init__.py:1328 ++#: ../yum/__init__.py:1425 + #, python-format + msgid "Could not create lock at %s: %s " + msgstr "Não foi possível criar um bloqueio em %s: %s" - #: ../yum/__init__.py:605 - msgid "doUpdateSetup() will go away in a future version of Yum.\n" --msgstr "doUpdateSetup() будет устранён в следующей версии Yum.\n" -+msgstr "doUpdateSetup() будет устранен в следующей версии Yum.\n" +-#: ../yum/__init__.py:1373 +-msgid "Package does not match intended download" +-msgstr "O pacote não corresponde ao download pretendido" ++#: ../yum/__init__.py:1470 ++msgid "" ++"Package does not match intended download. Suggestion: run yum clean metadata" ++msgstr "" ++"O pacote não corresponde ao download pretendido. Sugestão: execute yum clean " ++"metadata" - #: ../yum/__init__.py:617 - msgid "Building updates object" -@@ -2048,25 +2105,25 @@ msgstr "Построение объекта обновлений" +-#: ../yum/__init__.py:1388 ++#: ../yum/__init__.py:1486 + msgid "Could not perform checksum" + msgstr "Não foi possível realizar a soma de verificação" - #: ../yum/__init__.py:652 - msgid "doGroupSetup() will go away in a future version of Yum.\n" --msgstr "doGroupSetup() будет устранён в следующей версии Yum.\n" -+msgstr "doGroupSetup() будет устранен в следующей версии Yum.\n" +-#: ../yum/__init__.py:1391 ++#: ../yum/__init__.py:1489 + msgid "Package does not match checksum" + msgstr "O pacote não corresponde à soma de verificação" - #: ../yum/__init__.py:677 - msgid "Getting group metadata" --msgstr "Получение метаданных групп" -+msgstr "Получение метаданных коллекции" +-#: ../yum/__init__.py:1433 ++#: ../yum/__init__.py:1531 + #, python-format + msgid "package fails checksum but caching is enabled for %s" +-msgstr "o pacote falhou na soma de verificação mas o cache está habilitado para o %s" ++msgstr "" ++"o pacote falhou na soma de verificação mas o cache está habilitado para o %s" - #: ../yum/__init__.py:703 +-#: ../yum/__init__.py:1436 +-#: ../yum/__init__.py:1465 ++#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 #, python-format - msgid "Adding group file from repository: %s" --msgstr "Добавление файла групп из репозитория: %s" -+msgstr "Добавление файла коллекций из репозитория: %s" + msgid "using local copy of %s" + msgstr "usando cópia local do %s" - #: ../yum/__init__.py:712 +-#: ../yum/__init__.py:1477 ++#: ../yum/__init__.py:1575 #, python-format - msgid "Failed to add groups file for repository: %s - %s" --msgstr "Ошибка добавления файла групп для репозитория: %s - %s" -+msgstr "Ошибка добавления файла коллекций для репозитория: %s — %s" + msgid "" + "Insufficient space in download directory %s\n" +@@ -2095,419 +2222,423 @@ msgstr "" + " * livre %s\n" + " * necessário %s" - #: ../yum/__init__.py:718 - msgid "No Groups Available in any repository" --msgstr "Нет доступных групп в любом репозитории" -+msgstr "Ни в одном репозитории нет доступных коллекций" +-#: ../yum/__init__.py:1526 ++#: ../yum/__init__.py:1624 + msgid "Header is not complete." + msgstr "O cabeçalho não está completo." - #: ../yum/__init__.py:730 - msgid "Getting pkgtags metadata" -@@ -2075,12 +2132,12 @@ msgstr "Загрузка метаданных меток пакета " - #: ../yum/__init__.py:740 +-#: ../yum/__init__.py:1563 ++#: ../yum/__init__.py:1661 #, python-format - msgid "Adding tags from repository: %s" --msgstr "Добавление меток с репозитория: %s" -+msgstr "Добавление меток из репозитория: %s" +-msgid "Header not in local cache and caching-only mode enabled. Cannot download %s" +-msgstr "O cabeçalho não está no cache local e o modo de somente cache está habilitado. Não foi possível baixar o %s." ++msgid "" ++"Header not in local cache and caching-only mode enabled. Cannot download %s" ++msgstr "" ++"O cabeçalho não está no cache local e o modo de somente cache está " ++"habilitado. Não foi possível baixar o %s." - #: ../yum/__init__.py:749 +-#: ../yum/__init__.py:1618 ++#: ../yum/__init__.py:1716 #, python-format - msgid "Failed to add Pkg Tags for repository: %s - %s" --msgstr "Ошибка добавление меток пакета для репозитория: %s - %s" -+msgstr "Ошибка добавление меток пакета для репозитория: %s — %s" + msgid "Public key for %s is not installed" + msgstr "A chave pública para o %s não está instalada" - #: ../yum/__init__.py:827 - msgid "Importing additional filelist information" -@@ -2092,23 +2149,19 @@ msgid "The program %s%s%s is found in the yum-utils package." - msgstr "Программа %s%s%s найдена в пакете yum-utils." +-#: ../yum/__init__.py:1622 ++#: ../yum/__init__.py:1720 + #, python-format + msgid "Problem opening package %s" + msgstr "Problema ao abrir o pacote %s" - #: ../yum/__init__.py:849 --msgid "" --"There are unfinished transactions remaining. You might consider running yum-" --"complete-transaction first to finish them." --msgstr "" --"Присутствуют незавершённые транзакции. Вы можете запустить команду yum-" --"complete-transaction для их завершения." -+msgid "There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them." -+msgstr "Остались незавершенные действия. Возможно, сначала следует выполнить yum-complete-transaction для их завершения." +-#: ../yum/__init__.py:1630 ++#: ../yum/__init__.py:1728 + #, python-format + msgid "Public key for %s is not trusted" + msgstr "A chave pública para o %s não é confiável" - #. Kind of hacky - #: ../yum/__init__.py:922 +-#: ../yum/__init__.py:1634 ++#: ../yum/__init__.py:1732 #, python-format - msgid "Skip-broken round %i" --msgstr "Раунд %i пропуская поврежденные" -+msgstr "Пропуск %i разрушенной связи" + msgid "Package %s is not signed" + msgstr "O pacote %s não está assinado" - #: ../yum/__init__.py:975 +-#: ../yum/__init__.py:1672 ++#: ../yum/__init__.py:1770 #, python-format - msgid "Skip-broken took %i rounds " --msgstr "Раунд пропуская повреждённые прошло%i " -+msgstr "Разрушено %i связей" + msgid "Cannot remove %s" + msgstr "Não foi possível remover %s" - #: ../yum/__init__.py:976 - msgid "" -@@ -2136,16 +2189,13 @@ msgid "installed conflict" - msgstr "установлен в конфликте" +-#: ../yum/__init__.py:1676 ++#: ../yum/__init__.py:1774 + #, python-format + msgid "%s removed" + msgstr "%s removido" - #: ../yum/__init__.py:1180 --msgid "" --"Warning: scriptlet or other non-fatal errors occurred during transaction." --msgstr "" --"Внимание: во время транзакции была вызвана ошибка сценария или произошла\n" --" иная не критичная ошибка" -+msgid "Warning: scriptlet or other non-fatal errors occurred during transaction." -+msgstr "Внимание: в ходе операции возникли некоторые некритические ошибки." +-#: ../yum/__init__.py:1712 ++#: ../yum/__init__.py:1820 + #, python-format + msgid "Cannot remove %s file %s" + msgstr "Não foi possível remover %s arquivo %s" - #: ../yum/__init__.py:1198 +-#: ../yum/__init__.py:1716 ++#: ../yum/__init__.py:1824 #, python-format - msgid "Failed to remove transaction file %s" --msgstr "Невозможно удалить файл транзакции %s" -+msgstr "Невозможно удалить маркер %s" + msgid "%s file %s removed" + msgstr "%s arquivo %s removido" - #. maybe a file log here, too - #. but raising an exception is not going to do any good -@@ -2159,7 +2209,7 @@ msgstr "%s должен был быть установлен, но не был - #: ../yum/__init__.py:1266 +-#: ../yum/__init__.py:1718 ++#: ../yum/__init__.py:1826 #, python-format - msgid "%s was supposed to be removed but is not!" --msgstr "%s должен был быть удалён, но не был удалён!" -+msgstr "%s должен был быть удален, но не был удален!" + msgid "%d %s files removed" + msgstr "%d %s arquivos removidos" - #. Whoa. What the heck happened? - #: ../yum/__init__.py:1386 -@@ -2180,11 +2230,8 @@ msgid "Could not create lock at %s: %s " - msgstr "Вы не можете создать блокировку %s: %s" +-#: ../yum/__init__.py:1787 ++#: ../yum/__init__.py:1895 + #, python-format + msgid "More than one identical match in sack for %s" + msgstr "Mais de uma correspondência idêntica no saco para %s" - #: ../yum/__init__.py:1470 --msgid "" --"Package does not match intended download. Suggestion: run yum clean metadata" --msgstr "" --"Пакет не соответствует предназначенному для загрузки. Предложение: " --"Пожалуйста, запустите yum clean metadata" -+msgid "Package does not match intended download. Suggestion: run yum clean metadata" -+msgstr "Пакет не соответствует предназначенному для загрузки. Предложение: Пожалуйста, запустите yum clean metadata" +-#: ../yum/__init__.py:1793 ++#: ../yum/__init__.py:1901 + #, python-format + msgid "Nothing matches %s.%s %s:%s-%s from update" + msgstr "Nada corresponde ao %s.%s %s:%s-%s a partir da atualização" - #: ../yum/__init__.py:1486 - msgid "Could not perform checksum" -@@ -2199,7 +2246,8 @@ msgstr "Пакет не совпадает с контрольной суммо - msgid "package fails checksum but caching is enabled for %s" - msgstr "проверка контрольной суммы неудачна, но кэширование включено для %s" +-#: ../yum/__init__.py:2026 +-msgid "searchPackages() will go away in a future version of Yum. Use searchGenerator() instead. \n" +-msgstr "searchPackages() será removida em uma futura versão do Yum. Ao invés disso, use a searchGenerator().\n" ++#: ../yum/__init__.py:2180 ++msgid "" ++"searchPackages() will go away in a future version of " ++"Yum. Use searchGenerator() instead. \n" ++msgstr "" ++"searchPackages() será removida em uma futura versão do Yum. Ao invés disso, " ++"use a searchGenerator().\n" --#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 -+#: ../yum/__init__.py:1534 -+#: ../yum/__init__.py:1563 +-#: ../yum/__init__.py:2065 ++#: ../yum/__init__.py:2219 #, python-format - msgid "using local copy of %s" - msgstr "использование локальной копии %s" -@@ -2221,11 +2269,8 @@ msgstr "Заголовок не готов." + msgid "Searching %d packages" + msgstr "Pesquisando por %d pacotes" - #: ../yum/__init__.py:1661 +-#: ../yum/__init__.py:2069 ++#: ../yum/__init__.py:2223 #, python-format --msgid "" --"Header not in local cache and caching-only mode enabled. Cannot download %s" --msgstr "" --"Заголовок не в локальном кэше. Включён режим только из кэша. Невозможно " --"загрузить %s" -+msgid "Header not in local cache and caching-only mode enabled. Cannot download %s" -+msgstr "Заголовок не в локальном кэше. Включен режим только из кэша. Невозможно загрузить %s" + msgid "searching package %s" + msgstr "pesquisando pelo pacote %s" - #: ../yum/__init__.py:1716 - #, python-format -@@ -2283,12 +2328,8 @@ msgid "Nothing matches %s.%s %s:%s-%s from update" - msgstr "Совпадений не найдено %s.%s %s:%s-%s из обновлений" +-#: ../yum/__init__.py:2081 ++#: ../yum/__init__.py:2235 + msgid "searching in file entries" + msgstr "pesquisando nas entradas do arquivo" - #: ../yum/__init__.py:2180 --msgid "" --"searchPackages() will go away in a future version of " --"Yum. Use searchGenerator() instead. \n" --msgstr "" --"searchPackages() будет убрано в следующей версии Yum. Используйте " --"searchGenerator() взамен. \n" -+msgid "searchPackages() will go away in a future version of Yum. Use searchGenerator() instead. \n" -+msgstr "searchPackages() будет убрано в следующей версии Yum. Используйте searchGenerator() взамен. \n" +-#: ../yum/__init__.py:2088 ++#: ../yum/__init__.py:2242 + msgid "searching in provides entries" + msgstr "pesquisando nas entradas dos fornecimentos" - #: ../yum/__init__.py:2219 +-#: ../yum/__init__.py:2121 ++#: ../yum/__init__.py:2275 #, python-format -@@ -2315,24 +2356,29 @@ msgstr "Результат совпадений: %s" + msgid "Provides-match: %s" + msgstr "Fornecimento combina com: %s" - #: ../yum/__init__.py:2324 +-#: ../yum/__init__.py:2170 ++#: ../yum/__init__.py:2324 msgid "No group data available for configured repositories" --msgstr "Нет доступных данных групп для настроеных репозиториев" -- --#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 --#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 -+msgstr "Для настроеных репозиториев данных коллекций нет" -+ -+#: ../yum/__init__.py:2355 -+#: ../yum/__init__.py:2374 -+#: ../yum/__init__.py:2405 -+#: ../yum/__init__.py:2411 -+#: ../yum/__init__.py:2493 -+#: ../yum/__init__.py:2497 - #: ../yum/__init__.py:2814 + msgstr "Nenhum dado de grupos disponível para os repositório configurados" + +-#: ../yum/__init__.py:2201 +-#: ../yum/__init__.py:2220 +-#: ../yum/__init__.py:2251 +-#: ../yum/__init__.py:2257 +-#: ../yum/__init__.py:2336 +-#: ../yum/__init__.py:2340 +-#: ../yum/__init__.py:2655 ++#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 ++#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 ++#: ../yum/__init__.py:2814 #, python-format msgid "No Group named %s exists" --msgstr "Группы с именем %s не существует" -+msgstr "Коллекции с названием %s не существует" + msgstr "Não existe nenhum grupo de nome %s" --#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 -+#: ../yum/__init__.py:2386 -+#: ../yum/__init__.py:2513 +-#: ../yum/__init__.py:2232 +-#: ../yum/__init__.py:2353 ++#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 #, python-format msgid "package %s was not marked in group %s" --msgstr "пакет %s не отмечен в группе %s" -+msgstr "пакет %s не отмечен в коллекции %s" + msgstr "o pacote %s não foi marcado no grupo %s" - #: ../yum/__init__.py:2433 +-#: ../yum/__init__.py:2279 ++#: ../yum/__init__.py:2433 #, python-format msgid "Adding package %s from group %s" --msgstr "Добавление пакета %s из группы %s" -+msgstr "Добавление пакета %s из коллекции %s" + msgstr "Adicionando o pacote %s do grupo %s" - #: ../yum/__init__.py:2437 +-#: ../yum/__init__.py:2283 ++#: ../yum/__init__.py:2437 + #, python-format + msgid "No package named %s available to be installed" + msgstr "Nenhum pacote de nome %s disponível para ser instalado" + +-#: ../yum/__init__.py:2380 ++#: ../yum/__init__.py:2539 + #, python-format + msgid "Package tuple %s could not be found in packagesack" + msgstr "A tupla %s do pacote não pôde ser encontrada no packagesack" + +-#: ../yum/__init__.py:2399 ++#: ../yum/__init__.py:2558 #, python-format -@@ -2349,11 +2395,13 @@ msgstr "Кортеж пакетов %s не найден в наборе пак msgid "Package tuple %s could not be found in rpmdb" - msgstr "Кортеж пакетов %s не найден в базе RPM" + msgstr "A tupla %s do pacote não pôde ser localizada no rpmdb" --#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 -+#: ../yum/__init__.py:2614 -+#: ../yum/__init__.py:2664 +-#: ../yum/__init__.py:2455 +-#: ../yum/__init__.py:2505 ++#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 msgid "Invalid version flag" - msgstr "Hеверная версия флага %s" + msgstr "Sinalizador de versão inválido" --#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 -+#: ../yum/__init__.py:2634 -+#: ../yum/__init__.py:2639 +-#: ../yum/__init__.py:2475 +-#: ../yum/__init__.py:2480 ++#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 #, python-format msgid "No Package found for %s" - msgstr "Пакет %s не найден" -@@ -2366,12 +2414,15 @@ msgstr "Объект пакета не являлся экземпляром о + msgstr "Nenhum pacote encontrado para %s" + +-#: ../yum/__init__.py:2696 ++#: ../yum/__init__.py:2855 + msgid "Package Object was not a package object instance" + msgstr "O pacote de objeto não era uma instância de pacote de objeto" + +-#: ../yum/__init__.py:2700 ++#: ../yum/__init__.py:2859 msgid "Nothing specified to install" - msgstr "Ничего не отмечено для установки" + msgstr "Nada especificado para instalar" --#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 -+#: ../yum/__init__.py:2875 -+#: ../yum/__init__.py:3652 +-#: ../yum/__init__.py:2716 +-#: ../yum/__init__.py:3489 ++#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 #, python-format msgid "Checking for virtual provide or file-provide for %s" - msgstr "Проверка виртуального провайдера или файлового провайдера для %s" + msgstr "Verificando por fornecimento virtual ou de arquivo para %s" --#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 -+#: ../yum/__init__.py:2881 -+#: ../yum/__init__.py:3197 -+#: ../yum/__init__.py:3365 - #: ../yum/__init__.py:3658 +-#: ../yum/__init__.py:2722 +-#: ../yum/__init__.py:3037 +-#: ../yum/__init__.py:3205 +-#: ../yum/__init__.py:3495 ++#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 ++#: ../yum/__init__.py:3658 #, python-format msgid "No Match for argument: %s" -@@ -2389,40 +2440,43 @@ msgstr "Нет доступных для установки пакетов" - #: ../yum/__init__.py:2972 + msgstr "Nenhuma correspondência para o argumento: %s" + +-#: ../yum/__init__.py:2798 ++#: ../yum/__init__.py:2957 + #, python-format + msgid "Package %s installed and not available" + msgstr "Pacote %s instalado, mas não disponível" + +-#: ../yum/__init__.py:2801 ++#: ../yum/__init__.py:2960 + msgid "No package(s) available to install" + msgstr "Nenhum pacote disponível para instalar" + +-#: ../yum/__init__.py:2813 ++#: ../yum/__init__.py:2972 #, python-format msgid "Package: %s - already in transaction set" --msgstr "Пакет: %s - уже включён в транзакцию" -+msgstr "Пакет: %s — уже в списке к действию" + msgstr "Pacote: %s - já está no conjunto de transações" - #: ../yum/__init__.py:2998 +-#: ../yum/__init__.py:2839 ++#: ../yum/__init__.py:2998 #, python-format msgid "Package %s is obsoleted by %s which is already installed" --msgstr "Пакет %s был заменён на %s и он уже установлен" -+msgstr "Пакет %s недействителен из-за установленного %s" + msgstr "O pacote %s foi tornado obsoleto pelo %s, o qual já está instalado" - #: ../yum/__init__.py:3001 +-#: ../yum/__init__.py:2842 ++#: ../yum/__init__.py:3001 #, python-format msgid "Package %s is obsoleted by %s, trying to install %s instead" --msgstr "Пакет %s был заменён на %s, попытка установки %s взамен" -+msgstr "Пакет %s недействителен из-за %s, попытка установки %s взамен" +-msgstr "O pacote %s foi tornado obsoleto por %s, tentando instalar %s ao invés disso" ++msgstr "" ++"O pacote %s foi tornado obsoleto por %s, tentando instalar %s ao invés disso" - #: ../yum/__init__.py:3009 +-#: ../yum/__init__.py:2850 ++#: ../yum/__init__.py:3009 #, python-format msgid "Package %s already installed and latest version" --msgstr "Пакет %s уже установлен, и это последняя версия." -+msgstr "Пакет %s уже установлен, и это новейшая версия." + msgstr "O pacote %s já está instalado em sua última versão" - #: ../yum/__init__.py:3023 +-#: ../yum/__init__.py:2864 ++#: ../yum/__init__.py:3023 #, python-format msgid "Package matching %s already installed. Checking for update." --msgstr "Пакет %s уже установлен.Проверка для обновления." -+msgstr "Пакет %s уже установлен. Проверка обновлений." + msgstr "O pacote %s já está instalado. Verificando por uma atualização." #. update everything (the easy case) - #: ../yum/__init__.py:3126 +-#: ../yum/__init__.py:2966 ++#: ../yum/__init__.py:3126 msgid "Updating Everything" - msgstr "Полное обновление" + msgstr "Atualizando tudo" --#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 -+#: ../yum/__init__.py:3147 -+#: ../yum/__init__.py:3262 -+#: ../yum/__init__.py:3289 - #: ../yum/__init__.py:3315 +-#: ../yum/__init__.py:2987 +-#: ../yum/__init__.py:3102 +-#: ../yum/__init__.py:3129 +-#: ../yum/__init__.py:3155 ++#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 ++#: ../yum/__init__.py:3315 #, python-format msgid "Not Updating Package that is already obsoleted: %s.%s %s:%s-%s" --msgstr "Пакет не обновляется, уже заменён: %s.%s %s:%s-%s" -+msgstr "Устаревший и уже необновляемый пакет: %s.%s %s:%s-%s" + msgstr "Pacote já obsoleto não será atualizado: %s.%s %s:%s-%s" --#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 -+#: ../yum/__init__.py:3182 -+#: ../yum/__init__.py:3362 +-#: ../yum/__init__.py:3022 +-#: ../yum/__init__.py:3202 ++#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 #, python-format msgid "%s" msgstr "%s" -@@ -2430,17 +2484,18 @@ msgstr "%s" - #: ../yum/__init__.py:3253 + +-#: ../yum/__init__.py:3093 ++#: ../yum/__init__.py:3253 #, python-format msgid "Package is already obsoleted: %s.%s %s:%s-%s" --msgstr "Пакет был заменён:%s.%s %s:%s-%s" -+msgstr "Пакет уже недействителен:%s.%s %s:%s-%s" + msgstr "O pacote já está obsoleto: %s.%s %s:%s-%s" - #: ../yum/__init__.py:3284 +-#: ../yum/__init__.py:3124 ++#: ../yum/__init__.py:3284 #, python-format msgid "Not Updating Package that is obsoleted: %s" --msgstr "Пакет не обновляется, заменён: %s" -+msgstr "Устаревший необновляемый пакет: %s" + msgstr "Não atualizando o pacote que está obsoleto: %s" --#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 -+#: ../yum/__init__.py:3293 -+#: ../yum/__init__.py:3319 +-#: ../yum/__init__.py:3133 +-#: ../yum/__init__.py:3159 ++#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 #, python-format msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s" --msgstr "Уже обновленный пакет не обновляется: %s.%s %s:%s-%s" -+msgstr "Необновленный пакет, который был обновлен ранее: %s.%s %s:%s-%s" + msgstr "Pacote já atualizado não será atualizado novamente: %s.%s %s:%s-%s" - #: ../yum/__init__.py:3378 +-#: ../yum/__init__.py:3218 ++#: ../yum/__init__.py:3378 msgid "No package matched to remove" -@@ -2451,27 +2506,28 @@ msgstr "Нет пакетов для удаления" - msgid "Cannot open: %s. Skipping." - msgstr "Невозможно открыть: %s. Пропуск." + msgstr "Nenhum pacote encontrado para remoção" --#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 -+#: ../yum/__init__.py:3415 -+#: ../yum/__init__.py:3514 -+#: ../yum/__init__.py:3598 +-#: ../yum/__init__.py:3251 +-#: ../yum/__init__.py:3349 +-#: ../yum/__init__.py:3432 ++#: ../yum/__init__.py:3412 + #, python-format +-msgid "Cannot open file: %s. Skipping." +-msgstr "Não foi possível abrir o arquivo: %s. Ignorando." ++msgid "Cannot open: %s. Skipping." ++msgstr "Não foi possível abrir: %s. Ignorando." + +-#: ../yum/__init__.py:3254 +-#: ../yum/__init__.py:3352 +-#: ../yum/__init__.py:3435 ++#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 #, python-format msgid "Examining %s: %s" - msgstr "Проверка %s: %s" + msgstr "Examinando %s: %s" --#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 -+#: ../yum/__init__.py:3423 -+#: ../yum/__init__.py:3517 -+#: ../yum/__init__.py:3601 +-#: ../yum/__init__.py:3262 +-#: ../yum/__init__.py:3355 +-#: ../yum/__init__.py:3438 ++#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 #, python-format msgid "Cannot add package %s to transaction. Not a compatible architecture: %s" --msgstr "" --"Невозможно добавить пакет %s в транзакцию. Несовместимая архитектура: %s" -+msgstr "Невозможно добавить пакет %s в список действий. Несовместимая архитектура: %s" +-msgstr "Não foi possível adicionar o pacote %s à transação. %s não é uma arquitetura compatível." ++msgstr "" ++"Não foi possível adicionar o pacote %s à transação. %s não é uma arquitetura " ++"compatível." - #: ../yum/__init__.py:3431 +-#: ../yum/__init__.py:3270 ++#: ../yum/__init__.py:3431 #, python-format --msgid "" --"Package %s not installed, cannot update it. Run yum install to install it " --"instead." --msgstr "" --"Пакет %s не установлен, невозможно обновить его. Запустите yum для установки " --"заместо обновления." -+msgid "Package %s not installed, cannot update it. Run yum install to install it instead." -+msgstr "Пакет %s не установлен, невозможно обновить его. Запустите yum для установки заместо обновления." +-msgid "Package %s not installed, cannot update it. Run yum install to install it instead." +-msgstr "O pacote %s não está instalado, não é possível atualizá-lo. Execute o yum install para instalá-lo." ++msgid "" ++"Package %s not installed, cannot update it. Run yum install to install it " ++"instead." ++msgstr "" ++"O pacote %s não está instalado, não é possível atualizá-lo. Execute o yum " ++"install para instalá-lo." --#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 -+#: ../yum/__init__.py:3460 -+#: ../yum/__init__.py:3522 -+#: ../yum/__init__.py:3606 +-#: ../yum/__init__.py:3299 +-#: ../yum/__init__.py:3360 +-#: ../yum/__init__.py:3443 ++#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 #, python-format msgid "Excluding %s" - msgstr "Удаление %s" -@@ -2491,7 +2547,8 @@ msgstr "%s отмечен как обновление для %s" - msgid "%s: does not update installed package." - msgstr "%s: не обновляет установленный пакет" + msgstr "Excluindo %s" --#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 -+#: ../yum/__init__.py:3511 -+#: ../yum/__init__.py:3595 +-#: ../yum/__init__.py:3304 ++#: ../yum/__init__.py:3465 #, python-format - msgid "Cannot open file: %s. Skipping." - msgstr "Невозможно открыть файл %s. Пропуск." -@@ -2500,7 +2557,8 @@ msgstr "Невозможно открыть файл %s. Пропуск." + msgid "Marking %s to be installed" + msgstr "Marcando %s para ser instalado" + +-#: ../yum/__init__.py:3310 ++#: ../yum/__init__.py:3471 + #, python-format + msgid "Marking %s as an update to %s" + msgstr "Marcando %s como uma atualização do %s" + +-#: ../yum/__init__.py:3317 ++#: ../yum/__init__.py:3478 + #, python-format + msgid "%s: does not update installed package." + msgstr "%s: não atualiza o pacote instalado." + +-#: ../yum/__init__.py:3379 ++#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 ++#, python-format ++msgid "Cannot open file: %s. Skipping." ++msgstr "Não foi possível abrir o arquivo: %s. Ignorando." ++ ++#: ../yum/__init__.py:3541 msgid "Problem in reinstall: no package matched to remove" - msgstr "Проблема при переустановке: не найден пакет для удаления" + msgstr "Problema na reinstalação: nenhum pacote encontrado para remoção" --#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 -+#: ../yum/__init__.py:3554 -+#: ../yum/__init__.py:3686 +-#: ../yum/__init__.py:3392 +-#: ../yum/__init__.py:3523 ++#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 + #, python-format + msgid "Package %s is allowed multiple installs, skipping" + msgstr "O pacote %s permite múltiplas instalações, ignorando" + +-#: ../yum/__init__.py:3413 ++#: ../yum/__init__.py:3575 #, python-format - msgid "Package %s is allowed multiple installs, skipping" - msgstr "Пакет %s может быть повторно установлен, пропуск" -@@ -2512,7 +2570,7 @@ msgstr "Проблема при переустановке: пакет %s не + msgid "Problem in reinstall: no package %s matched to install" + msgstr "Problema na reinstalação: nenhum pacote %s encontrado para instalação" - #: ../yum/__init__.py:3678 +-#: ../yum/__init__.py:3515 ++#: ../yum/__init__.py:3678 msgid "No package(s) available to downgrade" --msgstr "Нет доступных пакетов для перехода к предыдущей версии" -+msgstr "Пакеты для отката версии отсутствуют" + msgstr "Nenhum pacote disponível para ser retrocedido" - #: ../yum/__init__.py:3731 +-#: ../yum/__init__.py:3559 ++#: ../yum/__init__.py:3731 + #, python-format + msgid "No Match for available package: %s" + msgstr "Nenhuma correspondência disponível para o pacote: %s" + +-#: ../yum/__init__.py:3565 ++#: ../yum/__init__.py:3738 #, python-format -@@ -2524,10 +2582,11 @@ msgstr "Пакеты недоступны: %s" msgid "Only Upgrade available on package: %s" - msgstr "Только переход к следующей версии доступен для пакета: : %s" + msgstr "Somente a atualização está disponível para o pacote: %s" --#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 -+#: ../yum/__init__.py:3808 -+#: ../yum/__init__.py:3845 +-#: ../yum/__init__.py:3635 +-#: ../yum/__init__.py:3672 ++#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 #, python-format msgid "Failed to downgrade: %s" --msgstr "Ошибка возврата к предыдущей версии: %s" -+msgstr "Ошибка отката версии: %s" + msgstr "Falha ao desatualizar: %s" - #: ../yum/__init__.py:3877 +-#: ../yum/__init__.py:3704 ++#: ../yum/__init__.py:3877 #, python-format -@@ -2554,7 +2613,8 @@ msgid "GPG key at %s (0x%s) is already installed" - msgstr "GPG ключ %s (0x%s) уже установлен" + msgid "Retrieving GPG key from %s" + msgstr "Obtendo a chave GPG a partir de %s" + +-#: ../yum/__init__.py:3724 ++#: ../yum/__init__.py:3897 + msgid "GPG key retrieval failed: " + msgstr "A obtenção da chave GPG falhou:" + +-#: ../yum/__init__.py:3735 ++#: ../yum/__init__.py:3903 ++#, python-format ++msgid "Invalid GPG Key from %s: %s" ++msgstr "A chave GPG de %s é inválida: %s" ++ ++#: ../yum/__init__.py:3912 + #, python-format + msgid "GPG key parsing failed: key does not have value %s" + msgstr "Falha na análise da chave GPG: ela não tem o valor %s" + +-#: ../yum/__init__.py:3767 ++#: ../yum/__init__.py:3944 + #, python-format + msgid "GPG key at %s (0x%s) is already installed" + msgstr "A chave GPG em %s (0x%s) já está instalada" #. Try installing/updating GPG key --#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 -+#: ../yum/__init__.py:3949 -+#: ../yum/__init__.py:4011 +-#: ../yum/__init__.py:3772 +-#: ../yum/__init__.py:3834 ++#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 #, python-format msgid "Importing GPG key 0x%s \"%s\" from %s" - msgstr "Импорт GPG ключа 0x%s \"%s\" из %s" -@@ -2568,21 +2628,20 @@ msgstr "Не установлен ключ" + msgstr "Importando chave GPG 0x%s \"%s\" a partir de %s" + +-#: ../yum/__init__.py:3789 ++#: ../yum/__init__.py:3966 + msgid "Not installing key" + msgstr "Não está instalando a chave" + +-#: ../yum/__init__.py:3795 ++#: ../yum/__init__.py:3972 + #, python-format msgid "Key import failed (code %d)" - msgstr "Неудача импорта ключа (code %d)" + msgstr "Falha na importação da chave (código %d)" --#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 -+#: ../yum/__init__.py:3973 -+#: ../yum/__init__.py:4032 +-#: ../yum/__init__.py:3796 +-#: ../yum/__init__.py:3855 ++#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 msgid "Key imported successfully" - msgstr "Импорт ключа успешно завершен" + msgstr "Chave importada com sucesso" --#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 -+#: ../yum/__init__.py:3978 -+#: ../yum/__init__.py:4037 +-#: ../yum/__init__.py:3801 +-#: ../yum/__init__.py:3860 ++#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 #, python-format msgid "" --"The GPG keys listed for the \"%s\" repository are already installed but they " --"are not correct for this package.\n" -+"The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" +-"The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" ++"The GPG keys listed for the \"%s\" repository are already installed but they " ++"are not correct for this package.\n" "Check that the correct key URLs are configured for this repository." msgstr "" --"GPG ключи включены для репозитория \"%s\", но они не является правильными " --"для данного пакета.\n" --"Пожалуйста, проверьте правильно ли настроены URL ключи для данного " --"репозитория." -+"GPG ключи включены для репозитория \"%s\", но они не является правильными для данного пакета.\n" -+"Пожалуйста, проверьте правильно ли настроены URL ключи для данного репозитория." +-"As chaves GPG listadas para o repositório \"%s\" já estão instaladas, mas não estão corretas para este pacote.\n" +-"Verifique se as URLs corretas das chaves estão configuradas para esse repositório." ++"As chaves GPG listadas para o repositório \"%s\" já estão instaladas, mas " ++"não estão corretas para este pacote.\n" ++"Verifique se as URLs corretas das chaves estão configuradas para esse " ++"repositório." - #: ../yum/__init__.py:3987 +-#: ../yum/__init__.py:3810 ++#: ../yum/__init__.py:3987 msgid "Import of key(s) didn't help, wrong key(s)?" -@@ -2600,11 +2659,11 @@ msgstr "Ключ для репозитория %s не установлен." + msgstr "A importação da(s) chave(s) não ajudou, chave(s) errada(s)?" - #: ../yum/__init__.py:4031 +-#: ../yum/__init__.py:3829 ++#: ../yum/__init__.py:4006 + #, python-format + msgid "GPG key at %s (0x%s) is already imported" + msgstr "A chave GPG em %s (0x%s) já foi importada" + +-#: ../yum/__init__.py:3849 ++#: ../yum/__init__.py:4026 + #, python-format + msgid "Not installing key for repo %s" + msgstr "A chave para o repositório %s não será instalada" + +-#: ../yum/__init__.py:3854 ++#: ../yum/__init__.py:4031 msgid "Key import failed" --msgstr "Импорт ключа не успешен" -+msgstr "Импорт ключа неудачен" + msgstr "Falha na importação da chave" - #: ../yum/__init__.py:4157 +-#: ../yum/__init__.py:3976 ++#: ../yum/__init__.py:4157 msgid "Unable to find a suitable mirror." --msgstr "Не удаётся найти подходящее зеркало" -+msgstr "Не удается найти подходящее зеркало" + msgstr "Não foi possível encontrar um espelho apropriado." - #: ../yum/__init__.py:4159 +-#: ../yum/__init__.py:3978 ++#: ../yum/__init__.py:4159 msgid "Errors were encountered while downloading packages." -@@ -2617,56 +2676,54 @@ msgstr "Пожалуйста, сообщите об этой ошибке в %s" - - #: ../yum/__init__.py:4233 - msgid "Test Transaction Errors: " --msgstr "Ошибки теста транзакции:" -+msgstr "Ошибки проверки сценария:" + msgstr "Foram encontrados erros ao baixar os pacotes." - #: ../yum/__init__.py:4334 +-#: ../yum/__init__.py:4028 ++#: ../yum/__init__.py:4209 #, python-format - msgid "Could not set cachedir: %s" --msgstr "Невозможно установить директорию кэша: %s" -+msgstr "Невозможно задать кэш-папку: %s" + msgid "Please report this error at %s" + msgstr "Por favor, relate esse erro em %s" + +-#: ../yum/__init__.py:4052 ++#: ../yum/__init__.py:4233 + msgid "Test Transaction Errors: " + msgstr "Erros do teste de transação:" ++#: ../yum/__init__.py:4334 ++#, python-format ++msgid "Could not set cachedir: %s" ++msgstr "Não foi possível definir a cachedir: %s" ++ #. Mostly copied from YumOutput._outKeyValFill() #: ../yum/plugins.py:202 msgid "Loaded plugins: " --msgstr "Загруженные плагины:" -+msgstr "Загружены модули:" + msgstr "Plugins carregados: " --#: ../yum/plugins.py:216 ../yum/plugins.py:222 -+#: ../yum/plugins.py:216 -+#: ../yum/plugins.py:222 +-#: ../yum/plugins.py:216 +-#: ../yum/plugins.py:222 ++#: ../yum/plugins.py:216 ../yum/plugins.py:222 #, python-format msgid "No plugin match for: %s" --msgstr "Нет плагина: %s" -+msgstr "Нет модуля: %s" - - #: ../yum/plugins.py:252 - #, python-format - msgid "Not loading \"%s\" plugin, as it is disabled" --msgstr "Плагин \"%s\" не был загружен, поскольку он отключен" -+msgstr "Модуль \"%s\" не был загружен, поскольку отключен" - - #. Give full backtrace: - #: ../yum/plugins.py:264 - #, python-format - msgid "Plugin \"%s\" can't be imported" --msgstr "Невозможен импорт плагина \"%s\"" -+msgstr "Невозможен импорт модуля \"%s\"" - - #: ../yum/plugins.py:271 - #, python-format - msgid "Plugin \"%s\" doesn't specify required API version" --msgstr "Плагин \"%s\" не указывает необходимую версию API" -+msgstr "Модулем \"%s\" не указана требуемая версия API" - - #: ../yum/plugins.py:276 - #, python-format - msgid "Plugin \"%s\" requires API %s. Supported API is %s." --msgstr "Плагин \"%s\" требует API %s. Поддерживаемый API %s." -+msgstr "Модуль \"%s\" требует API %s. Поддерживаемая API — %s." - - #: ../yum/plugins.py:309 - #, python-format - msgid "Loading \"%s\" plugin" --msgstr "Загрузка \"%s\" плагина" -+msgstr "Загрузка модуля \"%s\"" + msgstr "Nenhum plugin correspondente para: %s" +@@ -2540,8 +2671,10 @@ msgstr "Carregando o plugin \"%s\"" #: ../yum/plugins.py:316 #, python-format --msgid "" --"Two or more plugins with the name \"%s\" exist in the plugin search path" --msgstr "" --"Найдено два или более плагинов с названием \"%s\" в директории поиска " --"плагинов" -+msgid "Two or more plugins with the name \"%s\" exist in the plugin search path" -+msgstr "В каталоге модулей обнаружено два или более с названием \"%s\"" +-msgid "Two or more plugins with the name \"%s\" exist in the plugin search path" +-msgstr "Dois ou mais plugins com o nome \"%s\" existem no caminho de pesquisa plugins" ++msgid "" ++"Two or more plugins with the name \"%s\" exist in the plugin search path" ++msgstr "" ++"Dois ou mais plugins com o nome \"%s\" existem no caminho de pesquisa plugins" #: ../yum/plugins.py:336 #, python-format -@@ -2678,7 +2735,7 @@ msgstr "Конфигурационный файл %s не найден" - #: ../yum/plugins.py:339 - #, python-format - msgid "Unable to find configuration file for plugin %s" --msgstr "Невозможно найти конфигурационный файл для плагина %s" -+msgstr "Не найден файл настройки модуля %s" +@@ -2559,7 +2692,20 @@ msgstr "Não foi possível encontrar o arquivo de configuração para o plugin % + msgid "registration of commands not supported" + msgstr "O registro de comandos não é suportado" + +-#: ../yum/rpmtrans.py:78 ++#: ../yum/rpmsack.py:102 ++msgid "has missing requires of" ++msgstr "tem exigências faltando do" ++ ++#: ../yum/rpmsack.py:105 ++msgid "has installed conflicts" ++msgstr "tem conflitos instalados" ++ ++#: ../yum/rpmsack.py:114 ++#, python-format ++msgid "%s is a duplicate with %s" ++msgstr "%s é uma duplicação do %s" ++ ++#: ../yum/rpmtrans.py:79 + msgid "Repackaging" + msgstr "Reempacotando" - #: ../yum/plugins.py:501 - msgid "registration of commands not supported" -@@ -2713,45 +2770,40 @@ msgstr "Контрольная сумма md5 пакета %s не совпад +@@ -2575,16 +2721,16 @@ msgstr "O RPM %s não passou na verificação md5" #: ../rpmUtils/oldUtils.py:151 msgid "Could not open RPM database for reading. Perhaps it is already in use?" --msgstr "" --"Невозможно открыть базу RPM для чтения. Возможно база уже используется." -+msgstr "Невозможно открыть базу RPM для чтения. Возможно база уже используется." +-msgstr "Não foi possível abrir o banco de dados RPM para leitura. Talvez por que ele já esteja em uso?" ++msgstr "" ++"Não foi possível abrir o banco de dados RPM para leitura. Talvez por que ele " ++"já esteja em uso?" #: ../rpmUtils/oldUtils.py:183 msgid "Got an empty Header, something has gone wrong" - msgstr "Получен пустой заголовок, что-то не так" + msgstr "Um cabeçalho vazio foi obtido, algo deu errado" --#: ../rpmUtils/oldUtils.py:253 ../rpmUtils/oldUtils.py:260 --#: ../rpmUtils/oldUtils.py:263 ../rpmUtils/oldUtils.py:266 -+#: ../rpmUtils/oldUtils.py:253 -+#: ../rpmUtils/oldUtils.py:260 -+#: ../rpmUtils/oldUtils.py:263 -+#: ../rpmUtils/oldUtils.py:266 +-#: ../rpmUtils/oldUtils.py:253 +-#: ../rpmUtils/oldUtils.py:260 +-#: ../rpmUtils/oldUtils.py:263 +-#: ../rpmUtils/oldUtils.py:266 ++#: ../rpmUtils/oldUtils.py:253 ../rpmUtils/oldUtils.py:260 ++#: ../rpmUtils/oldUtils.py:263 ../rpmUtils/oldUtils.py:266 #, python-format msgid "Damaged Header %s" --msgstr "Повреждённый заголовок %s" -+msgstr "Поврежденный заголовок %s" - - #: ../rpmUtils/oldUtils.py:281 - #, python-format + msgstr "Cabeçalho %s danificado" +@@ -2594,21 +2740,44 @@ msgstr "Cabeçalho %s danificado" msgid "Error opening rpm %s - error %s" --msgstr "Невозможно открыть пакет %s - ошибка %s" -+msgstr "Невозможно открыть пакет %s — ошибка %s" - --#, fuzzy - #~ msgid "Parsing package install arguments" - #~ msgstr "Ошибка при разборе параметров командной строки: %s" + msgstr "Erro ao abrir o rpm %s - erro %s" --#, fuzzy ++#~ msgid "Finished Transaction Test" ++#~ msgstr "Teste de transação finalizado" ++ ++#~ msgid "" ++#~ " You could try running: package-cleanup --problems\n" ++#~ " package-cleanup --dupes\n" ++#~ " rpm -Va --nofiles --nodigest" ++#~ msgstr "" ++#~ " Você pode tentar executar: package-cleanup --problems\n" ++#~ " package-cleanup --dupes\n" ++#~ " rpm -Va --nofiles --nodigest" ++ ++#~ msgid "Unresolvable requirement %s for %s" ++#~ msgstr "Requerimento %s insolúvel para o %s" ++ ++#~ msgid "Missing Dependency: %s is needed by package %s" ++#~ msgstr "Dependência faltando: %s é requerido pelo pacote %s" ++ + #~ msgid "" + #~ "getInstalledPackageObject() will go away, use self.rpmdb.searchPkgTuple" + #~ "().\n" + #~ msgstr "" + #~ "getInstalledPackageObject() será deixada de lado, use a self.rpmdb." + #~ "searchPkgTuple().\n" ++ + #~ msgid "Command" + #~ msgstr "Comando" ++ + #~ msgid "Created" + #~ msgstr "Criado" ++ + #~ msgid "Summary" + #~ msgstr "Resumo" ++ + #~ msgid "Matching packages for package list to user args" + #~ msgstr "" + #~ "Resultado dos pacotes para a lista de pacotes dos argumentos do usuário" ++ + #~ msgid "" + #~ "\n" + #~ "Transaction Summary\n" +@@ -2623,67 +2792,94 @@ msgstr "Erro ao abrir o rpm %s - erro %s" + #~ "Instalar %5.5s pacote(s) \n" + #~ "Atualizar %5.5s pacote(s) \n" + #~ "Remover %5.5s pacote(s) \n" ++ + #~ msgid "excluding for cost: %s from %s" + #~ msgstr "excluindo para custo: %s a partir de %s" ++ + #~ msgid "Excluding Packages in global exclude list" + #~ msgstr "Excluindo pacotes na lista global de excluídos" ++ + #~ msgid "Excluding Packages from %s" + #~ msgstr "Excluindo pacotes de %s" ++ #~ msgid "Reducing %s to included packages only" - #~ msgstr "Поиск устаревших пакетов" - --#, fuzzy + #~ msgstr "Reduzindo %s apenas aos pacotes inclusos" ++ #~ msgid "Keeping included package %s" - #~ msgstr "Поиск обновленных пакетов" - --#, fuzzy + #~ msgstr "Mantendo o pacote incluso %s" ++ #~ msgid "Removing unmatched package %s" - #~ msgstr "Поиск обновленных пакетов" - --#, fuzzy + #~ msgstr "Removendo pacote não encontrado %s" ++ + #~ msgid "Finished" + #~ msgstr "Concluído" ++ + #~ msgid "Invalid versioned dependency string, try quoting it." + #~ msgstr "String de dependência versionada inválida, tente citá-la." ++ + #~ msgid "Entering rpm code" + #~ msgstr "Entrando no código rpm" ++ + #~ msgid "Leaving rpm code" + #~ msgstr "Saindo do código rpm" ++ + #~ msgid "Parsing package install arguments" + #~ msgstr "Analisando argumentos da instalação de pacotes" ++ + #~ msgid "" + #~ "Failure finding best provider of %s for %s, exceeded maximum loop length" + #~ msgstr "" + #~ "Falha ao encontrar o melhor fornecedor de %s para %s, tamanho máximo do " + #~ "loop excedido" ++ + #~ msgid "Comparing best: %s to po: %s" + #~ msgstr "Comparando melhor: %s para po: %s" ++ + #~ msgid "Same: best %s == po: %s" + #~ msgstr "Igual: melhor %s == po: %s" ++ + #~ msgid "po %s obsoletes best: %s" + #~ msgstr "po %s torna melhor obsoleto: %s" ++ + #~ msgid "po %s shares a sourcerpm with %s" + #~ msgstr "po %s compartilha um sourcerpm com %s" ++ + #~ msgid "best %s shares a sourcerpm with %s" + #~ msgstr "melhor %s compartilha um sourcerpm com %s" ++ + #~ msgid "po %s shares more of the name prefix with %s" + #~ msgstr "po %s compartilha mais do prefixo do nome com %s" ++ + #~ msgid "po %s has a shorter name than best %s" + #~ msgstr "po %s tem um nome mais curto do que o melhor %s" ++ + #~ msgid "bestpkg %s shares more of the name prefix with %s" + #~ msgstr "bestpkg %s compartilha mais do prefixo do nome com %s" ++ + #~ msgid "Looking for Obsoletes for %s" + #~ msgstr "Localizando Obsoletos para %s" ++ + #~ msgid "unable to find newer package for %s" + #~ msgstr "não foi possível encontrar um pacote mais recente para o %s" ++ + #~ msgid "TSINFO: Updating %s to resolve conflict." + #~ msgstr "TSINFO: Atualizando o %s para resolver o conflito." +-#~ msgid "%s conflicts with %s" +-#~ msgstr "%s conflita com %s" ++ #~ msgid "Package %s conflicts with %s." - #~ msgstr "зависимости: пакет %s конфликтует с %s" - --#, fuzzy + #~ msgstr "O pacote %s conflita com %s." ++ + #~ msgid "Running \"%s\" handler for \"%s\" plugin" + #~ msgstr "Executando o manipulador \"%s\" para o plugin \"%s\"" ++ + #~ msgid "Directory of rpms must exist" + #~ msgstr "O diretório de rpms precisa existir" ++ + #~ msgid "Error accessing URL: %s" + #~ msgstr "Erro ao acessar a URL: %s" ++ + #~ msgid "No Packages installed not included in a repository" + #~ msgstr "Nenhum pacote instalado não incluído em um repositório" ++ #~ msgid "" - #~ "Description:\n" - #~ "%s" -@@ -2780,8 +2832,7 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - #~ " SRC: %d" - + #~ "\n" + #~ " Total: %d\n" +@@ -2694,10 +2890,13 @@ msgstr "Erro ao abrir o rpm %s - erro %s" + #~ " Total: %d\n" + #~ " Usado: %d\n" + #~ " Src: %d" ++ #~ msgid "Error restoring the backup of lilo.conf The backup was:\n" --#~ msgstr "" --#~ "Ошибка восстановления резервной копии lilo.conf. Резервная копия была:\n" -+#~ msgstr "Ошибка восстановления резервной копии lilo.conf. Резервная копия была:\n" - + #~ msgstr "Erro ao restaurar o backup do lilo.conf. O backup era:\n" ++ #~ msgid "Looking in available packages for a providing package" - #~ msgstr "Просмотр доступных пакетов предоставляющих пакет" -@@ -2795,12 +2846,8 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" + #~ msgstr "Procurando pelo pacote fornecido nos pacotes disponíveis" ++ + #~ msgid "" + #~ "retrygrab() failed for:\n" + #~ " %s%s\n" +@@ -2706,12 +2905,16 @@ msgstr "Erro ao abrir o rpm %s - erro %s" + #~ "retrygrab() falhou para:\n" + #~ " %s%s\n" + #~ " Executando método de recuperação" ++ + #~ msgid "I will install/upgrade these to satisfy the dependencies:" + #~ msgstr "Eu irei instalar/atualizar isto para satisfazer as dependências:" ++ + #~ msgid "Cannot delete %s - check perms" + #~ msgstr "Não foi possível remover %s - verifique as permissões" ++ #~ msgid "Need a provides to match" - #~ msgstr "Необходим еще один параметр" - --#~ msgid "" --#~ "lilo options that are not supported by yum are used in the default lilo." --#~ "conf. This file will not be modified. The options include:\n" --#~ msgstr "" --#~ "параметры lilo не поддерживаются yum. Будет использованы параметры из " --#~ "lilo.conf. Файл lilo.conf останется неизмеренным. Параметры включают:\n" -+#~ msgid "lilo options that are not supported by yum are used in the default lilo.conf. This file will not be modified. The options include:\n" -+#~ msgstr "параметры lilo не поддерживаются yum. Будет использованы параметры из lilo.conf. Файл lilo.conf останется неизмеренным. Параметры включают:\n" - + #~ msgstr "É necessário fornecer uma informação para corresponder" ++ + #~ msgid "" + #~ "lilo options that are not supported by yum are used in the default lilo." + #~ "conf. This file will not be modified. The options include:\n" +@@ -2719,10 +2922,13 @@ msgstr "Erro ao abrir o rpm %s - erro %s" + #~ "opções do lilo que não são suportadas pelo yum estão sendo utilizadas no " + #~ "arquivo lilo.conf padrão. Este arquivo não será modificado. Dentre as " + #~ "opções estão:\n" ++ #~ msgid "Error getting file %s" - #~ msgstr "Ошибка получения файла: %s" -@@ -2853,8 +2900,7 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" + #~ msgstr "Erro ao obter arquivo %s" ++ + #~ msgid "%s is not writable" + #~ msgstr "%s não é gravável" ++ + #~ msgid "" + #~ "\n" + #~ "Already found tuple: %s %s:\n" +@@ -2731,86 +2937,117 @@ msgstr "Erro ao abrir o rpm %s - erro %s" + #~ "\n" + #~ "Tupla já encontrada: %s %s:\n" + #~ "%s " ++ + #~ msgid "errors found" + #~ msgstr "erros encontrados" ++ + #~ msgid "Unable to determine boot loader." + #~ msgstr "Não foi possível determinar o gerenciador de inicialização." ++ + #~ msgid "getting %s" + #~ msgstr "obtendo %s" ++ + #~ msgid "Error Reading Header on %s" + #~ msgstr "Erro ao Ler Cabeçalho em %s" ++ + #~ msgid "Error accessing File: %s" + #~ msgstr "Erro ao acessar arquivo: %s" ++ + #~ msgid "You're not root, we can't install things" + #~ msgstr "Você não é root, nós não podemos instalar coisas" ++ + #~ msgid "Cannot find any conf file." + #~ msgstr "Não foi possível encontrar um arquivo de configuração." ++ + #~ msgid "Local file does not exist: %s" + #~ msgstr "O arquivo local não existe: %s" ++ + #~ msgid "using ftp, http[s], or file for servers, Aborting - %s" + #~ msgstr "usando ftp, http[s] ou arquivos para servidores. Abortando - %s" ++ + #~ msgid "Found %s." + #~ msgstr "%s encontrado." ++ + #~ msgid "Transaction(s) Complete" + #~ msgstr "Transação Completa" ++ + #~ msgid "IOError: %s" + #~ msgstr "IOError (Erro E/S): %s" ++ #~ msgid "Cleaning packages and old headers" - #~ msgstr "Удаление пакетов и старых заголовков" - --#~ msgid "" --#~ "Cannot download %s in caching only mode or when running as non-root user." -+#~ msgid "Cannot download %s in caching only mode or when running as non-root user." - #~ msgstr "Невозможно получить %s используя кэш или не от пользователя root." - + #~ msgstr "Limpando pacotes e cabeçalhos antigos" ++ + #~ msgid "" + #~ "Cannot download %s in caching only mode or when running as non-root user." + #~ msgstr "" + #~ "Não é possível baixar %s no modo \"somente cache\" ou quando estiver " + #~ "executando com um usuário não root." ++ + #~ msgid "" + #~ "Error: You may want to run yum clean or remove the file: \n" + #~ " %s" + #~ msgstr "" + #~ "Erro: Você pode querer executar a limpeza do yum ou remover o arquivo: \n" + #~ " %s" ++ + #~ msgid "Error reading lilo.conf: The messages was:\n" + #~ msgstr "Erro ao ler o lilo.conf: A mensagem foi:\n" ++ + #~ msgid "No groups provided or accessible on any server." + #~ msgstr "Nenhum grupo fornecido ou acessível em nenhum servidor." ++ + #~ msgid "%s results returned" + #~ msgstr "%s resultados retornados" ++ + #~ msgid "Error moving %s to %s, fatal" + #~ msgstr "Erro ao mover %s para %s, fatal" ++ + #~ msgid "" + #~ "\n" + #~ "ignoring bad rpm: %s" + #~ msgstr "" + #~ "\n" + #~ "ignorando rpm defeituoso: %s" ++ + #~ msgid "[erase: %s]" + #~ msgstr "[remover: %s]" ++ + #~ msgid "%s is not a dir" + #~ msgstr "%s não é um diretório" ++ + #~ msgid "Best version for %s is %s:%s-%s" + #~ msgstr "A melhor versão para %s é %s:%s-%s" ++ + #~ msgid "[deps: %s]" + #~ msgstr "[deps: %s]" ++ + #~ msgid "" + #~ "\n" + #~ "ignoring srpm: %s" + #~ msgstr "" + #~ "\n" + #~ "ignorando srpm: %s" ++ + #~ msgid "Checking deps %d/%d complete" + #~ msgstr "Checando dependências, %d/%d completo" ++ + #~ msgid "" + #~ "Errors within the dir(s):\n" + #~ " %s" + #~ msgstr "" + #~ "Erro dentro do(s) diretório(s):\n" + #~ " %s" ++ + #~ msgid "Please run yum in non-caching mode to correct this header." + #~ msgstr "" + #~ "Por favor, execute o yum no modo sem cache para corrigir este cabeçalho." ++ + #~ msgid "Error installing lilo.conf The message was:\n" + #~ msgstr "Erro ao instalar o lilo.conf. A mensagem foi:\n" ++ + #~ msgid "Error: Untrusted GPG key on %s" + #~ msgstr "Erro: Chave GPG não confiável em %s" ++ #~ msgid "" -@@ -2961,18 +3007,14 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" + #~ "\n" + #~ "\n" +@@ -2821,50 +3058,66 @@ msgstr "Erro ao abrir o rpm %s - erro %s" + #~ "\n" + #~ "Problema com a assinatura gpg ou com o md5sum em %s\n" + #~ "\n" ++ + #~ msgid "No Packages Available for Update or Install" + #~ msgstr "Nenhum Pacote Disponível para Atualização ou Instalação" ++ + #~ msgid "Found best arch for install only pkg %s" + #~ msgstr "Encontre a melhor arquitetura para instalar apenas o pacote %s" ++ + #~ msgid "I will do the following:" + #~ msgstr "Eu farei o seguinte:" ++ + #~ msgid "Bad URL: %s" + #~ msgstr "URL Inválida: %s" ++ + #~ msgid "NonMatching RPM version, %s, removing." + #~ msgstr "Versão do RPM não coincide, %s, removendo." ++ + #~ msgid "I will erase these to satisfy the dependencies:" + #~ msgstr "Eu irei apagar isto para satisfazer as dependências:" ++ + #~ msgid "HTTP Error (%s): %s" + #~ msgstr "Erro HTTP (%s): %s" ++ + #~ msgid "Please ask your sysadmin to update the headers on this system." + #~ msgstr "" + #~ "Por favor, peça ao administrador do seu sistema para atualizar os " + #~ "cabeçalhos." ++ #~ msgid "Putting back old headers" - #~ msgstr "Возврат старых заголовков" - --#~ msgid "" --#~ "Error: You may need to disable gpg checking to install this package\n" --#~ msgstr "" --#~ "Ошибка: Возможно необходимо отключить проверку GPG для установки пакета\n" -+#~ msgid "Error: You may need to disable gpg checking to install this package\n" -+#~ msgstr "Ошибка: Возможно необходимо отключить проверку GPG для установки пакета\n" - + #~ msgstr "Recolocando cabeçalhos antigos" +-#~ msgid "CacheDir: %s" +-#~ msgstr "CacheDir (diretório de cache): %s" ++ + #~ msgid "Completing update for %s - %d/%d" + #~ msgstr "Completando atualização para %s - %d/%d" ++ + #~ msgid "" + #~ "Error: You may need to disable gpg checking to install this package\n" + #~ msgstr "" + #~ "Erro: Talvez seja necessário desabilitar a verificação gpg para instalar " + #~ "este pacote\n" ++ #~ msgid "Options Error: no commands found" - #~ msgstr "Ошибка опций: команда не найдена" - - #~ msgid "You appear to have insufficient disk space to handle these packages" --#~ msgstr "" --#~ "Не найдено достаточно дискового пространства для выполнения действий над " --#~ "пакетами" -+#~ msgstr "Не найдено достаточно дискового пространства для выполнения действий над пакетами" - + #~ msgstr "Erro nas opções: nenhum comando encontrado" ++ #~ msgid "Unable to run grubby correctly: the message was:\n" - #~ msgstr "Hевозможно запустить grubby:\n" -@@ -2993,20 +3035,15 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - #~ msgstr "Необходимо указать список пакетов для установки" - - #~ msgid "using ftp, http[s], removable or file for servers, Aborting - %s" --#~ msgstr "" --#~ "Используйте только протоколы ftp, http[s], removable или file. Завершение " --#~ "работы - %s" -+#~ msgstr "Используйте только протоколы ftp, http[s], removable или file. Завершение работы - %s" - + #~ msgstr "Não foi possível executar o grubby corretamente: a mensagem foi:\n" ++ + #~ msgid "IOError - # %s - %s" + #~ msgstr "IOError (Erro E/S) - # %s - %s" ++ + #~ msgid "Kernel Updated/Installed, checking for bootloader" + #~ msgstr "" + #~ "Kernel atualizado/instalado, verificando gerenciador de inicialização" ++ + #~ msgid "Need to pass a list of pkgs to install" + #~ msgstr "É necessário passar uma lista de pacotes para instalar" ++ #~ msgid "Insufficient server config - no servers found. Aborting." --#~ msgstr "" --#~ "Не найден файл настроек сервера - репозиторий не найден. Завершение." -+#~ msgstr "Не найден файл настроек сервера - репозиторий не найден. Завершение." - + #~ msgstr "" + #~ "Configuração de servidor insuficiente - nenhum servidor encontrado. " + #~ "Abortando." ++ #~ msgid "" #~ "\n" --#~ " Usage: yum [options] \n" - #~ " \n" - #~ " Options:\n" -@@ -3015,8 +3052,7 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - #~ " -d [debug level] - set the debugging level\n" - #~ " -y answer yes to all questions\n" - #~ " -t be tolerant about errors in package commands\n" --#~ " -R [time in minutes] - set the max amount of time to randomly " --#~ "run in.\n" -+#~ " -R [time in minutes] - set the max amount of time to randomly run in.\n" - #~ " -C run from cache only - do not update the cache\n" - #~ " --installroot=[path] - set the install root (default '/')\n" - #~ " --version - output the version of yum\n" -@@ -3024,10 +3060,8 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" + #~ " Usage: yum [options] \n" - #~ " \n" - #~ " Options:\n" -@@ -3038,8 +3072,7 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - #~ " -t пропускать ошибки при установке пакетов\n" - #~ " -R [time in minutes] - установить время случайной задержки\n" - #~ " -C работать только с кэшем, не обновляя его\n" --#~ " --installroot=[path] - установить install root (по умолчанию " --#~ "'/')\n" -+#~ " --installroot=[path] - установить install root (по умолчанию '/')\n" - #~ " --version - показать версию yum\n" - #~ " -h, --help - показать это сообщение\n" - #~ " " -@@ -3076,8 +3109,7 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - #~ msgstr "Ошибка установки нового загрузчика: \n" - + #~ "Nenhum gerenciador de inicialização encontrado. Não é possível configurar " + #~ "o kernel, continuando." ++ + #~ msgid "Attempt to delete a missing file %s - ignoring." + #~ msgstr "Tentativa de remover um arquivo faltando %s - ignorando." ++ + #~ msgid "Getting %s" + #~ msgstr "Obtendo %s" ++ + #~ msgid "" + #~ "\n" + #~ "Writing header.info file" + #~ msgstr "" + #~ "\n" + #~ "Gravando arquivo header.info" ++ + #~ msgid "Gathering header information file(s) from server(s)" + #~ msgstr "" + #~ "Coletando arquivo(s) de informações de cabeçalhos a partir do(s) servidor" + #~ "(es)" ++ + #~ msgid "Using cached header.info file" + #~ msgstr "Utilizando arquivo header.info do cache" ++ + #~ msgid "localrpmdb not defined" + #~ msgstr "localrpmdb não definido" ++ + #~ msgid "Error installing the new bootloader: \n" + #~ msgstr "Erro ao instalar o novo gerenciador de inicialização: \n" ++ #~ msgid "Error: Could not find the GPG Key necessary to validate pkg %s" --#~ msgstr "" --#~ "Ошибка: Невозможно найти GPG ключ необходимый для проверки пакета %s" -+#~ msgstr "Ошибка: Невозможно найти GPG ключ необходимый для проверки пакета %s" - + #~ msgstr "" + #~ "Erro: Não foi possível localizar a Chave GPG necessária para validar o " + #~ "pacote %s" ++ #~ msgid "No actions to take" - #~ msgstr "Hикаких действий не нужно" -@@ -3098,8 +3130,7 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" + #~ msgstr "Nenhuma ação a ser tomada" ++ + #~ msgid "" + #~ "Available package: %s.%s %s:%s-%s from %s matches with\n" + #~ " %s" + #~ msgstr "" + #~ "Pacote disponível: %s.%s %s:%s-%s de %s resultados com\n" + #~ " %s" ++ + #~ msgid " " #~ msgstr " " - ++ #~ msgid "Error: Cannot find baseurl or name for server '%s'. Skipping" --#~ msgstr "" --#~ "Ошибка: Невозможно определить URL или имя для сервера '%s'. Пропущено" -+#~ msgstr "Ошибка: Невозможно определить URL или имя для сервера '%s'. Пропущено" - + #~ msgstr "" + #~ "Erro: Não foi possível localizar a baseurl ou o nome do servidor \"%s\". " + #~ "Ignorando." ++ #~ msgid "Odd header %s suddenly disappeared" - #~ msgstr "Непарный заголовок %s внезапно исчез" -@@ -3122,12 +3153,8 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" + #~ msgstr "Cabeçalho indefinido %s desapareceu repentinamente" ++ + #~ msgid "All dependencies resolved and no conflicts detected" + #~ msgstr "Todas as dependências resolvidas e nenhum conflito detectado" ++ + #~ msgid "using cached groups from server: %s" + #~ msgstr "usando grupos em cache a partir do servidor: %s" ++ #~ msgid "Exiting." - #~ msgstr "Завершение." - --#~ msgid "" --#~ "asking for package %s.%s - does not exist in nevral - bailing out - check " --#~ "rpmdb for errors" --#~ msgstr "" --#~ "Запрос на пакет %s.%s - не существует в nevral - выкинут - проверьте " --#~ "ошибки в rpmdb" -+#~ msgid "asking for package %s.%s - does not exist in nevral - bailing out - check rpmdb for errors" -+#~ msgstr "Запрос на пакет %s.%s - не существует в nevral - выкинут - проверьте ошибки в rpmdb" - - #~ msgid "Lilo found - adding kernel to lilo and making it the default" - #~ msgstr "Найден Lilo - новое ядро будет загружено по умолчанию" -@@ -3146,8 +3173,7 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - + #~ msgstr "Saindo." ++ #~ msgid "" - #~ "Usage:\n" --#~ "yum-arch [-v] [-z] [-l] [-c] [-n] [-d] [-q] [-vv] (path of dir where " --#~ "headers/ should/does live)\n" -+#~ "yum-arch [-v] [-z] [-l] [-c] [-n] [-d] [-q] [-vv] (path of dir where headers/ should/does live)\n" - #~ " -d = check dependencies and conflicts in tree\n" - #~ " -v = more verbose output\n" - #~ " -vv = even more verbose output\n" -@@ -3164,10 +3190,8 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - #~ " -v = выводить отладочную информацию\n" - #~ " -vv = еще больше отладочной информации\n" - #~ " -n = не создавать заголовков\n" --#~ " -c = проверять пакеты с помощью gpg и md5 - невозможно " --#~ "использовать с -n\n" --#~ " -z = сжимать заголовки с помощью алгоритма gzip [по умолчанию " --#~ "включено]\n" -+#~ " -c = проверять пакеты с помощью gpg и md5 - невозможно использовать с -n\n" -+#~ " -z = сжимать заголовки с помощью алгоритма gzip [по умолчанию включено]\n" - #~ " -s = создавать заголовки для src пакетов\n" - #~ " -l = разрешить использование символических ссылок\n" - #~ " -q = \"молчаливый\" режим" -@@ -3211,14 +3235,11 @@ msgstr "Невозможно открыть пакет %s - ошибка %s" - #~ msgid "Damaged RPM %s, removing." - #~ msgstr "Поврежденный пакет %s, удаление." - --#~ msgid "" --#~ "Bad Header for pkg %s.%s trying to get headers for the nevral - exiting" -+#~ msgid "Bad Header for pkg %s.%s trying to get headers for the nevral - exiting" - #~ msgstr "Поврежден заголовок пакет %s.%s завершает работу" - --#~ msgid "" --#~ "Error: You may also check that you have the correct GPG keys installed" --#~ msgstr "" --#~ "Ошибка: Необходимо убедиться в том что вы имеете подходящий gpg ключ" -+#~ msgid "Error: You may also check that you have the correct GPG keys installed" -+#~ msgstr "Ошибка: Необходимо убедиться в том что вы имеете подходящий gpg ключ" - - #~ msgid "Insert disk \"%s\" and press enter\n" - #~ msgstr "Вставьте диск \"%s\" и нажмите 'Enter'\n" -diff --git a/po/sv.po b/po/sv.po -index 59a2df1..48b836b 100644 ---- a/po/sv.po -+++ b/po/sv.po -@@ -1,49 +1,50 @@ - # Swedish messages for yum --# Copyright © 2009 Free Software Foundation -+# Copyright © 2009-2010 Free Software Foundation - # This file is distributed under the same license as the yum package. --# Göran Uddeborg , 2009. -+# Göran Uddeborg , 2009-2010. - # --# $Id: yum-HEAD.patch,v 1.58 2010/06/02 17:19:32 skvidal Exp $ -+# $Id: yum-HEAD.patch,v 1.58 2010/06/02 17:19:32 skvidal Exp $ - # - msgid "" - msgstr "" - "Project-Id-Version: yum\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2009-10-15 15:45+0200\n" --"PO-Revision-Date: 2009-09-05 16:56+0200\n" -+"POT-Creation-Date: 2010-02-11 10:54-0500\n" -+"PO-Revision-Date: 2010-05-22 00:30+0200\n" - "Last-Translator: Göran Uddeborg \n" - "Language-Team: Swedish \n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - --#: ../callback.py:48 ../output.py:940 ../yum/rpmtrans.py:71 -+#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 - msgid "Updating" - msgstr "Uppdaterar" - --#: ../callback.py:49 ../yum/rpmtrans.py:72 -+#: ../callback.py:49 ../yum/rpmtrans.py:73 - msgid "Erasing" - msgstr "Raderar" - --#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:939 --#: ../yum/rpmtrans.py:73 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:76 -+#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 -+#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 -+#: ../yum/rpmtrans.py:77 - msgid "Installing" - msgstr "Installerar" - --#: ../callback.py:52 ../callback.py:58 ../yum/rpmtrans.py:75 -+#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 - msgid "Obsoleted" --msgstr "Låter utgå" -+msgstr "Utfasad" - --#: ../callback.py:54 ../output.py:1063 ../output.py:1403 -+#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 - msgid "Updated" - msgstr "Uppdaterade" - --#: ../callback.py:55 ../output.py:1399 -+#: ../callback.py:55 ../output.py:1438 - msgid "Erased" - msgstr "Raderade" - --#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1061 --#: ../output.py:1395 -+#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 -+#: ../output.py:1434 ../output.py:1646 - msgid "Installed" - msgstr "Installerade" - -@@ -65,68 +66,73 @@ msgstr "Fel: ogiltig utdatatillstånd: %s för %s" - msgid "Erased: %s" - msgstr "Raderade: %s" - --#: ../callback.py:217 ../output.py:941 -+#: ../callback.py:217 ../output.py:948 ../output.py:1648 - msgid "Removing" - msgstr "Tar bort" - --#: ../callback.py:219 ../yum/rpmtrans.py:77 -+#: ../callback.py:219 ../yum/rpmtrans.py:78 - msgid "Cleanup" - msgstr "Rensar upp" - --#: ../cli.py:106 -+#: ../cli.py:107 - #, python-format - msgid "Command \"%s\" already defined" - msgstr "Kommando \"%s\" redan definierat" - --#: ../cli.py:118 -+#: ../cli.py:119 - msgid "Setting up repositories" - msgstr "Gör i ordning förråd" - --#: ../cli.py:129 -+#: ../cli.py:130 - msgid "Reading repository metadata in from local files" - msgstr "Läser in förrådsmetadata från lokala filer" - --#: ../cli.py:192 ../utils.py:107 -+#: ../cli.py:194 ../utils.py:193 - #, python-format - msgid "Config Error: %s" - msgstr "Konfigurationsfel: %s" - --#: ../cli.py:195 ../cli.py:1251 ../utils.py:110 -+#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 - #, python-format - msgid "Options Error: %s" - msgstr "Fel bland flaggor: %s" - --#: ../cli.py:223 -+#: ../cli.py:227 - #, python-format - msgid " Installed: %s-%s at %s" - msgstr " Installerade: %s-%s %s" - --#: ../cli.py:225 -+#: ../cli.py:229 - #, python-format - msgid " Built : %s at %s" - msgstr " Byggde : %s %s" - --#: ../cli.py:227 -+#: ../cli.py:231 - #, python-format - msgid " Committed: %s at %s" - msgstr " Verkställde : %s %s" - --#: ../cli.py:266 -+#: ../cli.py:270 - msgid "You need to give some command" - msgstr "Du måste ange något kommando" - --#: ../cli.py:309 -+#: ../cli.py:284 -+#, python-format -+msgid "No such command: %s. Please use %s --help" -+msgstr "Inget sådant kommando: %s. Använd %s --help" + #~ "asking for package %s.%s - does not exist in nevral - bailing out - check " + #~ "rpmdb for errors" + #~ msgstr "" + #~ "perguntando pelo pacote %s.%s - não existe no nevral - saindo " + #~ "abruptamente - verifique por erros no rpmdb" + -+#: ../cli.py:314 - msgid "Disk Requirements:\n" - msgstr "Diskbehov:\n" - --#: ../cli.py:311 -+#: ../cli.py:316 - #, python-format --msgid " At least %dMB needed on the %s filesystem.\n" --msgstr " Åtminstone %d MB behövs på filsystemet %s.\n" -+msgid " At least %dMB more space needed on the %s filesystem.\n" -+msgstr " Åtminstone %d MB mer utrymme behövs på filsystemet %s.\n" - - #. TODO: simplify the dependency errors? - #. Fixup the summary --#: ../cli.py:316 -+#: ../cli.py:321 - msgid "" - "Error Summary\n" - "-------------\n" -@@ -134,64 +140,60 @@ msgstr "" - "Felsammandrag\n" - "-------------\n" - --#: ../cli.py:359 -+#: ../cli.py:364 - msgid "Trying to run the transaction but nothing to do. Exiting." - msgstr "Försöker köra transaktionen men det finns inget att göra. Avslutar." - --#: ../cli.py:395 -+#: ../cli.py:403 - msgid "Exiting on user Command" - msgstr "Avslutar på användarens order" - --#: ../cli.py:399 -+#: ../cli.py:407 - msgid "Downloading Packages:" - msgstr "Hämtar paket:" - --#: ../cli.py:404 -+#: ../cli.py:412 - msgid "Error Downloading Packages:\n" - msgstr "Fel när paket hämtades:\n" - --#: ../cli.py:418 ../yum/__init__.py:4014 -+#: ../cli.py:426 ../yum/__init__.py:4195 - msgid "Running rpm_check_debug" - msgstr "Kör rpm_check_debug" - --#: ../cli.py:427 ../yum/__init__.py:4023 -+#: ../cli.py:435 ../yum/__init__.py:4204 - msgid "ERROR You need to update rpm to handle:" - msgstr "FEL Du behöver uppdatera rpm för att hantera:" - --#: ../cli.py:429 ../yum/__init__.py:4026 -+#: ../cli.py:437 ../yum/__init__.py:4207 - msgid "ERROR with rpm_check_debug vs depsolve:" - msgstr "FEL med rpm_check_debug mot depsolve:" - --#: ../cli.py:435 -+#: ../cli.py:443 - msgid "RPM needs to be updated" - msgstr "RPM behöver uppdateras" - --#: ../cli.py:436 -+#: ../cli.py:444 - #, python-format - msgid "Please report this error in %s" - msgstr "Vänligen rapportera detta fel i %s" - --#: ../cli.py:442 -+#: ../cli.py:450 - msgid "Running Transaction Test" - msgstr "Kör transaktionstest" - --#: ../cli.py:458 --msgid "Finished Transaction Test" --msgstr "Avslutade transaktionstest" -- --#: ../cli.py:460 -+#: ../cli.py:466 - msgid "Transaction Check Error:\n" - msgstr "Transaktionskontrollfel:\n" - --#: ../cli.py:467 -+#: ../cli.py:473 - msgid "Transaction Test Succeeded" - msgstr "Transaktionskontrollen lyckades" - --#: ../cli.py:489 -+#: ../cli.py:495 - msgid "Running Transaction" - msgstr "Kör transaktionen" - --#: ../cli.py:519 -+#: ../cli.py:525 - msgid "" - "Refusing to automatically import keys when running unattended.\n" - "Use \"-y\" to override." -@@ -199,79 +201,84 @@ msgstr "" - "Vägrar att automatiskt importera nycklar vid oövervakad körning.\n" - "Använd \"-y\" för att åsidosätta." - --#: ../cli.py:538 ../cli.py:572 -+#: ../cli.py:544 ../cli.py:578 - msgid " * Maybe you meant: " - msgstr " * Du kanske menade: " - --#: ../cli.py:555 ../cli.py:563 -+#: ../cli.py:561 ../cli.py:569 - #, python-format - msgid "Package(s) %s%s%s available, but not installed." - msgstr "Paket %s%s%s tillgängliga, men inte installerade." - --#: ../cli.py:569 ../cli.py:600 ../cli.py:678 -+#: ../cli.py:575 ../cli.py:607 ../cli.py:687 - #, python-format - msgid "No package %s%s%s available." - msgstr "Inget paket %s%s%s tillgängligt." - --#: ../cli.py:605 ../cli.py:738 -+#: ../cli.py:612 ../cli.py:748 - msgid "Package(s) to install" - msgstr "Paket att installera" - --#: ../cli.py:606 ../cli.py:684 ../cli.py:717 ../cli.py:739 --#: ../yumcommands.py:159 -+#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 -+#: ../yumcommands.py:160 - msgid "Nothing to do" - msgstr "Inget att göra" - --#: ../cli.py:639 -+#: ../cli.py:647 - #, python-format - msgid "%d packages marked for Update" - msgstr "%d paket noterade att uppdateras" - --#: ../cli.py:642 -+#: ../cli.py:650 - msgid "No Packages marked for Update" - msgstr "Inga paket noterade att uppdateras" - --#: ../cli.py:656 -+#: ../cli.py:664 - #, python-format - msgid "%d packages marked for removal" - msgstr "%d paket noterade att tas bort" - --#: ../cli.py:659 -+#: ../cli.py:667 - msgid "No Packages marked for removal" - msgstr "Inga paket noterade att tas bort" - --#: ../cli.py:683 -+#: ../cli.py:692 - msgid "Package(s) to downgrade" - msgstr "Paket att nedgradera" - --#: ../cli.py:707 -+#: ../cli.py:717 - #, python-format - msgid " (from %s)" - msgstr " (från %s)" - --#: ../cli.py:709 -+#: ../cli.py:719 - #, python-format - msgid "Installed package %s%s%s%s not available." - msgstr "Installerat paket %s%s%s%s inte tillgängligt." - --#: ../cli.py:716 -+#: ../cli.py:726 - msgid "Package(s) to reinstall" - msgstr "Paket att ominstallera" - --#: ../cli.py:729 -+#: ../cli.py:739 - msgid "No Packages Provided" - msgstr "Inga paket angivna" - --#: ../cli.py:813 -+#: ../cli.py:818 -+#, python-format -+msgid "Matched: %s" -+msgstr "Matchade: %s" + #~ msgid "Errors reported doing trial run" + #~ msgstr "Erros reportados na execução experimental" + -+#: ../cli.py:825 - #, python-format - msgid "Warning: No matches found for: %s" - msgstr "Varning: Ingen matchning hittades för: %s" - --#: ../cli.py:816 -+#: ../cli.py:828 - msgid "No Matches found" - msgstr "Inga matchningar hittades" - --#: ../cli.py:855 -+#: ../cli.py:868 - #, python-format - msgid "" - "Warning: 3.0.x versions of yum would erroneously match against filenames.\n" -@@ -281,108 +288,112 @@ msgstr "" - " Du kan använda \"%s*/%s%s\" och/eller \"%s*bin/%s%s\" för att få detta " - "beteende" - --#: ../cli.py:871 -+#: ../cli.py:884 - #, python-format - msgid "No Package Found for %s" - msgstr "Inga paket hittades för %s" - --#: ../cli.py:883 -+#: ../cli.py:896 - msgid "Cleaning up Everything" - msgstr "Rensar upp allt" - --#: ../cli.py:897 -+#: ../cli.py:912 - msgid "Cleaning up Headers" - msgstr "Rensar upp huvuden" - --#: ../cli.py:900 -+#: ../cli.py:915 - msgid "Cleaning up Packages" - msgstr "Rensar upp paket" - --#: ../cli.py:903 -+#: ../cli.py:918 - msgid "Cleaning up xml metadata" - msgstr "Rensar upp xml-metadata" - --#: ../cli.py:906 -+#: ../cli.py:921 - msgid "Cleaning up database cache" - msgstr "Rensar upp databas-cache" - --#: ../cli.py:909 -+#: ../cli.py:924 - msgid "Cleaning up expire-cache metadata" - msgstr "Rensar upp expire-cache-metadata" - --#: ../cli.py:912 -+#: ../cli.py:927 -+msgid "Cleaning up cached rpmdb data" -+msgstr "Rensar upp cachad rpmdb-data" + #~ msgid "Lilo found - adding kernel to lilo and making it the default" + #~ msgstr "Lilo encontrado - adicionando o kernel ao lilo e tornando-o padrão" ++ + #~ msgid "[update: %s]" + #~ msgstr "[atualizar: %s]" ++ + #~ msgid "ERROR: Url Return no Content-Length - something is wrong" + #~ msgstr "ERRO: A URL retornou conteúdo vazio - algo está errado" + -+#: ../cli.py:930 - msgid "Cleaning up plugins" - msgstr "Rensar upp insticksmoduler" - --#: ../cli.py:937 -+#: ../cli.py:955 - msgid "Installed Groups:" - msgstr "Installerade grupper:" - --#: ../cli.py:949 -+#: ../cli.py:967 - msgid "Available Groups:" - msgstr "Tillgängliga grupper:" - --#: ../cli.py:959 -+#: ../cli.py:977 - msgid "Done" - msgstr "Klart" - --#: ../cli.py:970 ../cli.py:988 ../cli.py:994 ../yum/__init__.py:2629 -+#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 - #, python-format - msgid "Warning: Group %s does not exist." - msgstr "Varning: Grupp %s finns inte." - --#: ../cli.py:998 -+#: ../cli.py:1016 - msgid "No packages in any requested group available to install or update" - msgstr "" - "Inget paket i någon begärd grupp är tillgängligt för installation eller " - "uppdatering" - --#: ../cli.py:1000 -+#: ../cli.py:1018 - #, python-format - msgid "%d Package(s) to Install" - msgstr "%d paket att installera" - --#: ../cli.py:1010 ../yum/__init__.py:2641 -+#: ../cli.py:1028 ../yum/__init__.py:2800 - #, python-format - msgid "No group named %s exists" - msgstr "Ingen grupp med namnet %s finns" - --#: ../cli.py:1016 -+#: ../cli.py:1034 - msgid "No packages to remove from groups" - msgstr "Inget paket att ta bort från grupper" - --#: ../cli.py:1018 -+#: ../cli.py:1036 - #, python-format - msgid "%d Package(s) to remove" - msgstr "%d paket att ta bort" - --#: ../cli.py:1060 -+#: ../cli.py:1078 - #, python-format - msgid "Package %s is already installed, skipping" - msgstr "Paket %s är redan installerat, hoppar över" - --#: ../cli.py:1071 -+#: ../cli.py:1089 - #, python-format - msgid "Discarding non-comparable pkg %s.%s" - msgstr "Kastar ojämförbart paket %s.%s" - - #. we've not got any installed that match n or n+a --#: ../cli.py:1097 -+#: ../cli.py:1115 - #, python-format - msgid "No other %s installed, adding to list for potential install" - msgstr "" - "Ingen annat %s installerat, lägger till listan för potentiell installation" - --#: ../cli.py:1117 -+#: ../cli.py:1135 - msgid "Plugin Options" - msgstr "Insticksmodulsalternativ" - --#: ../cli.py:1125 -+#: ../cli.py:1143 - #, python-format - msgid "Command line error: %s" - msgstr "Kommandoradsfel: %s" - --#: ../cli.py:1138 -+#: ../cli.py:1156 - #, python-format - msgid "" - "\n" -@@ -393,106 +404,114 @@ msgstr "" - "\n" - "%s: flaggan %s behöver ett argument" - --#: ../cli.py:1191 -+#: ../cli.py:1209 - msgid "--color takes one of: auto, always, never" - msgstr "--color tar en av: auto, always, never" - --#: ../cli.py:1298 -+#: ../cli.py:1319 - msgid "show this help message and exit" - msgstr "visa detta hjälpmeddelande och avsluta" - --#: ../cli.py:1302 -+#: ../cli.py:1323 - msgid "be tolerant of errors" - msgstr "var tolerant vid fel" - --#: ../cli.py:1304 --msgid "run entirely from cache, don't update cache" --msgstr "kör helt från cache, uppdatera inte cachen" -+#: ../cli.py:1326 -+msgid "run entirely from system cache, don't update cache" -+msgstr "kör helt från systemets cache, uppdatera inte cachen" - --#: ../cli.py:1306 -+#: ../cli.py:1329 - msgid "config file location" - msgstr "konfigurationsfilens plats" - --#: ../cli.py:1308 -+#: ../cli.py:1332 - msgid "maximum command wait time" - msgstr "maximal tid att vänta på kommandon" - --#: ../cli.py:1310 -+#: ../cli.py:1334 - msgid "debugging output level" - msgstr "nivå på felsökningsutskrifter" - --#: ../cli.py:1314 -+#: ../cli.py:1338 - msgid "show duplicates, in repos, in list/search commands" - msgstr "visa dubletter, i förråd, i list-/search-kommandon" - --#: ../cli.py:1316 -+#: ../cli.py:1340 - msgid "error output level" - msgstr "nivå på felutskrifter" - --#: ../cli.py:1319 -+#: ../cli.py:1343 -+msgid "debugging output level for rpm" -+msgstr "nivå på felsökningsutskrifter för rpm" + #~ msgid "Got a file - yay" + #~ msgstr "Obteve um arquivo - yay" + -+#: ../cli.py:1346 - msgid "quiet operation" - msgstr "tyst operation" - --#: ../cli.py:1321 -+#: ../cli.py:1348 - msgid "verbose operation" - msgstr "utförlig operation" - --#: ../cli.py:1323 -+#: ../cli.py:1350 - msgid "answer yes for all questions" - msgstr "svara ja på alla frågor" - --#: ../cli.py:1325 -+#: ../cli.py:1352 - msgid "show Yum version and exit" - msgstr "visa Yum-version och avsluta" - --#: ../cli.py:1326 -+#: ../cli.py:1353 - msgid "set install root" - msgstr "ange installationsrot" - --#: ../cli.py:1330 -+#: ../cli.py:1357 - msgid "enable one or more repositories (wildcards allowed)" - msgstr "aktivera ett eller flera förråd (jokrertecken tillåts)" - --#: ../cli.py:1334 -+#: ../cli.py:1361 - msgid "disable one or more repositories (wildcards allowed)" - msgstr "inaktivera ett eller flera förråd (jokertecken tillåts)" - --#: ../cli.py:1337 -+#: ../cli.py:1364 - msgid "exclude package(s) by name or glob" - msgstr "uteslut paket via namn eller mönster" - --#: ../cli.py:1339 -+#: ../cli.py:1366 - msgid "disable exclude from main, for a repo or for everything" - msgstr "inaktivera uteslutningar från main, för ett förråd, eller för allt" - --#: ../cli.py:1342 -+#: ../cli.py:1369 - msgid "enable obsoletes processing during updates" - msgstr "aktivera bearbetning av utfasningar under uppdateringar" - --#: ../cli.py:1344 -+#: ../cli.py:1371 - msgid "disable Yum plugins" - msgstr "inaktivera Yum-insticksmoduler" - --#: ../cli.py:1346 -+#: ../cli.py:1373 - msgid "disable gpg signature checking" - msgstr "inaktivera kontroll av gpg-signatur" - --#: ../cli.py:1348 -+#: ../cli.py:1375 - msgid "disable plugins by name" - msgstr "inaktivera insticksmoduler efter namn" - --#: ../cli.py:1351 -+#: ../cli.py:1378 - msgid "enable plugins by name" - msgstr "aktivera insticksmoduler efter namn" - --#: ../cli.py:1354 -+#: ../cli.py:1381 - msgid "skip packages with depsolving problems" - msgstr "hoppa över paket med problem vid beroendeupplösning" - --#: ../cli.py:1356 -+#: ../cli.py:1383 - msgid "control whether color is used" - msgstr "styr om färg skall användas" - -+#: ../cli.py:1385 -+msgid "set value of $releasever in yum config and repo files" -+msgstr "sätt värdet på $releasever i yum-konfigurations- och repo-filer" + #~ msgid "From %s updating %s" + #~ msgstr "A partir de %s, atualizando %s" ++ + #~ msgid "" + #~ "Usage:\n" + #~ "yum-arch [-v] [-z] [-l] [-c] [-n] [-d] [-q] [-vv] (path of dir where " +@@ -3009,54 +3288,74 @@ msgstr "Erro ao abrir o rpm %s - erro %s" + #~ " -l = utiliza links simbólicos como rpms válidos ao compilar " + #~ "cabeçalhos\n" + #~ " -q = faz uma exibição mais discreta" ++ + #~ msgid "The file %s is damaged." + #~ msgstr "O arquivo %s está danificado." ++ + #~ msgid "Repo" + #~ msgstr "Repo" ++ + #~ msgid "No bootloader found, Cannot configure kernel." + #~ msgstr "" + #~ "Nenhum gerenciador de inicialização encontrado. Não é possível configurar " + #~ "o kernel." ++ + #~ msgid "Name" + #~ msgstr "Nome" ++ + #~ msgid "Downloading needed headers" + #~ msgstr "Baixando os cabeçalhos necessários" + - #: ../output.py:305 - msgid "Jan" - msgstr "jan" -@@ -545,105 +564,104 @@ msgstr "dec" - msgid "Trying other mirror." - msgstr "Försöker med en annan spegel." - --#: ../output.py:538 -+#: ../output.py:534 - #, python-format - msgid "Name : %s%s%s" - msgstr "Namn : %s%s%s" - --#: ../output.py:539 -+#: ../output.py:535 - #, python-format - msgid "Arch : %s" - msgstr "Arkitektur : %s" - --#: ../output.py:541 -+#: ../output.py:537 - #, python-format - msgid "Epoch : %s" - msgstr "Epok : %s" - --#: ../output.py:542 -+#: ../output.py:538 - #, python-format - msgid "Version : %s" - msgstr "Version : %s" - --#: ../output.py:543 -+#: ../output.py:539 - #, python-format - msgid "Release : %s" - msgstr "Utgåva : %s" - --#: ../output.py:544 -+#: ../output.py:540 - #, python-format - msgid "Size : %s" - msgstr "Storlek : %s" - --#: ../output.py:545 -+#: ../output.py:541 - #, python-format - msgid "Repo : %s" - msgstr "Förråd : %s" - --#: ../output.py:547 -+#: ../output.py:543 - #, python-format - msgid "From repo : %s" - msgstr "Från förråd: %s" - --#: ../output.py:549 -+#: ../output.py:545 - #, python-format - msgid "Committer : %s" - msgstr "Verkställare: %s" - --#: ../output.py:550 -+#: ../output.py:546 - #, python-format - msgid "Committime : %s" - msgstr "Verkställt : %s" - --#: ../output.py:551 -+#: ../output.py:547 - #, python-format - msgid "Buildtime : %s" - msgstr "Byggt : %s" - --#: ../output.py:553 -+#: ../output.py:549 - #, python-format - msgid "Installtime: %s" - msgstr "Installerat: %s" - --#: ../output.py:554 -+#: ../output.py:550 - msgid "Summary : " - msgstr "Sammandrag : " - --#: ../output.py:556 -+#: ../output.py:552 - #, python-format - msgid "URL : %s" - msgstr "URL : %s" - --#: ../output.py:557 --#, python-format --msgid "License : %s" --msgstr "Licens : %s" -+#: ../output.py:553 -+msgid "License : " -+msgstr "Licens : " - --#: ../output.py:558 -+#: ../output.py:554 - msgid "Description: " - msgstr "Beskrivning: " - --#: ../output.py:626 -+#: ../output.py:622 - msgid "y" - msgstr "j" - --#: ../output.py:626 -+#: ../output.py:622 - msgid "yes" - msgstr "ja" - --#: ../output.py:627 -+#: ../output.py:623 - msgid "n" - msgstr "n" - --#: ../output.py:627 -+#: ../output.py:623 - msgid "no" - msgstr "nej" - --#: ../output.py:631 -+#: ../output.py:627 - msgid "Is this ok [y/N]: " - msgstr "Är detta ok [j/N]: " - --#: ../output.py:722 -+#: ../output.py:715 - #, python-format - msgid "" - "\n" -@@ -652,150 +670,151 @@ msgstr "" - "\n" - "Grupp: %s" - --#: ../output.py:726 -+#: ../output.py:719 - #, python-format - msgid " Group-Id: %s" - msgstr " Grupp-id: %s" - --#: ../output.py:731 -+#: ../output.py:724 - #, python-format - msgid " Description: %s" - msgstr " Beskrivning: %s" - --#: ../output.py:733 -+#: ../output.py:726 - msgid " Mandatory Packages:" - msgstr " Obligatoriska paket:" - --#: ../output.py:734 -+#: ../output.py:727 - msgid " Default Packages:" - msgstr " Standardpaket:" - --#: ../output.py:735 -+#: ../output.py:728 - msgid " Optional Packages:" - msgstr " Valfria paket:" - --#: ../output.py:736 -+#: ../output.py:729 - msgid " Conditional Packages:" - msgstr " Villkorliga paket:" - --#: ../output.py:756 -+#: ../output.py:749 - #, python-format - msgid "package: %s" - msgstr "paket: %s" - --#: ../output.py:758 -+#: ../output.py:751 - msgid " No dependencies for this package" - msgstr " Inga beroenden för detta paket" + #~ msgid "Header for pkg %s not found" + #~ msgstr "O cabeçalho para o pacote %s não foi encontrado" ++ + #~ msgid "Cleaning all headers" + #~ msgstr "Limpando todos os cabeçalhos" ++ + #~ msgid "depcheck: package %s needs %s" + #~ msgstr "verificação de dependências: o pacote %s precisa do %s" ++ + #~ msgid "Error - %s cannot be found" + #~ msgstr "Erro - %s não pôde ser encontrado" ++ + #~ msgid "Erasing: %s %d/%d" + #~ msgstr "Apagando: %s %d/%d" ++ + #~ msgid "Nothing in any group to update or install" + #~ msgstr "Nada em nenhum grupo para atualizar ou instalar" ++ + #~ msgid "Grub found - making this kernel the default" + #~ msgstr "Grub encontrado - tornando este kernel o padrão" ++ + #~ msgid "Digesting rpm - %s - %d/%d" + #~ msgstr "Preparando rpm - %s - %d/%d" ++ + #~ msgid "Damaged RPM %s, removing." + #~ msgstr "RPM %s danificado, removendo." ++ + #~ msgid "" + #~ "Bad Header for pkg %s.%s trying to get headers for the nevral - exiting" + #~ msgstr "" + #~ "Cabeçalho danificado para o pacote %s.%s, tentando obter cabeçalhos para " + #~ "o nevral - saindo" ++ + #~ msgid "" + #~ "Error: You may also check that you have the correct GPG keys installed" + #~ msgstr "" + #~ "Erro: Você também pode verificar se tem as Chaves GPG corretas instaladas" ++ + #~ msgid "No rpms to work with and no header dir. Exiting." + #~ msgstr "" + #~ "Nenhum diretório de cabeçalhos e nenhum rpm para ser utilizado. Saindo." ++ + #~ msgid "ignoring bad rpm: %s" + #~ msgstr "ignorando rpm danificado: %s" ++ + #~ msgid "Directory of rpms must be a directory." + #~ msgstr "O diretório de rpms deve ser um diretório." ++ + #~ msgid "failover: out of servers to try" + #~ msgstr "recuperação: não há mais servidores para tentar" ++ + #~ msgid "Getting header.info from server" + #~ msgstr "Obtendo header.info do servidor" +- +-- +1.7.0.1 + + +From cefb56d90fdcae814be65a8c52aa55b6a7fd33eb Mon Sep 17 00:00:00 2001 +From: Tim Lauridsen +Date: Thu, 29 Apr 2010 14:53:48 +0200 +Subject: [PATCH 86] Add yum-utils version to history (rhbz #569645) + +--- + utils.py | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/utils.py b/utils.py +index e93facb..0445b88 100644 +--- a/utils.py ++++ b/utils.py +@@ -132,6 +132,10 @@ class YumUtilBase(YumBaseCli): + suppress_keyboard_interrupt_message() + logger = logging.getLogger("yum.util") + verbose_logger = logging.getLogger("yum.verbose.util") ++ # Add yum-utils version to history records. ++ if hasattr(self, 'run_with_package_names'): ++ self.run_with_package_names.add("yum-utils") ++ + + + def getOptionParser(self): +-- +1.7.0.1 + + +From c5648243705d1fcc96274eaed554a9895d52fa47 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 29 Apr 2010 12:14:32 -0400 +Subject: [PATCH 87] Add the new, 4.8.0, error class for "cannot open DB", BZ 567709 + +--- + yum/config.py | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/yum/config.py b/yum/config.py +index 1b78fcd..3610b91 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -1000,6 +1000,9 @@ def _getsysver(installroot, distroverpkg): + else: + raise Errors.YumBaseError("Error: " + str(e)) + raise Errors.YumBaseError("Error: " + str(e)) ++ except rpm.error, e: ++ # This is the "new" code for "cannot open rpmdb", 4.8.0 ish ++ raise Errors.YumBaseError("Error: " + str(e)) + # we're going to take the first one - if there is more than one of these + # then the user needs a beating + if idx.count() == 0: +-- +1.7.0.1 + + +From aa29fc5a8c80eb23023b7f09a92793fe3fcf0bd3 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 29 Apr 2010 11:55:48 -0400 +Subject: [PATCH 88] Add total removal size, when just doing removes. BZ 495595 + +--- + cli.py | 10 +++++++++- + output.py | 20 ++++++++++++++++++++ + 2 files changed, 29 insertions(+), 1 deletions(-) + +diff --git a/cli.py b/cli.py +index 2977ca8..fc91de2 100644 +--- a/cli.py ++++ b/cli.py +@@ -416,12 +416,18 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + + # Check which packages have to be downloaded + downloadpkgs = [] ++ rmpkgs = [] + stuff_to_download = False + install_only = True ++ remove_only = True + for txmbr in self.tsInfo.getMembers(): + if txmbr.ts_state not in ('i', 'u'): + install_only = False ++ po = txmbr.po ++ if po: ++ rmpkgs.append(po) + else: ++ remove_only = False + stuff_to_download = True + po = txmbr.po + if po: +@@ -434,7 +440,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): --#: ../output.py:763 -+#: ../output.py:756 - #, python-format - msgid " dependency: %s" - msgstr " beroende: %s" + # Report the total download size to the user, so he/she can base + # the answer on this info +- if stuff_to_download: ++ if not stuff_to_download: ++ self.reportRemoveSize(rmpkgs) ++ else: + self.reportDownloadSize(downloadpkgs, install_only) + + # confirm with user +diff --git a/output.py b/output.py +index 452f8a2..95564e1 100755 +--- a/output.py ++++ b/output.py +@@ -927,6 +927,26 @@ class YumOutput: + self.verbose_logger.log(logginglevels.INFO_1, + _("Installed size: %s"), + self.format_number(insize)) ++ ++ def reportRemoveSize(self, packages): ++ """Report the total size of packages being removed. """ ++ totsize = 0 ++ error = False ++ for pkg in packages: ++ # Just to be on the safe side, if for some reason getting ++ # the package size fails, log the error and don't report download ++ # size ++ try: ++ size = int(pkg.size) ++ totsize += size ++ except: ++ error = True ++ self.logger.error(_('There was an error calculating installed size')) ++ break ++ if (not error): ++ self.verbose_logger.log(logginglevels.INFO_1, ++ _("Installed size: %s"), ++ self.format_number(totsize)) + + def listTransaction(self): + """returns a string rep of the transaction in an easy-to-read way.""" +-- +1.7.0.1 + + +From 8af3344f865f6af9a2d9293c513f7c936066eb58 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 29 Apr 2010 14:43:24 -0400 +Subject: [PATCH 89] Ignore problems about packages being removed, BZ 566820 + +--- + yum/__init__.py | 42 ++++++++++++++++++++++++++++++++++++------ + 1 files changed, 36 insertions(+), 6 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 99b0bc1..0a39365 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1178,7 +1178,8 @@ class YumBase(depsolve.Depsolve): + toRemove.add(dep) + self._getDepsToRemove(dep, deptree, toRemove) --#: ../output.py:765 -+#: ../output.py:758 - msgid " Unsatisfied dependency" - msgstr " Ej uppfyllt beroende" +- def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd=None, header=None): ++ def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd=None, header=None, ++ ignore_pkgs=[]): + if out is None: + out = self.logger.warning + if chkcmd is None: +@@ -1196,22 +1197,48 @@ class YumBase(depsolve.Depsolve): + else: + chkcmd = set([chkcmd]) --#: ../output.py:837 -+#: ../output.py:830 - #, python-format - msgid "Repo : %s" - msgstr "Förråd : %s" ++ ignore_pkgtups = set((pkg.pkgtup for pkg in ignore_pkgs)) ++ + rc = 0 + probs = [] + if chkcmd.intersection(set(('all', 'dependencies'))): + prob2ui = {'requires' : _('missing requires'), + 'conflicts' : _('installed conflict')} +- probs.extend(self.rpmdb.check_dependencies()) ++ for prob in self.rpmdb.check_dependencies(): ++ if prob.pkg.pkgtup in ignore_pkgtups: ++ continue ++ if prob.problem == 'conflicts': ++ found = True # all the conflicting pkgs have to be ignored ++ for res in prob.res: ++ if res.pkgtup not in ignore_pkgtups: ++ found = False ++ break ++ if found: ++ continue ++ probs.append(prob) --#: ../output.py:838 -+#: ../output.py:831 - msgid "Matched from:" - msgstr "Matchat från:" + if chkcmd.intersection(set(('all', 'duplicates'))): + iopkgs = set(self.conf.installonlypkgs) +- probs.extend(self.rpmdb.check_duplicates(iopkgs)) ++ for prob in self.rpmdb.check_duplicates(iopkgs): ++ if prob.pkg.pkgtup in ignore_pkgtups: ++ continue ++ if prob.duplicate.pkgtup in ignore_pkgtups: ++ continue ++ probs.append(prob) --#: ../output.py:847 -+#: ../output.py:840 - msgid "Description : " - msgstr "Beskrivning : " + if chkcmd.intersection(set(('all', 'obsoleted'))): +- probs.extend(self.rpmdb.check_obsoleted()) ++ for prob in self.rpmdb.check_obsoleted(): ++ if prob.pkg.pkgtup in ignore_pkgtups: ++ continue ++ probs.append(prob) --#: ../output.py:850 -+#: ../output.py:843 - #, python-format - msgid "URL : %s" - msgstr "URL : %s" + if chkcmd.intersection(set(('all', 'provides'))): +- probs.extend(self.rpmdb.check_provides()) ++ for prob in self.rpmdb.check_provides(): ++ if prob.pkg.pkgtup in ignore_pkgtups: ++ continue ++ if prob.obsoleter.pkgtup in ignore_pkgtups: ++ continue ++ probs.append(prob) --#: ../output.py:853 -+#: ../output.py:846 - #, python-format - msgid "License : %s" - msgstr "Licens : %s" + header(len(probs)) + for prob in sorted(probs): +@@ -1238,7 +1265,10 @@ class YumBase(depsolve.Depsolve): + if lastdbv is not None: + lastdbv = lastdbv.end_rpmdbversion + if lastdbv is None or rpmdbv != lastdbv: +- self._rpmdb_warn_checks(warn=lastdbv is not None) ++ txmbrs = self.tsInfo.getMembersWithState(None, TS_REMOVE_STATES) ++ ignore_pkgs = [txmbr.po for txmbr in txmbrs] ++ self._rpmdb_warn_checks(warn=lastdbv is not None, ++ ignore_pkgs=ignore_pkgs) + if self.conf.history_record: + self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo)) + +-- +1.7.0.1 + + +From d3bc52785f6350b789fc1c5e8430b9392d6ffdf9 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 29 Apr 2010 18:05:57 -0400 +Subject: [PATCH 90] Merge obsoletes/provides from Fedora + +--- + yum.spec | 10 +++++++++- + 1 files changed, 9 insertions(+), 1 deletions(-) + +diff --git a/yum.spec b/yum.spec +index 909354e..3b8b3f8 100644 +--- a/yum.spec ++++ b/yum.spec +@@ -22,9 +22,17 @@ Requires: pygpgme + Prereq: /sbin/chkconfig, /sbin/service, coreutils + Conflicts: yum-skip-broken + Conflicts: rpm >= 5-0 +-Obsoletes: yum-basearchonly ++Obsoletes: yum-skip-broken <= 1.1.18 ++Obsoletes: yum-basearchonly <= 1.1.9 + Obsoletes: yum-allow-downgrade < 1.1.20-0 + Obsoletes: yum-plugin-allow-downgrade < 1.1.22-0 ++Obsoletes: yum-plugin-protect-packages < 1.1.27-0 ++Provides: yum-skip-broken ++Provides: yum-basearchonly ++Provides: yum-allow-downgrade ++Provides: yum-plugin-allow-downgrade ++Provides: yum-protect-packages ++Provides: yum-plugin-protect-packages --#: ../output.py:856 -+#: ../output.py:849 - #, python-format - msgid "Filename : %s" - msgstr "Filnamn : %s" + %description + Yum is a utility that can check for and automatically download and +-- +1.7.0.1 + + +From f48b1d9f0ede0eae518f5b353ed9dda74dde6d7c Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Fri, 30 Apr 2010 12:16:54 -0400 +Subject: [PATCH 91] make sure we're not prepending a path which is already been prepended + with the installroot + fixes rh bugs: + https://bugzilla.redhat.com/show_bug.cgi?id=577627 + and + https://bugzilla.redhat.com/show_bug.cgi?id=560078 + +--- + yum/rpmsack.py | 10 ++++++++-- + 1 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 83268cc..6a40939 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -171,7 +171,10 @@ class RPMDBPackageSack(PackageSackBase): + if cachedir is None: + cachedir = misc.getCacheDir() + self.setCacheDir(cachedir) +- self._persistdir = root + '/' + persistdir ++ if not os.path.normpath(persistdir).startswith(self.root): ++ self._persistdir = root + '/' + persistdir ++ else: ++ self._persistdir = persistdir + self._have_cached_rpmdbv_data = None + self._cached_conflicts_data = None + # Store the result of what happens, if a transaction completes. +@@ -231,7 +234,10 @@ class RPMDBPackageSack(PackageSackBase): + def setCacheDir(self, cachedir): + """ Sets the internal cachedir value for the rpmdb, to be the + "installed" directory from this parent. """ +- self._cachedir = self.root + '/' + cachedir + "/installed/" ++ if not os.path.normpath(cachedir).startswith(self.root): ++ self._cachedir = self.root + '/' + cachedir + "/installed/" ++ else: ++ self._cachedir = '/' + cachedir + "/installed/" --#: ../output.py:860 -+#: ../output.py:853 - msgid "Other : " - msgstr "Övrigt : " + def readOnlyTS(self): + if not self.ts: +-- +1.7.0.1 + + +From 9714379777bfa6569a46ef8d2cc1131b951eebf7 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Fri, 30 Apr 2010 12:28:10 -0400 +Subject: [PATCH 92] and do the same for the history db with an --installroot + +--- + yum/history.py | 5 ++++- + 1 files changed, 4 insertions(+), 1 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index 608f9b7..7e0f399 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -176,7 +176,10 @@ class YumHistory: + self._conn = None + + self.conf = yum.misc.GenericHolder() +- self.conf.db_path = os.path.normpath(root + '/' + db_path) ++ if not os.path.normpath(db_path).startswith(root): ++ self.conf.db_path = os.path.normpath(root + '/' + db_path) ++ else: ++ self.conf.db_path = os.path.normpath('/' + db_path) + self.conf.writable = False + self.conf.readable = True + +-- +1.7.0.1 + + +From b3be8de9105015e2e321816906c312d98a38e6e6 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Fri, 30 Apr 2010 14:36:25 -0400 +Subject: [PATCH 93] if the log file doesn't exist when we startup make sure we set + the perms for it to 0600. + close rh bug https://bugzilla.redhat.com/show_bug.cgi?id=552549 + +--- + yum/logginglevels.py | 7 ++++++- + 1 files changed, 6 insertions(+), 1 deletions(-) + +diff --git a/yum/logginglevels.py b/yum/logginglevels.py +index 1ab11db..2002140 100644 +--- a/yum/logginglevels.py ++++ b/yum/logginglevels.py +@@ -192,7 +192,12 @@ def setFileLog(uid, logfile): + logdir = os.path.dirname(logfile) + if not os.path.exists(logdir): + os.makedirs(logdir, mode=0755) +- ++ ++ if not os.path.exists(logfile): ++ f = open(logfile, 'w') ++ os.chmod(logfile, 0600) # making sure umask doesn't catch us up ++ f.close() ++ + filelogger = logging.getLogger("yum.filelogging") + filehandler = logging.FileHandler(logfile) + formatter = logging.Formatter("%(asctime)s %(message)s", +-- +1.7.0.1 + + +From a4f5edddc317cec91c83219485f4dd183accbbd4 Mon Sep 17 00:00:00 2001 +From: Mads Kiilerich +Date: Fri, 30 Apr 2010 15:21:32 -0400 +Subject: [PATCH 94] if we get diskspace errors from runTransaction but not from the test + transaction then emit them quasi-properly. + +I'd love it if this were all different and less error prone to sort out. +modified patch from https://bugzilla.redhat.com/show_bug.cgi?id=516135 +--- + yum/__init__.py | 7 ++++++- + 1 files changed, 6 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 0a39365..eb135f4 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1297,7 +1297,12 @@ class YumBase(depsolve.Depsolve): + if self.conf.history_record: + herrors = [to_unicode(to_str(x)) for x in errors] + self.history.end(rpmdbv, 2, errors=herrors) +- raise Errors.YumBaseError, errors ++ ++ self.logger.critical(_("Transaction couldn't start:")) ++ for e in errors: ++ self.logger.critical(e[0]) # should this be 'to_unicoded'? ++ raise Errors.YumBaseError, _("Could not run transaction.") ++ + + if not self.conf.keepcache: + self.cleanUsedHeadersPackages() +-- +1.7.0.1 + + +From 692a502cc473c686bdbeb24fbe2f4047d63a6b5a Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sun, 2 May 2010 01:29:28 -0400 +Subject: [PATCH 95] Use all the passed check sub-commands + +--- + yumcommands.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yumcommands.py b/yumcommands.py +index 89c562c..05f1296 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -1375,7 +1375,7 @@ class CheckRpmdbCommand(YumCommand): + def doCommand(self, base, basecmd, extcmds): + chkcmd = 'all' + if extcmds: +- chkcmd = extcmds[0] ++ chkcmd = extcmds --#: ../output.py:893 -+#: ../output.py:896 - msgid "There was an error calculating total download size" - msgstr "Ett fel uppstod vid beräkningen av total storlek att hämta" + def _out(x): + print x +-- +1.7.0.1 + + +From 7032e7d9a3ebb6573b180a55ec049e822a212720 Mon Sep 17 00:00:00 2001 +From: Tim Lauridsen +Date: Fri, 30 Apr 2010 18:17:33 +0200 +Subject: [PATCH 96] Make sure we have and int flag + added docstrings (rhbz #572770) + +--- + rpmUtils/miscutils.py | 11 +++++++++-- + 1 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py +index b5f3566..8e46541 100644 +--- a/rpmUtils/miscutils.py ++++ b/rpmUtils/miscutils.py +@@ -341,11 +341,17 @@ def rpm2cpio(fdno, out=sys.stdout, bufsize=2048): + if tmp == "": break + out.write(tmp) + f.close() +- ++ + def formatRequire (name, version, flags): ++ ''' ++ Return a human readable requirement string (ex. foobar >= 2.0) ++ @param name: requirement name (ex. foobar) ++ @param version: requirent version (ex. 2.0) ++ @param flags: binary flags ( 0010 = equal, 0100 = greater than, 1000 = less than ) ++ ''' + s = name + +- if flags: ++ if flags and type(flags) == type(0): # Flag must be set and a int + if flags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER | + rpm.RPMSENSE_EQUAL): + s = s + " " +@@ -358,6 +364,7 @@ def formatRequire (name, version, flags): + if version: + s = "%s %s" %(s, version) + return s ++ + + def flagToString(flags): + flags = flags & 0xf +-- +1.7.0.1 + + +From d1f047afc6bd2c7afe5f2db74f190015a7894af7 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 01:14:50 -0400 +Subject: [PATCH 97] Catch both kinds of exceptions, on sqlite opens (RHEL-5 needs this, for one) + +--- + yum/history.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index 7e0f399..cba6bf3 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -223,7 +223,7 @@ class YumHistory: --#: ../output.py:898 -+#: ../output.py:901 - #, python-format - msgid "Total size: %s" - msgstr "Total storlek: %s" + try: + self._conn = sqlite.connect(self._db_file) +- except sqlite.OperationalError: ++ except (sqlite.OperationalError, sqlite.DatabaseError): + self.conf.readable = False + return None --#: ../output.py:901 -+#: ../output.py:904 - #, python-format - msgid "Total download size: %s" - msgstr "Total storlek att hämta: %s" +-- +1.7.0.1 + + +From a079025ebb241849ba734b47607af9eb0c2ae9a3 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 02:09:58 -0400 +Subject: [PATCH 98] Work around mock setting mtime on var/lib/Packages, for it's "caches". + Somehow the Packages file gets out of sync. with yum's cache/installed + in the mock installroot cache, but due to the mtime check we don't see + it and thus. blow up. + This does mean we'll blow the cache for normal use whenever ctime + changes now ... but hopefully that shouldn't be much more often. + + We are only hitting this now due to the installroot fixes that just +went in. +--- + yum/rpmsack.py | 6 ++++-- + 1 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 6a40939..b457cc9 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -847,9 +847,11 @@ class RPMDBPackageSack(PackageSackBase): + rpmdbfname = self.root + "/var/lib/rpm/Packages" + + if os.path.exists(rpmdbvfname) and os.path.exists(rpmdbfname): +- # See if rpmdb has "changed" ... ++ # See if rpmdb has "changed" ... NOTE that we need to use ctime ++ # due to mock, because it will save and restore arbitrary rpmdb's ++ # on us and will helpfully reset the mtime! + nmtime = os.path.getmtime(rpmdbvfname) +- omtime = os.path.getmtime(rpmdbfname) ++ omtime = os.path.getctime(rpmdbfname) + if omtime <= nmtime: + rpmdbv = open(rpmdbvfname).readline()[:-1] + self._have_cached_rpmdbv_data = rpmdbv +-- +1.7.0.1 + + +From bc35eef42e9743d4df152b8c5dbbe875546f2b71 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 02:45:03 -0400 +Subject: [PATCH 99] Parameter was conflicts, the variable passed was called res ... typo fix + +--- + yum/__init__.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index eb135f4..c2313a0 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1209,7 +1209,7 @@ class YumBase(depsolve.Depsolve): + continue + if prob.problem == 'conflicts': + found = True # all the conflicting pkgs have to be ignored +- for res in prob.res: ++ for res in prob.conflicts: + if res.pkgtup not in ignore_pkgtups: + found = False + break +-- +1.7.0.1 + + +From 6526164c728cc28bd8d7b357768e0620dbc7a4fe Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 15:53:00 -0400 +Subject: [PATCH 100] Fix deselections like '-*debuginfo' etc. + +--- + yum/transactioninfo.py | 9 +++++---- + 1 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index 69ff86d..d574b80 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -202,15 +202,16 @@ class TransactionData: + txmbrs = self.matchNaevr(pattern) + if not txmbrs: + na = pattern.rsplit('.', 2) +- txmbrs = self.matchNaevr(na[0], na[1]) ++ if len(na) == 2: ++ txmbrs = self.matchNaevr(na[0], na[1]) --#: ../output.py:942 -+#: ../output.py:908 -+#, python-format -+msgid "Installed size: %s" -+msgstr "Installerad storlek: %s" -+ -+#: ../output.py:949 - msgid "Reinstalling" - msgstr "Ominstallerar" + if not txmbrs: +- if self.pkgSack is not None: ++ if self.pkgSack is None: + pkgs = [] + else: +- pkgs = self.pkgSack.returnPackages(pattern) ++ pkgs = self.pkgSack.returnPackages(patterns=[pattern]) + if not pkgs: +- pkgs = self.rpmdb.returnPackages(pattern) ++ pkgs = self.rpmdb.returnPackages(patterns=[pattern]) --#: ../output.py:943 -+#: ../output.py:950 - msgid "Downgrading" - msgstr "Nedgraderar" + for pkg in pkgs: + txmbrs.extend(self.getMembers(pkg.pkgtup)) +-- +1.7.0.1 + + +From 39d852d04fd1934453d07bf9d3b9fd8ef60ca9f2 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 16:00:02 -0400 +Subject: [PATCH 101] Move the rpmdb cache to yum persistent storage. + +--- + yum/__init__.py | 6 ++---- + yum/rpmsack.py | 8 ++++---- + 2 files changed, 6 insertions(+), 8 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index c2313a0..550e5cc 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -490,8 +490,7 @@ class YumBase(depsolve.Depsolve): + _('Reading Local RPMDB')) + self._rpmdb = rpmsack.RPMDBPackageSack(root=self.conf.installroot, + releasever=self.conf.yumvar['releasever'], +- persistdir=self.conf.persistdir, +- cachedir=self.conf.cachedir) ++ persistdir=self.conf.persistdir) + self.verbose_logger.debug('rpmdb time: %0.3f' % (time.time() - rpmdb_st)) + return self._rpmdb --#: ../output.py:944 -+#: ../output.py:951 - msgid "Installing for dependencies" - msgstr "Installerar på grund av beroenden" +@@ -1923,7 +1922,7 @@ class YumBase(depsolve.Depsolve): + return self._cleanFiles(exts, 'cachedir', 'metadata') --#: ../output.py:945 -+#: ../output.py:952 - msgid "Updating for dependencies" - msgstr "Uppdaterar på grund av beroenden" + def cleanRpmDB(self): +- cachedir = self.conf.cachedir + "/installed/" ++ cachedir = self.conf.persistdir + "/rpmdb-indexes/" + if not os.path.exists(cachedir): + filelist = [] + else: +@@ -4493,7 +4492,6 @@ class YumBase(depsolve.Depsolve): --#: ../output.py:946 -+#: ../output.py:953 - msgid "Removing for dependencies" - msgstr "Tar bort på grund av beroenden" + cachedir += varReplace(suffix, self.conf.yumvar) + self.repos.setCacheDir(cachedir) +- self.rpmdb.setCacheDir(cachedir) + self.conf.cachedir = cachedir + return True # We got a new cache dir --#: ../output.py:953 ../output.py:1065 -+#: ../output.py:960 ../output.py:1072 - msgid "Skipped (dependency problems)" - msgstr "Hoppas över (beroendeproblem)" +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index b457cc9..a11c6d5 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -169,7 +169,7 @@ class RPMDBPackageSack(PackageSackBase): + self._get_req_cache = {} + self._loaded_gpg_keys = False + if cachedir is None: +- cachedir = misc.getCacheDir() ++ cachedir = persistdir + "/rpmdb-indexes" + self.setCacheDir(cachedir) + if not os.path.normpath(persistdir).startswith(self.root): + self._persistdir = root + '/' + persistdir +@@ -233,11 +233,11 @@ class RPMDBPackageSack(PackageSackBase): --#: ../output.py:976 -+#: ../output.py:983 - msgid "Package" - msgstr "Paket" + def setCacheDir(self, cachedir): + """ Sets the internal cachedir value for the rpmdb, to be the +- "installed" directory from this parent. """ ++ "rpmdb-indexes" directory in the persisent yum storage. """ + if not os.path.normpath(cachedir).startswith(self.root): +- self._cachedir = self.root + '/' + cachedir + "/installed/" ++ self._cachedir = self.root + '/' + cachedir + else: +- self._cachedir = '/' + cachedir + "/installed/" ++ self._cachedir = '/' + cachedir --#: ../output.py:976 -+#: ../output.py:983 - msgid "Arch" - msgstr "Ark" + def readOnlyTS(self): + if not self.ts: +-- +1.7.0.1 + + +From eb7fb5fba6d0f2e21a34b10cc3a6c12003ebc299 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 16:00:18 -0400 +Subject: [PATCH 102] Revert " Work around mock setting mtime on var/lib/Packages, for it's "caches"." + +This reverts commit a079025ebb241849ba734b47607af9eb0c2ae9a3. + + This is not needed anymore due to the path change. +--- + yum/rpmsack.py | 6 ++---- + 1 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index a11c6d5..1c8bcd5 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -847,11 +847,9 @@ class RPMDBPackageSack(PackageSackBase): + rpmdbfname = self.root + "/var/lib/rpm/Packages" + + if os.path.exists(rpmdbvfname) and os.path.exists(rpmdbfname): +- # See if rpmdb has "changed" ... NOTE that we need to use ctime +- # due to mock, because it will save and restore arbitrary rpmdb's +- # on us and will helpfully reset the mtime! ++ # See if rpmdb has "changed" ... + nmtime = os.path.getmtime(rpmdbvfname) +- omtime = os.path.getctime(rpmdbfname) ++ omtime = os.path.getmtime(rpmdbfname) + if omtime <= nmtime: + rpmdbv = open(rpmdbvfname).readline()[:-1] + self._have_cached_rpmdbv_data = rpmdbv +-- +1.7.0.1 + + +From e6584cd2f5aee22b2b39eeeb2c312434d004ed96 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 16:22:04 -0400 +Subject: [PATCH 103] Don't do rpmdb checks, in version, with no history (as it's root only now). + +--- + yumcommands.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yumcommands.py b/yumcommands.py +index 05f1296..dcf72db 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -1229,7 +1229,7 @@ class VersionCommand(YumCommand): + lastdbv = base.history.last() + if lastdbv is not None: + lastdbv = lastdbv.end_rpmdbversion +- if lastdbv is None or data[0] != lastdbv: ++ if lastdbv is not None and data[0] != lastdbv: + base._rpmdb_warn_checks(warn=lastdbv is not None) + if vcmd not in ('group-installed', 'group-all'): + cols.append(("%s %s/%s" % (_("Installed:"), rel, ba), +-- +1.7.0.1 + + +From 565821231c999645b74fc8a96680f8eecf0713c9 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 5 May 2010 16:48:24 -0400 +Subject: [PATCH 104] Only do any rpmdbv checks, if history_record is set + +--- + yum/__init__.py | 22 +++++++++++----------- + 1 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 550e5cc..64663cc 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1257,18 +1257,18 @@ class YumBase(depsolve.Depsolve): + self.run_with_package_names.add('yum-metadata-parser') + break --#: ../output.py:977 -+#: ../output.py:984 - msgid "Version" - msgstr "Version" +- using_pkgs_pats = list(self.run_with_package_names) +- using_pkgs = self.rpmdb.returnPackages(patterns=using_pkgs_pats) +- rpmdbv = self.rpmdb.simpleVersion(main_only=True)[0] +- lastdbv = self.history.last() +- if lastdbv is not None: +- lastdbv = lastdbv.end_rpmdbversion +- if lastdbv is None or rpmdbv != lastdbv: +- txmbrs = self.tsInfo.getMembersWithState(None, TS_REMOVE_STATES) +- ignore_pkgs = [txmbr.po for txmbr in txmbrs] +- self._rpmdb_warn_checks(warn=lastdbv is not None, +- ignore_pkgs=ignore_pkgs) + if self.conf.history_record: ++ using_pkgs_pats = list(self.run_with_package_names) ++ using_pkgs = self.rpmdb.returnPackages(patterns=using_pkgs_pats) ++ rpmdbv = self.rpmdb.simpleVersion(main_only=True)[0] ++ lastdbv = self.history.last() ++ if lastdbv is not None: ++ lastdbv = lastdbv.end_rpmdbversion ++ if lastdbv is None or rpmdbv != lastdbv: ++ txmbrs = self.tsInfo.getMembersWithState(None, TS_REMOVE_STATES) ++ ignore_pkgs = [txmbr.po for txmbr in txmbrs] ++ self._rpmdb_warn_checks(warn=lastdbv is not None, ++ ignore_pkgs=ignore_pkgs) + self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo)) --#: ../output.py:977 -+#: ../output.py:984 - msgid "Repository" - msgstr "Förråd" + # Just before we update the transaction, update what we think the +-- +1.7.0.1 + + +From 99cb2b49b5de22edf923863b36a0cfe5daae534f Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 6 May 2010 10:58:46 -0400 +Subject: [PATCH 105] add --enablerepo to suggestion for handling package not matching + what is expected to be downloaded. + deals with folks installing debuginfo pkgs but not have debug repos enabled + when they run clean metadata + +--- + yum/__init__.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 64663cc..d2a3a76 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1584,7 +1584,7 @@ class YumBase(depsolve.Depsolve): + os.unlink(fo) --#: ../output.py:978 -+#: ../output.py:985 - msgid "Size" - msgstr "Storl." + if raiseError: +- msg = _('Package does not match intended download. Suggestion: run yum clean metadata') ++ msg = _('Package does not match intended download. Suggestion: run yum --enablerepo=%s clean metadata') % po.repo.id + raise URLGrabError(-1, msg) + else: + return False +-- +1.7.0.1 + + +From 0325fb088059b82788e81489b74895c2d72c48c1 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 6 May 2010 11:14:40 -0400 +Subject: [PATCH 106] output list of repos being cleaned up for when we clean. + +--- + cli.py | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/cli.py b/cli.py +index fc91de2..0d6f6dd 100644 +--- a/cli.py ++++ b/cli.py +@@ -1014,6 +1014,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + def cleanCli(self, userlist): + hdrcode = pkgcode = xmlcode = dbcode = expccode = 0 + pkgresults = hdrresults = xmlresults = dbresults = expcresults = [] ++ self.verbose_logger.log(yum.logginglevels.INFO_2, ++ _('Cleaning requested data in enabled repos:')) ++ for repo in self.repos.listEnabled(): ++ self.verbose_logger.log(yum.logginglevels.INFO_2, ++ _(' %s') % repo.id ) + if 'all' in userlist: + self.verbose_logger.log(yum.logginglevels.INFO_2, + _('Cleaning up Everything')) +-- +1.7.0.1 + + +From 144829fa10909cb749ab67e3793f8dd9e80aed4c Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 6 May 2010 14:07:08 -0400 +Subject: [PATCH 107] use the fmtKeyValFill for the output of repos + +--- + cli.py | 8 +++----- + 1 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/cli.py b/cli.py +index 0d6f6dd..2f1479b 100644 +--- a/cli.py ++++ b/cli.py +@@ -1014,11 +1014,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + def cleanCli(self, userlist): + hdrcode = pkgcode = xmlcode = dbcode = expccode = 0 + pkgresults = hdrresults = xmlresults = dbresults = expcresults = [] +- self.verbose_logger.log(yum.logginglevels.INFO_2, +- _('Cleaning requested data in enabled repos:')) +- for repo in self.repos.listEnabled(): +- self.verbose_logger.log(yum.logginglevels.INFO_2, +- _(' %s') % repo.id ) ++ msg = self.fmtKeyValFill(_('Cleaning repos: '), ++ ' '.join([ x.id for x in self.repos.listEnabled()])) ++ self.verbose_logger.log(yum.logginglevels.INFO_2, msg) + if 'all' in userlist: + self.verbose_logger.log(yum.logginglevels.INFO_2, + _('Cleaning up Everything')) +-- +1.7.0.1 + + +From 86a1ef458057cf5513c2ac5f81fa5b7603392217 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 22 Apr 2010 18:40:31 -0400 +Subject: [PATCH 108] Add skip broken packages to history transaction. + +--- + docs/yum.8 | 2 + + output.py | 24 +++++++++++++++++- + yum/__init__.py | 4 ++- + yum/history.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 4 files changed, 96 insertions(+), 4 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index b9ee5ec..f9eb7fd 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -320,6 +320,8 @@ if there was something not good with the transaction. + .br + .I \fBE\fR - The transaction completed fine, but had warning/error output during the transaction. + .br ++.I \fBs\fR - The transaction completed fine, but --skip-broken was enabled and had to skip some packages. ++.br --#: ../output.py:990 -+#: ../output.py:997 - #, python-format --msgid "" --" replacing %s%s%s.%s %s\n" --"\n" --msgstr "" --" ersätter %s%s%s.%s %s\n" --"\n" -+msgid " replacing %s%s%s.%s %s\n" -+msgstr " ersätter %s%s%s.%s %s\n" + .IP + .IP "\fBcheck\fP" +diff --git a/output.py b/output.py +index 95564e1..65d3f44 100755 +--- a/output.py ++++ b/output.py +@@ -1333,6 +1333,8 @@ to exit. + # We don't check .errors, because return_code will be non-0 + elif old.output: + rmark = lmark = 'E' ++ elif old.trans_skip: ++ rmark = lmark = 's' + if old.altered_lt_rpmdb: + rmark = '<' + if old.altered_gt_rpmdb: +@@ -1485,11 +1487,29 @@ to exit. + state = _('Updated') + elif ipkgs[0] < hpkg: + state = _('Downgraded') +- else: # multiple versions installed, both older and newer +- state = _('Weird') ++ else: ++ assert False, "Impossible, installed not newer and not older" + print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg) + print _("Packages Altered:") + self.historyInfoCmdPkgsAltered(old, pats) ++ if old.trans_skip: ++ print _("Packages Skipped:") ++ for hpkg in old.trans_skip: ++ prefix = " " * 4 ++ state = _('Installed') ++ ipkgs = self.rpmdb.searchNames([hpkg.name]) ++ ipkgs.sort() ++ if not ipkgs: ++ state = _('Not installed') ++ elif hpkg.pkgtup in (ipkg.pkgtup for ipkg in ipkgs): ++ pass ++ elif ipkgs[-1] > hpkg: ++ state = _('Older') ++ elif ipkgs[0] < hpkg: ++ state = _('Newer') ++ else: ++ assert False, "Impossible, installed not newer and not older" ++ print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg) + if old.output: + print _("Scriptlet output:") + num = 0 +diff --git a/yum/__init__.py b/yum/__init__.py +index d2a3a76..d5fabf5 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1269,7 +1269,9 @@ class YumBase(depsolve.Depsolve): + ignore_pkgs = [txmbr.po for txmbr in txmbrs] + self._rpmdb_warn_checks(warn=lastdbv is not None, + ignore_pkgs=ignore_pkgs) +- self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo)) ++ self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo), ++ self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo), ++ self.skipped_packages) --#: ../output.py:999 -+#: ../output.py:1006 - #, python-format - msgid "" - "\n" -@@ -806,7 +825,7 @@ msgstr "" - "Transaktionssammanfattning\n" - "%s\n" + # Just before we update the transaction, update what we think the + # rpmdb will look like. This needs to be done before the run, so that if +diff --git a/yum/history.py b/yum/history.py +index cba6bf3..7305a62 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -128,6 +128,7 @@ class YumHistoryTransaction: --#: ../output.py:1006 -+#: ../output.py:1013 - #, python-format - msgid "" - "Install %5.5s Package(s)\n" -@@ -815,7 +834,7 @@ msgstr "" - "Installerar %5.5s Paket\n" - "Uppdaterar %5.5s Paket\n" + self._loaded_TW = None + self._loaded_TD = None ++ self._loaded_TS = None --#: ../output.py:1015 -+#: ../output.py:1022 - #, python-format - msgid "" - "Remove %5.5s Package(s)\n" -@@ -826,32 +845,32 @@ msgstr "" - "Ominstallerar %5.5s Paket\n" - "Nedgraderar %5.5s Paket\n" + self._loaded_ER = None + self._loaded_OT = None +@@ -153,9 +154,14 @@ class YumHistoryTransaction: + if self._loaded_TD is None: + self._loaded_TD = sorted(self._history._old_data_pkgs(self.tid)) + return self._loaded_TD ++ def _getTransSkip(self): ++ if self._loaded_TS is None: ++ self._loaded_TS = sorted(self._history._old_skip_pkgs(self.tid)) ++ return self._loaded_TS --#: ../output.py:1059 -+#: ../output.py:1066 - msgid "Removed" - msgstr "Borttagna" + trans_with = property(fget=lambda self: self._getTransWith()) + trans_data = property(fget=lambda self: self._getTransData()) ++ trans_skip = property(fget=lambda self: self._getTransSkip()) --#: ../output.py:1060 -+#: ../output.py:1067 - msgid "Dependency Removed" - msgstr "Borttagna beroenden" + def _getErrors(self): + if self._loaded_ER is None: +@@ -311,6 +317,17 @@ class YumHistory: + VALUES (?, ?)""", (self._tid, pid)) + return cur.lastrowid --#: ../output.py:1062 -+#: ../output.py:1069 - msgid "Dependency Installed" - msgstr "Installerade beroenden" ++ def trans_skip_pid(self, pid): ++ cur = self._get_cursor() ++ if cur is None or not self._update_db_file_2(): ++ return None ++ ++ res = executeSQL(cur, ++ """INSERT INTO trans_skip_pkgs ++ (tid, pkgtupid) ++ VALUES (?, ?)""", (self._tid, pid)) ++ return cur.lastrowid ++ + def trans_data_pid_beg(self, pid, state): + assert state is not None + if not hasattr(self, '_tid') or state is None: +@@ -338,7 +355,7 @@ class YumHistory: + self._commit() + return cur.lastrowid --#: ../output.py:1064 -+#: ../output.py:1071 - msgid "Dependency Updated" - msgstr "Uppdaterade beroenden" +- def beg(self, rpmdb_version, using_pkgs, txmbrs): ++ def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[]): + cur = self._get_cursor() + if cur is None: + return +@@ -359,6 +376,10 @@ class YumHistory: + state = self.txmbr2state(txmbr) + self.trans_data_pid_beg(pid, state) + ++ for pkg in skip_packages: ++ pid = self.pkg2pid(pkg) ++ self.trans_skip_pid(pid) ++ + self._commit() --#: ../output.py:1066 -+#: ../output.py:1073 - msgid "Replaced" - msgstr "Ersatte" + def _log_errors(self, errors): +@@ -467,6 +488,20 @@ class YumHistory: + obj.state_installed = False + ret.append(obj) + return ret ++ def _old_skip_pkgs(self, tid): ++ cur = self._get_cursor() ++ if cur is None or not self._update_db_file_2(): ++ return [] ++ executeSQL(cur, ++ """SELECT name, arch, epoch, version, release, checksum ++ FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) ++ WHERE tid = ? ++ ORDER BY name ASC, epoch ASC""", (tid,)) ++ ret = [] ++ for row in cur: ++ obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) ++ ret.append(obj) ++ return ret --#: ../output.py:1067 -+#: ../output.py:1074 - msgid "Failed" - msgstr "Misslyckade" + def old(self, tids=[], limit=None, complete_transactions_only=False): + """ Return a list of the last transactions, note that this includes +@@ -610,6 +645,37 @@ class YumHistory: + tids.add(row[0]) + return tids - #. Delta between C-c's so we treat as exit --#: ../output.py:1133 -+#: ../output.py:1140 - msgid "two" - msgstr "två" ++ _update_ops_2 = ['''\ ++\ ++ CREATE TABLE trans_skip_pkgs ( ++ tid INTEGER NOT NULL REFERENCES trans_beg, ++ pkgtupid INTEGER NOT NULL REFERENCES pkgtups); ++'''] ++ ++ def _update_db_file_2(self): ++ """ Update to version 2 of history, includes trans_skip_pkgs. """ ++ if not self.conf.writable: ++ return False ++ ++ if hasattr(self, '_cached_updated_2'): ++ return self._cached_updated_2 ++ ++ cur = self._get_cursor() ++ if cur is None: ++ return False ++ ++ executeSQL(cur, "PRAGMA table_info(trans_skip_pkgs)") ++ # If we get anything, we're fine. There might be a better way of ++ # saying "anything" but this works. ++ for ob in cur: ++ break ++ else: ++ for op in self._update_ops_2: ++ cur.execute(op) ++ self._commit() ++ self._cached_updated_2 = True ++ return True ++ + def _create_db_file(self): + """ Create a new history DB file, populating tables etc. """ -@@ -859,7 +878,7 @@ msgstr "två" - #. Current download cancelled, interrupt (ctrl-c) again within two seconds - #. to exit. - #. Where "interupt (ctrl-c) again" and "two" are highlighted. --#: ../output.py:1144 -+#: ../output.py:1151 - #, python-format - msgid "" - "\n" -@@ -871,217 +890,360 @@ msgstr "" - " Aktuell nedladdning avbröts, %savbryt (ctrl-c) igen%s inom %s%s%s sekunder\n" - "för att avsluta.\n" +@@ -671,6 +737,8 @@ class YumHistory: + '''] + for op in ops: + cur.execute(op) ++ for op in self._update_ops_2: ++ cur.execute(op) + self._commit() --#: ../output.py:1155 -+#: ../output.py:1162 - msgid "user interrupt" - msgstr "avbrott från användaren" + # Pasted from sqlitesack +-- +1.7.0.1 + + +From 4bd360023d0a3e0996cc5095040cb615156f67c9 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 28 Apr 2010 02:17:35 -0400 +Subject: [PATCH 109] Add three views to make look at history by hand easier + +--- + yum/history.py | 25 +++++++++++++++++++++++++ + 1 files changed, 25 insertions(+), 0 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index 7305a62..358edf1 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -650,6 +650,31 @@ class YumHistory: + CREATE TABLE trans_skip_pkgs ( + tid INTEGER NOT NULL REFERENCES trans_beg, + pkgtupid INTEGER NOT NULL REFERENCES pkgtups); ++''', '''\ ++\ ++ CREATE VIEW vtrans_data_pkgs AS ++ SELECT tid,name,epoch,version,release,arch,pkgtupid, ++ state,done, ++ name || '-' || epoch || ':' || ++ version || '-' || release || '.' || arch AS nevra ++ FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid) ++ ORDER BY name; ++''', '''\ ++\ ++ CREATE VIEW vtrans_with_pkgs AS ++ SELECT tid,name,epoch,version,release,arch,pkgtupid, ++ name || '-' || epoch || ':' || ++ version || '-' || release || '.' || arch AS nevra ++ FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid) ++ ORDER BY name; ++''', '''\ ++\ ++ CREATE VIEW vtrans_skip_pkgs AS ++ SELECT tid,name,epoch,version,release,arch,pkgtupid, ++ name || '-' || epoch || ':' || ++ version || '-' || release || '.' || arch AS nevra ++ FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) ++ ORDER BY name; + '''] --#: ../output.py:1173 -+#: ../output.py:1180 - msgid "Total" - msgstr "Totalt" + def _update_db_file_2(self): +-- +1.7.0.1 + + +From dfa0483c90a736d878599c5c9de0d7072a48ae71 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 14:22:55 -0400 +Subject: [PATCH 110] Add rpmdb problems, and cmdline to the history DBv2 update + +--- + yum/history.py | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 files changed, 170 insertions(+), 1 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index 358edf1..bd10e51 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -112,6 +112,35 @@ class YumHistoryPackage(PackageObject): + chk = checksum.split(':') + self._checksums = [(chk[0], chk[1], 0)] # (type, checksum, id(0,1)) -+#: ../output.py:1202 -+msgid "I" -+msgstr "I" ++class YumHistoryRpmdbProblem(PackageObject): ++ """ Class representing an rpmdb problem that existed at the time of the ++ transaction. """ ++ ++ def __init__(self, history, rpid, problem, text): ++ self._history = weakref(history) ++ ++ self.rpid = rpid ++ self.problem = problem ++ self.text = text + - #: ../output.py:1203 --msgid "" --msgstr "" -+msgid "O" -+msgstr "UF" - - #: ../output.py:1204 -+msgid "E" -+msgstr "R" ++ self._loaded_P = None + -+#: ../output.py:1205 -+msgid "R" -+msgstr "O" ++ def __cmp__(self, other): ++ if other is None: ++ return 1 ++ ret = cmp(self.problem, other.problem) ++ if ret: return -ret ++ ret = cmp(self.rpid, other.rpid) ++ return -ret + -+#: ../output.py:1206 -+msgid "D" -+msgstr "N" ++ def _getProbPkgs(self): ++ if self._loaded_P is None: ++ self._loaded_P = sorted(self._history._old_prob_pkgs(self.rpid)) ++ return self._loaded_P + -+#: ../output.py:1207 -+msgid "U" -+msgstr "U" ++ packages = property(fget=lambda self: self._getProbPkgs()) + -+#: ../output.py:1217 -+msgid "" -+msgstr "" + -+#: ../output.py:1218 - msgid "System" --msgstr "" -+msgstr "System" + class YumHistoryTransaction: + """ Holder for a history transaction. """ --#: ../output.py:1240 -+#: ../output.py:1254 - msgid "Bad transaction IDs, or package(s), given" --msgstr "" -+msgstr "Felaktiga transaktions ID:n, eller paket, angivna" +@@ -130,6 +159,11 @@ class YumHistoryTransaction: + self._loaded_TD = None + self._loaded_TS = None --#: ../output.py:1284 ../yumcommands.py:1149 ../yum/__init__.py:1067 --msgid "Warning: RPMDB has been altered since the last yum transaction." --msgstr "" -+#: ../output.py:1266 -+msgid "ID" -+msgstr "ID" ++ self._loaded_PROB = None + -+#: ../output.py:1267 ../output.py:1520 -+msgid "Login user" -+msgstr "Inloggad användare" ++ self._have_loaded_CMD = False # cmdline can validly be None ++ self._loaded_CMD = None + -+#: ../output.py:1268 -+msgid "Date and time" -+msgstr "Datum och tid" + self._loaded_ER = None + self._loaded_OT = None --#: ../output.py:1289 -+#: ../output.py:1269 ../output.py:1522 -+msgid "Action(s)" -+msgstr "Åtgärd(er)" +@@ -163,6 +197,21 @@ class YumHistoryTransaction: + trans_data = property(fget=lambda self: self._getTransData()) + trans_skip = property(fget=lambda self: self._getTransSkip()) + ++ def _getProblems(self): ++ if self._loaded_PROB is None: ++ self._loaded_PROB = sorted(self._history._old_problems(self.tid)) ++ return self._loaded_PROB + -+#: ../output.py:1270 ../output.py:1523 -+msgid "Altered" -+msgstr "Ändrade" ++ rpmdb_problems = property(fget=lambda self: self._getProblems()) + -+#: ../output.py:1310 - msgid "No transaction ID given" --msgstr "" -+msgstr "Inget transaktions-ID angivet" - --#: ../output.py:1297 -+#: ../output.py:1336 - msgid "Bad transaction ID given" --msgstr "" -+msgstr "Felaktigt transaktions-ID angivet" - --#: ../output.py:1302 --#, fuzzy -+#: ../output.py:1341 - msgid "Not found given transaction ID" --msgstr "Kör transaktionen" -+msgstr "Hittade inte angivet transaktions-ID" - --#: ../output.py:1310 -+#: ../output.py:1349 - msgid "Found more than one transaction ID!" --msgstr "" -+msgstr "Hittade mer än ett transaktions-ID!" - --#: ../output.py:1331 -+#: ../output.py:1370 - msgid "No transaction ID, or package, given" --msgstr "" -+msgstr "Inget transaktions-ID, eller paket, angivet" - --#: ../output.py:1357 --#, fuzzy -+#: ../output.py:1396 - msgid "Transaction ID :" --msgstr "Transaktionskontrollfel:\n" -+msgstr "Transaktions-ID:" - --#: ../output.py:1359 -+#: ../output.py:1398 - msgid "Begin time :" --msgstr "" -+msgstr "Starttid :" - --#: ../output.py:1362 ../output.py:1364 -+#: ../output.py:1401 ../output.py:1403 - msgid "Begin rpmdb :" --msgstr "" -+msgstr "Start-rpmdb :" - --#: ../output.py:1378 --#, fuzzy, python-format -+#: ../output.py:1417 -+#, python-format - msgid "(%s seconds)" --msgstr "%s sekunder (senast: %s)" -+msgstr "(%s sekunder)" - --#: ../output.py:1379 --#, fuzzy -+#: ../output.py:1418 - msgid "End time :" --msgstr "Övrigt : " -+msgstr "Sluttid : " - --#: ../output.py:1382 ../output.py:1384 -+#: ../output.py:1421 ../output.py:1423 - msgid "End rpmdb :" --msgstr "" -+msgstr "Slut-rpmdb :" - --#: ../output.py:1385 --#, fuzzy -+#: ../output.py:1424 - msgid "User :" --msgstr "URL : %s" -+msgstr "Användare :" - --#: ../output.py:1387 ../output.py:1389 ../output.py:1391 -+#: ../output.py:1426 ../output.py:1428 ../output.py:1430 - msgid "Return-Code :" --msgstr "" -+msgstr "Returkod :" - --#: ../output.py:1387 --#, fuzzy -+#: ../output.py:1426 - msgid "Aborted" --msgstr "Låter utgå" -+msgstr "Avbruten" - --#: ../output.py:1389 --#, fuzzy -+#: ../output.py:1428 - msgid "Failure:" --msgstr "Misslyckade" -+msgstr "Misslyckades:" - --#: ../output.py:1391 -+#: ../output.py:1430 - msgid "Success" --msgstr "" -+msgstr "Lyckades" - --#: ../output.py:1392 --#, fuzzy -+#: ../output.py:1431 - msgid "Transaction performed with:" --msgstr "Transaktionskontrollfel:\n" -+msgstr "Transaktionen utförd med:" - --#: ../output.py:1405 --#, fuzzy -+#: ../output.py:1444 ../output.py:1489 - msgid "Downgraded" --msgstr "Nedgraderar" -+msgstr "Nedgraderade" - - #. multiple versions installed, both older and newer --#: ../output.py:1407 -+#: ../output.py:1446 - msgid "Weird" --msgstr "" -+msgstr "Mystisk" - --#: ../output.py:1409 --#, fuzzy -+#: ../output.py:1448 - msgid "Packages Altered:" --msgstr "Inga paket angivna" -+msgstr "Ändrade paket:" - --#: ../output.py:1412 -+#: ../output.py:1451 - msgid "Scriptlet output:" --msgstr "" -+msgstr "Skriptutdata:" - --#: ../output.py:1418 --#, fuzzy -+#: ../output.py:1457 - msgid "Errors:" --msgstr "Fel: %s" -+msgstr "Fel:" - --#: ../output.py:1489 --msgid "Last day" --msgstr "" -+#: ../output.py:1481 ../output.py:1482 -+msgid "Install" -+msgstr "Installation" ++ def _getCmdline(self): ++ if not self._have_loaded_CMD: ++ self._have_loaded_CMD = True ++ self._loaded_CMD = self._history._old_cmdline(self.tid) ++ return self._loaded_CMD + -+#: ../output.py:1483 -+msgid "Dep-Install" -+msgstr "Ber-inst" ++ cmdline = property(fget=lambda self: self._getCmdline()) + -+#: ../output.py:1485 -+msgid "Obsoleting" -+msgstr "Fasar ut" + def _getErrors(self): + if self._loaded_ER is None: + self._loaded_ER = self._history._load_errors(self.tid) +@@ -355,7 +404,54 @@ class YumHistory: + self._commit() + return cur.lastrowid + +- def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[]): ++ def _trans_rpmdb_problem(self, problem): ++ if not hasattr(self, '_tid'): ++ return # Not configured to run ++ cur = self._get_cursor() ++ if cur is None or not self._update_db_file_2(): ++ return None ++ res = executeSQL(cur, ++ """INSERT INTO trans_rpmdb_problems ++ (tid, problem, msg) ++ VALUES (?, ?, ?)""", (self._tid, ++ problem.problem, str(problem))) ++ rpid = cur.lastrowid + -+#: ../output.py:1486 -+msgid "Erase" -+msgstr "Radering" ++ if not rpid: ++ return rpid + -+#: ../output.py:1487 -+msgid "Reinstall" -+msgstr "Ominstallation" ++ pkgs = {} ++ pkg = problem.pkg ++ pkgs[pkg.pkgtup] = pkg ++ if problem.problem == 'conflicts': ++ for pkg in problem.conflicts: ++ pkgs[pkg.pkgtup] = pkg ++ if problem.problem == 'duplicates': ++ pkgs[problem.duplicate.pkgtup] = problem.duplicate + -+#: ../output.py:1488 -+msgid "Downgrade" -+msgstr "Nedgradering" - - #: ../output.py:1490 -+msgid "Update" -+msgstr "Uppdatering" ++ for pkg in pkgs.values(): ++ pid = self.pkg2pid(pkg) ++ res = executeSQL(cur, ++ """INSERT INTO trans_prob_pkgs ++ (rpid, pkgtupid) ++ VALUES (?, ?)""", (rpid, pid)) + -+#: ../output.py:1521 -+msgid "Time" -+msgstr "Tid" ++ return rpid + -+#: ../output.py:1547 -+msgid "Last day" -+msgstr "Senaste dagen" ++ def _trans_cmdline(self, cmdline): ++ if not hasattr(self, '_tid'): ++ return # Not configured to run ++ cur = self._get_cursor() ++ if cur is None or not self._update_db_file_2(): ++ return None ++ res = executeSQL(cur, ++ """INSERT INTO trans_cmdline ++ (tid, cmdline) ++ VALUES (?, ?)""", (self._tid, cmdline)) ++ return cur.lastrowid + -+#: ../output.py:1548 - msgid "Last week" --msgstr "" -+msgstr "Senaste veckan" - --#: ../output.py:1491 -+#: ../output.py:1549 - msgid "Last 2 weeks" --msgstr "" -+msgstr "Senaste 2 veckorna" - - #. US default :p --#: ../output.py:1492 -+#: ../output.py:1550 - msgid "Last 3 months" --msgstr "" -+msgstr "Senaste 3 månaderna" ++ def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[], ++ rpmdb_problems=[], cmdline=None): + cur = self._get_cursor() + if cur is None: + return +@@ -380,6 +476,12 @@ class YumHistory: + pid = self.pkg2pid(pkg) + self.trans_skip_pid(pid) --#: ../output.py:1493 -+#: ../output.py:1551 - msgid "Last 6 months" --msgstr "" -+msgstr "Senaste 6 månaderna" ++ for problem in rpmdb_problems: ++ self._trans_rpmdb_problem(problem) ++ ++ if cmdline: ++ self._trans_cmdline(cmdline) ++ + self._commit() --#: ../output.py:1494 -+#: ../output.py:1552 - msgid "Last year" --msgstr "" -+msgstr "Senaste året" + def _log_errors(self, errors): +@@ -502,6 +604,48 @@ class YumHistory: + obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) + ret.append(obj) + return ret ++ def _old_prob_pkgs(self, rpid): ++ cur = self._get_cursor() ++ if cur is None or not self._update_db_file_2(): ++ return [] ++ executeSQL(cur, ++ """SELECT name, arch, epoch, version, release, checksum ++ FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid) ++ WHERE rpid = ? ++ ORDER BY name ASC, epoch ASC""", (rpid,)) ++ ret = [] ++ for row in cur: ++ obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) ++ ret.append(obj) ++ return ret ++ ++ def _old_problems(self, tid): ++ cur = self._get_cursor() ++ if cur is None or not self._update_db_file_2(): ++ return [] ++ executeSQL(cur, ++ """SELECT rpid, problem, msg ++ FROM trans_rpmdb_problems ++ WHERE tid = ? ++ ORDER BY problem ASC, rpid ASC""", (tid,)) ++ ret = [] ++ for row in cur: ++ obj = YumHistoryRpmdbProblem(self, row[0], row[1], row[2]) ++ ret.append(obj) ++ return ret ++ ++ def _old_cmdline(self, tid): ++ cur = self._get_cursor() ++ if cur is None or not self._update_db_file_2(): ++ return None ++ executeSQL(cur, ++ """SELECT cmdline ++ FROM trans_cmdline ++ WHERE tid = ?""", (tid,)) ++ ret = [] ++ for row in cur: ++ return row[0] ++ return None --#: ../output.py:1495 -+#: ../output.py:1553 - msgid "Over a year ago" --msgstr "" -+msgstr "Mer än ett år tillbaka" + def old(self, tids=[], limit=None, complete_transactions_only=False): + """ Return a list of the last transactions, note that this includes +@@ -652,6 +796,22 @@ class YumHistory: + pkgtupid INTEGER NOT NULL REFERENCES pkgtups); + ''', '''\ + \ ++ CREATE TABLE trans_cmdline ( ++ tid INTEGER NOT NULL REFERENCES trans_beg, ++ cmdline TEXT NOT NULL); ++''', '''\ ++\ ++ CREATE TABLE trans_rpmdb_problems ( ++ rpid INTEGER PRIMARY KEY, ++ tid INTEGER NOT NULL REFERENCES trans_beg, ++ problem TEXT NOT NULL, msg TEXT NOT NULL); ++''', '''\ ++\ ++ CREATE TABLE trans_prob_pkgs ( ++ rpid INTEGER NOT NULL REFERENCES trans_rpmdb_problems, ++ pkgtupid INTEGER NOT NULL REFERENCES pkgtups); ++''', '''\ ++\ + CREATE VIEW vtrans_data_pkgs AS + SELECT tid,name,epoch,version,release,arch,pkgtupid, + state,done, +@@ -675,6 +835,15 @@ class YumHistory: + version || '-' || release || '.' || arch AS nevra + FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) + ORDER BY name; ++''', '''\ ++\ ++ CREATE VIEW vtrans_prob_pkgs AS ++ SELECT tid,rpid,name,epoch,version,release,arch,pkgtupid, ++ name || '-' || epoch || ':' || ++ version || '-' || release || '.' || arch AS nevra ++ FROM (trans_prob_pkgs JOIN trans_rpmdb_problems USING(rpid)) ++ JOIN pkgtups USING(pkgtupid) ++ ORDER BY name; + '''] --#: ../output.py:1524 -+#: ../output.py:1585 - msgid "installed" - msgstr "installeras" + def _update_db_file_2(self): +-- +1.7.0.1 + + +From aa8b33bfa535680ba20df01a8808e9d1aacb89d5 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 14:23:52 -0400 +Subject: [PATCH 111] Save rpmdb problems, and cmdline, into yum history + +--- + yum/__init__.py | 14 +++++++++----- + 1 files changed, 9 insertions(+), 5 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index d5fabf5..b27d6e1 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1243,7 +1243,7 @@ class YumBase(depsolve.Depsolve): + for prob in sorted(probs): + out(prob) --#: ../output.py:1525 -+#: ../output.py:1586 - msgid "updated" - msgstr "uppdateras" +- return len(probs) ++ return probs --#: ../output.py:1526 -+#: ../output.py:1587 - msgid "obsoleted" --msgstr "fasas ut" -+msgstr "utfasas" + def runTransaction(self, cb): + """takes an rpm callback object, performs the transaction""" +@@ -1264,14 +1264,18 @@ class YumBase(depsolve.Depsolve): + lastdbv = self.history.last() + if lastdbv is not None: + lastdbv = lastdbv.end_rpmdbversion ++ rpmdb_problems = [] + if lastdbv is None or rpmdbv != lastdbv: + txmbrs = self.tsInfo.getMembersWithState(None, TS_REMOVE_STATES) + ignore_pkgs = [txmbr.po for txmbr in txmbrs] +- self._rpmdb_warn_checks(warn=lastdbv is not None, +- ignore_pkgs=ignore_pkgs) ++ output_warn = lastdbv is not None ++ rpmdb_problems = self._rpmdb_warn_checks(warn=output_warn, ++ ignore_pkgs=ignore_pkgs) ++ cmdline = None ++ if hasattr(self, 'cmds') and self.cmds: ++ cmdline = ' '.join(self.cmds) + self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo), +- self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo), +- self.skipped_packages) ++ self.skipped_packages, rpmdb_problems, cmdline) --#: ../output.py:1527 -+#: ../output.py:1588 - msgid "erased" - msgstr "raderas" + # Just before we update the transaction, update what we think the + # rpmdb will look like. This needs to be done before the run, so that if +-- +1.7.0.1 + + +From 4774b88d82a01812c0b67e817648dadba7dc0301 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 14:24:05 -0400 +Subject: [PATCH 112] Output cmdline and rpmdb problems in history info + +--- + output.py | 46 +++++++++++++++++++++++++++++++--------------- + 1 files changed, 31 insertions(+), 15 deletions(-) + +diff --git a/output.py b/output.py +index 65d3f44..188c52a 100755 +--- a/output.py ++++ b/output.py +@@ -1438,6 +1438,23 @@ to exit. + def _historyInfoCmd(self, old, pats=[]): + name = self._pwd_ui_username(old.loginuid) --#: ../output.py:1531 -+#: ../output.py:1592 - #, python-format - msgid "---> Package %s.%s %s:%s-%s set to be %s" - msgstr "---> Paket %s.%s %s:%s-%s satt till att %s" ++ def _simple_pkg(pkg, prefix_len): ++ prefix = " " * prefix_len ++ state = _('Installed') ++ ipkgs = self.rpmdb.searchNames([hpkg.name]) ++ ipkgs.sort() ++ if not ipkgs: ++ state = _('Not installed') ++ elif hpkg.pkgtup in (ipkg.pkgtup for ipkg in ipkgs): ++ pass ++ elif ipkgs[-1] > hpkg: ++ state = _('Older') ++ elif ipkgs[0] < hpkg: ++ state = _('Newer') ++ else: ++ assert False, "Impossible, installed not newer and not older" ++ print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg) ++ + print _("Transaction ID :"), old.tid + begtm = time.ctime(old.beg_timestamp) + print _("Begin time :"), begtm +@@ -1473,6 +1490,9 @@ to exit. + print _("Return-Code :"), _("Failure:"), old.return_code + else: + print _("Return-Code :"), _("Success") ++ if old.cmdline is not None: ++ print _("Command Line :"), old.cmdline ++ + print _("Transaction performed with:") + for hpkg in old.trans_with: + prefix = " " * 4 +@@ -1492,24 +1512,20 @@ to exit. + print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg) + print _("Packages Altered:") + self.historyInfoCmdPkgsAltered(old, pats) ++ + if old.trans_skip: + print _("Packages Skipped:") + for hpkg in old.trans_skip: +- prefix = " " * 4 +- state = _('Installed') +- ipkgs = self.rpmdb.searchNames([hpkg.name]) +- ipkgs.sort() +- if not ipkgs: +- state = _('Not installed') +- elif hpkg.pkgtup in (ipkg.pkgtup for ipkg in ipkgs): +- pass +- elif ipkgs[-1] > hpkg: +- state = _('Older') +- elif ipkgs[0] < hpkg: +- state = _('Newer') +- else: +- assert False, "Impossible, installed not newer and not older" +- print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg) ++ _simple_pkg(hpkg, 4) ++ ++ if old.rpmdb_problems: ++ print _("Rpmdb Problems:") ++ for prob in old.rpmdb_problems: ++ key = "%s%s: " % (" " * 4, prob.problem) ++ print self.fmtKeyValFill(key, prob.text) ++ for hpkg in prob.packages: ++ _simple_pkg(hpkg, 8) ++ + if old.output: + print _("Scriptlet output:") + num = 0 +-- +1.7.0.1 + + +From 812aa32b53ccfb8a5d84ef887e040961253ad837 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 14:26:14 -0400 +Subject: [PATCH 113] Move obsoleted.obsoleter check into the correct problem loop + +--- + yum/__init__.py | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index b27d6e1..b7f7702 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1229,14 +1229,14 @@ class YumBase(depsolve.Depsolve): + for prob in self.rpmdb.check_obsoleted(): + if prob.pkg.pkgtup in ignore_pkgtups: + continue ++ if prob.obsoleter.pkgtup in ignore_pkgtups: ++ continue + probs.append(prob) --#: ../output.py:1538 -+#: ../output.py:1599 - msgid "--> Running transaction check" - msgstr "--> Kör transaktionskontroll" + if chkcmd.intersection(set(('all', 'provides'))): + for prob in self.rpmdb.check_provides(): + if prob.pkg.pkgtup in ignore_pkgtups: + continue +- if prob.obsoleter.pkgtup in ignore_pkgtups: +- continue + probs.append(prob) + + header(len(probs)) +-- +1.7.0.1 + + +From 97888d14662cdfe1e85bd5b124cdc7b7475030e0 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 14:25:42 -0400 +Subject: [PATCH 114] Mark pre-exsting rpmdb problems in history list, with 'P'. + +--- + docs/yum.8 | 2 ++ + output.py | 2 ++ + 2 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index f9eb7fd..053173d 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -320,6 +320,8 @@ if there was something not good with the transaction. + .br + .I \fBE\fR - The transaction completed fine, but had warning/error output during the transaction. + .br ++.I \fBP\fR - The transaction completed fine, but problems already existed in the rpmdb. ++.br + .I \fBs\fR - The transaction completed fine, but --skip-broken was enabled and had to skip some packages. + .br --#: ../output.py:1543 -+#: ../output.py:1604 - msgid "--> Restarting Dependency Resolution with new changes." - msgstr "--> Startar om beroendeupplösning med nya ändringar." +diff --git a/output.py b/output.py +index 188c52a..484fd5e 100755 +--- a/output.py ++++ b/output.py +@@ -1333,6 +1333,8 @@ to exit. + # We don't check .errors, because return_code will be non-0 + elif old.output: + rmark = lmark = 'E' ++ elif old.rpmdb_problems: ++ rmark = lmark = 'P' + elif old.trans_skip: + rmark = lmark = 's' + if old.altered_lt_rpmdb: +-- +1.7.0.1 + + +From 6597171c73322f2c23c2985aac9d62ffad3b740a Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 14:39:34 -0400 +Subject: [PATCH 115] Fix sorting of historic rpmdb problems + +--- + yum/history.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index bd10e51..8983261 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -131,7 +131,7 @@ class YumHistoryRpmdbProblem(PackageObject): + ret = cmp(self.problem, other.problem) + if ret: return -ret + ret = cmp(self.rpid, other.rpid) +- return -ret ++ return ret --#: ../output.py:1548 -+#: ../output.py:1609 - msgid "--> Finished Dependency Resolution" - msgstr "--> Avslutade beroendeupplösning" + def _getProbPkgs(self): + if self._loaded_P is None: +-- +1.7.0.1 + + +From 7de7e2d20f176cd964ca09999238be78d02b4ed3 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 14:58:26 -0400 +Subject: [PATCH 116] Save, and then Highlight, the "main" package which has a problem + +--- + output.py | 12 +++++++++--- + yum/history.py | 15 +++++++++++---- + 2 files changed, 20 insertions(+), 7 deletions(-) + +diff --git a/output.py b/output.py +index 484fd5e..7a3cfb0 100755 +--- a/output.py ++++ b/output.py +@@ -1440,7 +1440,7 @@ to exit. + def _historyInfoCmd(self, old, pats=[]): + name = self._pwd_ui_username(old.loginuid) --#: ../output.py:1553 ../output.py:1558 -+#: ../output.py:1614 ../output.py:1619 - #, python-format - msgid "--> Processing Dependency: %s for package: %s" - msgstr "--> Bearbetar beroende: %s för paket: %s" +- def _simple_pkg(pkg, prefix_len): ++ def _simple_pkg(pkg, prefix_len, highlight=False): + prefix = " " * prefix_len + state = _('Installed') + ipkgs = self.rpmdb.searchNames([hpkg.name]) +@@ -1455,7 +1455,13 @@ to exit. + state = _('Newer') + else: + assert False, "Impossible, installed not newer and not older" +- print "%s%s %s" % (prefix, utf8_width_fill(state, 12), hpkg) ++ if highlight: ++ (hibeg, hiend) = self._highlight('bold') ++ else: ++ (hibeg, hiend) = self._highlight('normal') ++ print "%s%s %s%s%s" % (prefix, ++ hibeg, utf8_width_fill(state, 12), hiend, ++ hpkg) --#: ../output.py:1562 -+#: ../output.py:1623 - #, python-format - msgid "--> Unresolved Dependency: %s" - msgstr "--> Ej upplöst beroende: %s" + print _("Transaction ID :"), old.tid + begtm = time.ctime(old.beg_timestamp) +@@ -1526,7 +1532,7 @@ to exit. + key = "%s%s: " % (" " * 4, prob.problem) + print self.fmtKeyValFill(key, prob.text) + for hpkg in prob.packages: +- _simple_pkg(hpkg, 8) ++ _simple_pkg(hpkg, 8, highlight=hpkg.main) --#: ../output.py:1568 ../output.py:1573 -+#: ../output.py:1634 -+#, python-format -+msgid "Package: %s" -+msgstr "Paket: %s" -+ -+#: ../output.py:1636 -+#, python-format -+msgid "" -+"\n" -+" Requires: %s" -+msgstr "\n Behöver: %s" -+ -+#: ../output.py:1649 ../output.py:1660 -+#, python-format -+msgid "" -+"\n" -+" %s: %s (%s)" -+msgstr "\n %s: %s (%s)" -+ -+#: ../output.py:1657 -+msgid "Available" -+msgstr "Tillgängliga" -+ -+#: ../output.py:1665 ../output.py:1670 - #, python-format - msgid "--> Processing Conflict: %s conflicts %s" - msgstr "--> Bearbetar konflikt: %s står i konflikt med %s" + if old.output: + print _("Scriptlet output:") +diff --git a/yum/history.py b/yum/history.py +index 8983261..50dee0b 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -431,10 +431,14 @@ class YumHistory: --#: ../output.py:1577 -+#: ../output.py:1674 - msgid "--> Populating transaction set with selected packages. Please wait." - msgstr "--> Fyller transaktionsmängden med valda paket. Var god dröj." + for pkg in pkgs.values(): + pid = self.pkg2pid(pkg) ++ if pkg.pkgtup == problem.pkg.pkgtup: ++ main = 'TRUE' ++ else: ++ main = 'FALSE' + res = executeSQL(cur, + """INSERT INTO trans_prob_pkgs +- (rpid, pkgtupid) +- VALUES (?, ?)""", (rpid, pid)) ++ (rpid, pkgtupid, main) ++ VALUES (?, ?, ?)""", (rpid, pid, main)) --#: ../output.py:1581 -+#: ../output.py:1678 - #, python-format - msgid "---> Downloading header for %s to pack into transaction set." - msgstr "---> Hämtar huvud för %s för att paketera i transaktionsmängden." + return rpid --#: ../utils.py:137 ../yummain.py:42 -+#: ../utils.py:93 -+msgid "Running" -+msgstr "Kör" -+ -+#: ../utils.py:94 -+msgid "Sleeping" -+msgstr "Sover" -+ -+#: ../utils.py:95 -+msgid "Uninterruptible" -+msgstr "Oavbrytbar" -+ -+#: ../utils.py:96 -+msgid "Zombie" -+msgstr "Zombie" -+ -+#: ../utils.py:97 -+msgid "Traced/Stopped" -+msgstr "Spårad/Stoppad" -+ -+#: ../utils.py:98 ../yumcommands.py:917 -+msgid "Unknown" -+msgstr "Okänd" -+ -+#: ../utils.py:109 -+msgid " The other application is: PackageKit" -+msgstr " Det andra programmet är: PackageKit" -+ -+#: ../utils.py:111 -+#, python-format -+msgid " The other application is: %s" -+msgstr " Det andra programmet är: %s" +@@ -609,13 +613,14 @@ class YumHistory: + if cur is None or not self._update_db_file_2(): + return [] + executeSQL(cur, +- """SELECT name, arch, epoch, version, release, checksum ++ """SELECT name, arch, epoch, version, release, checksum, main + FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid) + WHERE rpid = ? + ORDER BY name ASC, epoch ASC""", (rpid,)) + ret = [] + for row in cur: + obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) ++ obj.main = row[6] == 'TRUE' + ret.append(obj) + return ret + +@@ -809,7 +814,8 @@ class YumHistory: + \ + CREATE TABLE trans_prob_pkgs ( + rpid INTEGER NOT NULL REFERENCES trans_rpmdb_problems, +- pkgtupid INTEGER NOT NULL REFERENCES pkgtups); ++ pkgtupid INTEGER NOT NULL REFERENCES pkgtups, ++ main BOOL NOT NULL DEFAULT FALSE); + ''', '''\ + \ + CREATE VIEW vtrans_data_pkgs AS +@@ -839,6 +845,7 @@ class YumHistory: + \ + CREATE VIEW vtrans_prob_pkgs AS + SELECT tid,rpid,name,epoch,version,release,arch,pkgtupid, ++ main, + name || '-' || epoch || ':' || + version || '-' || release || '.' || arch AS nevra + FROM (trans_prob_pkgs JOIN trans_rpmdb_problems USING(rpid)) +-- +1.7.0.1 + + +From eb256430ee0cad7a537960ba1cf9381da95258ce Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 6 May 2010 17:12:44 -0400 +Subject: [PATCH 117] Fix the VIEW vtrans_prob_pkgs, for newer sqlite which gets confused. + +--- + yum/history.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index 50dee0b..b37089d 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -844,7 +844,7 @@ class YumHistory: + ''', '''\ + \ + CREATE VIEW vtrans_prob_pkgs AS +- SELECT tid,rpid,name,epoch,version,release,arch,pkgtupid, ++ SELECT tid,rpid,name,epoch,version,release,arch,pkgtups.pkgtupid, + main, + name || '-' || epoch || ':' || + version || '-' || release || '.' || arch AS nevra +-- +1.7.0.1 + + +From 37899b9c170ce1a97cd29be6a0a0322f608c4fd6 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sat, 8 May 2010 17:49:34 -0400 +Subject: [PATCH 118] Add a couple of depsolve tests, from a bug I found updating F-13. + +--- + test/simpleupdatetests.py | 40 ++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 40 insertions(+), 0 deletions(-) + +diff --git a/test/simpleupdatetests.py b/test/simpleupdatetests.py +index f02cc75..8232675 100644 +--- a/test/simpleupdatetests.py ++++ b/test/simpleupdatetests.py +@@ -764,3 +764,43 @@ class SimpleUpdateTests(OperationsTests): + [pa1, pa2, pa4, pa3]) + self.assert_(res=='ok', msg) + self.assertResult((pa1, pa3)) + -+#: ../utils.py:114 -+#, python-format -+msgid " Memory : %5s RSS (%5sB VSZ)" -+msgstr " Minne : %5s RSS (%5s B VSZ)" ++ def testUpdateRLEvince1(self): ++ pi1 = FakePackage('evince', '1', '1', '0', 'x86_64') ++ pi1.addRequires('evince-libs', 'EQ', ('0', '1', '1')) ++ pi2 = FakePackage('evince-libs', '1', '1', '0', 'x86_64') ++ pi3 = FakePackage('evince-djvu', '1', '1', '0', 'x86_64') ++ pi3.addRequires('evince-libs', 'EQ', ('0', '1', '1')) + -+#: ../utils.py:119 -+#, python-format -+msgid " Started: %s - %s ago" -+msgstr " Startade: %s - för %s sedan" ++ pa1 = FakePackage('evince', '2', '1', '0', 'x86_64') ++ pa1.addRequires('evince-libs', 'EQ', ('0', '2', '1')) ++ pa2i = FakePackage('evince-libs', '2', '1', '0', 'i686') ++ pa2x = FakePackage('evince-libs', '2', '1', '0', 'x86_64') ++ pa3 = FakePackage('evince-djvu', '2', '1', '0', 'x86_64') ++ pa3.addRequires('evince-libs', 'EQ', ('0', '2', '1')) + -+#: ../utils.py:121 -+#, python-format -+msgid " State : %s, pid: %d" -+msgstr " Status : %s, pid: %d" ++ res, msg = self.runOperation(['update', 'evince'], ++ [pi1, pi2, pi3], ++ [pa1, pa2x, pa2i, pa3]) ++ self.assert_(res=='ok', msg) ++ self.assertResult((pa1, pa2x, pa3)) + -+#: ../utils.py:199 -+#, python-format -+msgid "PluginExit Error: %s" -+msgstr "Insticksmodulsavslutsfel: %s" ++ def testUpdateRLEvince2(self): ++ pi1 = FakePackage('evince', '1', '1', '0', 'x86_64') ++ pi1.addRequires('evince-libs', 'EQ', ('0', '1', '1')) ++ pi2 = FakePackage('evince-libs', '1', '1', '0', 'x86_64') ++ pi3 = FakePackage('evince-djvu', '1', '1', '0', 'x86_64') ++ pi3.addRequires('evince-libs', 'EQ', ('0', '1', '1')) + -+#: ../utils.py:202 -+#, python-format -+msgid "Yum Error: %s" -+msgstr "Yum-fel: %s" ++ pa1 = FakePackage('evince', '2', '1', '0', 'x86_64') ++ pa1.addRequires('evince-libs', 'EQ', ('0', '2', '1')) ++ pa2i = FakePackage('evince-libs', '2', '1', '0', 'i686') ++ pa2x = FakePackage('evince-libs', '2', '1', '0', 'x86_64') ++ pa3 = FakePackage('evince-djvu', '2', '1', '0', 'x86_64') ++ pa3.addRequires('evince-libs', 'EQ', ('0', '2', '1')) + -+#: ../utils.py:235 ../yummain.py:42 - msgid "" - "\n" - "\n" -@@ -1091,7 +1253,7 @@ msgstr "" - "\n" - "Slutar efter att användaren avbröt" - --#: ../utils.py:143 ../yummain.py:48 -+#: ../utils.py:241 ../yummain.py:48 - msgid "" - "\n" - "\n" -@@ -1101,7 +1263,7 @@ msgstr "" - "\n" - "Slutar med brutet rör (pipe)" - --#: ../utils.py:145 ../yummain.py:50 -+#: ../utils.py:243 ../yummain.py:50 - #, python-format - msgid "" - "\n" -@@ -1112,15 +1274,15 @@ msgstr "" - "\n" - "%s" - --#: ../utils.py:184 ../yummain.py:273 -+#: ../utils.py:282 ../yummain.py:211 - msgid "Complete!" - msgstr "Klart!" - --#: ../yumcommands.py:42 -+#: ../yumcommands.py:43 - msgid "You need to be root to perform this command." - msgstr "Du måste vara root för att utföra detta kommando." - --#: ../yumcommands.py:49 -+#: ../yumcommands.py:50 - msgid "" - "\n" - "You have enabled checking of packages via GPG keys. This is a good thing. \n" -@@ -1151,335 +1313,335 @@ msgstr "" - "\n" - "För mer information, kontakta leverantören av din distribution eller paket.\n" ++ res, msg = self.runOperation(['update', 'evince'], ++ [pi1, pi2, pi3], ++ [pa1, pa2i, pa2x, pa3]) ++ self.assert_(res=='ok', msg) ++ self.assertResult((pa1, pa2x, pa3)) +-- +1.7.0.1 + + +From 1be67b3fa5a15277c94d42c48569edb6b094cb29 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sat, 8 May 2010 17:50:35 -0400 +Subject: [PATCH 119] Add a fix for the _old_ bug, and a comment about another possible fix. + +--- + yum/depsolve.py | 12 +++++++++--- + 1 files changed, 9 insertions(+), 3 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 17b2ce9..eb47587 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -515,8 +515,6 @@ class Depsolve(object): + if pkgmode in ['i', 'u']: + self.verbose_logger.log(logginglevels.DEBUG_2, + _('%s already in ts, skipping this one'), pkg) +- # FIXME: Remove this line, if it is not needed ? +- # checkdeps = 1 + self._last_req = pkg + return checkdeps, missingdep --#: ../yumcommands.py:69 -+#: ../yumcommands.py:70 - #, python-format - msgid "Error: Need to pass a list of pkgs to %s" - msgstr "Fel: Behöver skicka en lista paket till %s" +@@ -527,6 +525,14 @@ class Depsolve(object): + results = self.update(requiringPo=requiringPo, name=pkg.name, + epoch=pkg.epoch, version=pkg.version, + rel=pkg.rel) ++ # Note that this does "interesting" things with multilib. We can ++ # have say A.i686 and A.x86_64, and if we hit "A.i686" first, ++ # .update() will actually update "A.x86_64" which will then fail ++ # the pkg == txmbr.po test below, but then they'll be nothing to ++ # update when we get around to A.x86_64 ... so this entire loop ++ # fails. ++ # Keeping results through the loop and thus. testing each pkg ++ # against all txmbr's from previous runs "fixes" this. + for txmbr in results: + if pkg == txmbr.po: + checkdeps = True +@@ -551,7 +557,6 @@ class Depsolve(object): + return checkdeps, missingdep + + +- + # FIXME - why can't we look up in the transaction set for the requiringPkg + # and know what needs it that way and provide a more sensible dep structure in the txmbr + inst = self.rpmdb.searchNevra(name=best.name, arch=best.arch) +@@ -562,6 +567,7 @@ class Depsolve(object): + txmbr = self.tsInfo.addUpdate(best, inst[0]) + txmbr.setAsDep(po=requiringPo) + txmbr.reason = "dep" ++ checkdeps = True + self._last_req = best + else: + self.verbose_logger.debug(_('TSINFO: Marking %s as install for %s'), best, +-- +1.7.0.1 + + +From a148eb3e854a7c170771b61b3d06f78e46c1e9ce Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sat, 8 May 2010 17:55:02 -0400 +Subject: [PATCH 120] Do the second fix, for the previous testcase. Seems correct, but not 100%. + +--- + yum/depsolve.py | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index eb47587..60b4e2f 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -521,10 +521,11 @@ class Depsolve(object): + # find the best one --#: ../yumcommands.py:75 -+#: ../yumcommands.py:76 - msgid "Error: Need an item to match" - msgstr "Fel: Behöver något att matcha emot" + # try updating the already install pkgs ++ results = [] + for pkg in provSack.returnNewestByName(): +- results = self.update(requiringPo=requiringPo, name=pkg.name, +- epoch=pkg.epoch, version=pkg.version, +- rel=pkg.rel) ++ tresults = self.update(requiringPo=requiringPo, name=pkg.name, ++ epoch=pkg.epoch, version=pkg.version, ++ rel=pkg.rel) + # Note that this does "interesting" things with multilib. We can + # have say A.i686 and A.x86_64, and if we hit "A.i686" first, + # .update() will actually update "A.x86_64" which will then fail +@@ -533,6 +534,7 @@ class Depsolve(object): + # fails. + # Keeping results through the loop and thus. testing each pkg + # against all txmbr's from previous runs "fixes" this. ++ results.extend(tresults) + for txmbr in results: + if pkg == txmbr.po: + checkdeps = True +-- +1.7.0.1 + + +From dace53a1169f0c66c4771f6b9885c12fa6a6a885 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sat, 8 May 2010 18:06:49 -0400 +Subject: [PATCH 121] Fix weird logging error, comma separated values must be expanded + +--- + yum/__init__.py | 14 +++++++------- + 1 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index b7f7702..9546aec 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -3291,7 +3291,7 @@ class YumBase(depsolve.Depsolve): + + for (new, old) in updates: + if self.tsInfo.isObsoleted(pkgtup=old): +- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), ++ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % + old) + else: + tx_return.extend(self.update(po=self.getPackageObject(new))) +@@ -3400,7 +3400,7 @@ class YumBase(depsolve.Depsolve): + txmbr.setAsDep(requiringPo) + tx_return.append(txmbr) + if self.tsInfo.isObsoleted(obsoleted): +- self.verbose_logger.log(logginglevels.DEBUG_2, _('Package is already obsoleted: %s.%s %s:%s-%s'), obsoleted) ++ self.verbose_logger.log(logginglevels.DEBUG_2, _('Package is already obsoleted: %s.%s %s:%s-%s') % obsoleted) + else: + txmbr = self.tsInfo.addObsoleted(obsoleted_pkg, available_pkg) + tx_return.append(txmbr) +@@ -3409,7 +3409,7 @@ class YumBase(depsolve.Depsolve): + for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []): + po = self.getPackageObject(updating) + if self.tsInfo.isObsoleted(installed_pkg.pkgtup): +- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), ++ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % + installed_pkg.pkgtup) + # at this point we are going to mark the pkg to be installed, make sure + # it doesn't obsolete anything. If it does, mark that in the tsInfo, too +@@ -3436,11 +3436,11 @@ class YumBase(depsolve.Depsolve): + continue + for updated in self.up.updating_dict.get(available_pkg.pkgtup, []): + if self.tsInfo.isObsoleted(updated): +- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), ++ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % + updated) + elif self._newer_update_in_trans(updated, available_pkg, + tx_return): +- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s'), ++ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s') % + updated) + + else: +@@ -3462,11 +3462,11 @@ class YumBase(depsolve.Depsolve): --#: ../yumcommands.py:81 -+#: ../yumcommands.py:82 - msgid "Error: Need a group or list of groups" - msgstr "Fel: Behöver en grupp eller lista av grupper" + for ipkg in pot_updated: + if self.tsInfo.isObsoleted(ipkg.pkgtup): +- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), ++ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % + ipkg.pkgtup) + elif self._newer_update_in_trans(ipkg.pkgtup, available_pkg, + tx_return): +- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s'), ++ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s') % + ipkg.pkgtup) + elif ipkg.verLT(available_pkg): + txmbr = self._add_up_txmbr(requiringPo, available_pkg, ipkg) +-- +1.7.0.1 + + +From 720f0141b7f147170bcbf66c19c99b20b8bc4dcb Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sun, 9 May 2010 23:56:23 -0400 +Subject: [PATCH 122] Comment explaining testUpdateRLEvince1 and 2 + +--- + test/simpleupdatetests.py | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/test/simpleupdatetests.py b/test/simpleupdatetests.py +index 8232675..df641f7 100644 +--- a/test/simpleupdatetests.py ++++ b/test/simpleupdatetests.py +@@ -766,6 +766,8 @@ class SimpleUpdateTests(OperationsTests): + self.assertResult((pa1, pa3)) --#: ../yumcommands.py:90 -+#: ../yumcommands.py:91 - #, python-format - msgid "Error: clean requires an option: %s" - msgstr "Fel: clean behöver ett argument: %s" + def testUpdateRLEvince1(self): ++ """ This tests a dep. upgrade from a dep. upgrade, with a multilib. pkg. ++ where only half of the multilib. is installed. """ + pi1 = FakePackage('evince', '1', '1', '0', 'x86_64') + pi1.addRequires('evince-libs', 'EQ', ('0', '1', '1')) + pi2 = FakePackage('evince-libs', '1', '1', '0', 'x86_64') +@@ -786,6 +788,9 @@ class SimpleUpdateTests(OperationsTests): + self.assertResult((pa1, pa2x, pa3)) --#: ../yumcommands.py:95 -+#: ../yumcommands.py:96 - #, python-format - msgid "Error: invalid clean argument: %r" - msgstr "Fel: felaktigt argument till clean: %r" + def testUpdateRLEvince2(self): ++ """ Dito. testUpdateRLEvince1, except here pa2i is before pa2x, and ++ thus. will be seen first by .update() when it does an ++ archless "find". """ + pi1 = FakePackage('evince', '1', '1', '0', 'x86_64') + pi1.addRequires('evince-libs', 'EQ', ('0', '1', '1')) + pi2 = FakePackage('evince-libs', '1', '1', '0', 'x86_64') +-- +1.7.0.1 + + +From 7f381ca91c68dcacc724de918f78c7eee89b12a3 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 13 May 2010 11:51:33 -0400 +Subject: [PATCH 123] Remove "No transaction set" error, for YumLocalPackage + +--- + yum/packages.py | 6 ++++-- + 1 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index ac45518..7b702b3 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -1684,8 +1684,10 @@ class YumLocalPackage(YumHeaderPackage): --#: ../yumcommands.py:108 -+#: ../yumcommands.py:109 - msgid "No argument to shell" - msgstr "Inget argument till skalet" + def __init__(self, ts=None, filename=None): + if ts is None: +- raise Errors.MiscError, \ +- 'No Transaction Set Instance for YumLocalPackage instance creation' ++ # This shouldn't be used "normally" within yum, but is very useful ++ # for small scripts and debugging/etc. ++ ts = rpmUtils.transaction.initReadOnlyTransaction() ++ + if filename is None: + raise Errors.MiscError, \ + 'No Filename specified for YumLocalPackage instance creation' +-- +1.7.0.1 + + +From a6abc59696d0c7c5e265aa3b579fe156ac92e2dc Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 13 May 2010 12:09:18 -0400 +Subject: [PATCH 124] oddball case where rpm coughed up an EMPTY provides entry. + +safe to skip them - also filed a bug with rpm to never let this happen +--- + yum/packages.py | 2 ++ + yum/sqlitesack.py | 2 ++ + 2 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index ac45518..0947c42 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -398,6 +398,8 @@ class RpmBase(object): + if printable: + results = [] + for prco in prcos: ++ if not prco[0]: # empty or none or whatever, doesn't matter ++ continue + results.append(misc.prco_tuple_to_string(prco)) + return results --#: ../yumcommands.py:110 -+#: ../yumcommands.py:111 - #, python-format - msgid "Filename passed to shell: %s" - msgstr "Filnamn skickat till skalet: %s" +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 7873411..84607c6 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -388,6 +388,8 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): + cur = self._sql_MD('primary', sql, (self.pkgKey,)) + self.prco[prcotype] = [ ] + for ob in cur: ++ if not ob['name']: ++ continue + prco_set = (_share_data(ob['name']), _share_data(ob['flags']), + (_share_data(ob['epoch']), + _share_data(ob['version']), +-- +1.7.0.1 + + +From 4707d410a42358709cf6f38de6571983ea63c70d Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 13 May 2010 14:29:34 -0400 +Subject: [PATCH 125] Filter empty provides/etc. in the non-pritable case too. + +--- + yum/packages.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index d603886..4687cd3 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -1233,7 +1233,7 @@ class YumHeaderPackage(YumAvailablePackage): + for tag in tag2prco: + name = hdr[getattr(rpm, 'RPMTAG_%sNAME' % tag)] + name = map(misc.share_data, name) +- if name is None: ++ if not name: # empty or none or whatever, doesn't matter + continue --#: ../yumcommands.py:114 -+#: ../yumcommands.py:115 - #, python-format - msgid "File %s given as argument to shell does not exist." - msgstr "Filen %s som gavs som ett argument till skalet finns inte." + lst = hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)] +-- +1.7.0.1 + + +From a9140a46c780f8b132d955b6393f97bf153caffe Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 13 May 2010 16:20:04 -0400 +Subject: [PATCH 126] Be more paranoid about saving the rpmdb version, it's possible PK could + be doing somethign weird here ... like loading data, hanging around as + user does something in yum (which alters the rpmdb) and then somehow PK + saves the rpmdb version. + I can't see how it's possible though, but two extra stats. for a little + more paranoia doesn't seem out of place. + +--- + yum/rpmsack.py | 20 ++++++++++++++++++++ + 1 files changed, 20 insertions(+), 0 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 1c8bcd5..d6bd5c9 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -184,6 +184,7 @@ class RPMDBPackageSack(PackageSackBase): + self.auto_close = False # this forces a self.ts.close() after + # most operations so it doesn't leave + # any lingering locks. ++ self._cached_rpmdb_mtime = None --#: ../yumcommands.py:120 -+#: ../yumcommands.py:121 - msgid "Error: more than one file given as argument to shell." - msgstr "Fel: mer än en fil angiven som argument till skalet." + self._cache = { + 'provides' : { }, +@@ -230,6 +231,8 @@ class RPMDBPackageSack(PackageSackBase): + } + self._have_cached_rpmdbv_data = None + self._cached_conflicts_data = None ++ self.transactionReset() # Should do nothing, but meh... ++ self._cached_rpmdb_mtime = None --#: ../yumcommands.py:169 -+#: ../yumcommands.py:170 - msgid "PACKAGE..." - msgstr "PAKET..." + def setCacheDir(self, cachedir): + """ Sets the internal cachedir value for the rpmdb, to be the +@@ -861,6 +864,19 @@ class RPMDBPackageSack(PackageSackBase): + if not self.__cache_rpmdb__: + return --#: ../yumcommands.py:172 -+#: ../yumcommands.py:173 - msgid "Install a package or packages on your system" - msgstr "Installera ett eller flera paket på ditt system" ++ if self._cached_rpmdb_mtime is None: ++ return # We haven't loaded any packages!!! ++ ++ rpmdbfname = self.root + "/var/lib/rpm/Packages" ++ if not os.path.exists(rpmdbfname): ++ return # haha ++ ++ _cached_rpmdb_mtime = os.path.getmtime(rpmdbfname) ++ if self._cached_rpmdb_mtime != _cached_rpmdb_mtime: ++ # Something altered the rpmdb since we loaded our first package, ++ # so don't save the rpmdb version as who knows what happened. ++ return ++ + rpmdbvfname = self._cachedir + "/version" + if not os.access(self._cachedir, os.W_OK): + if os.path.exists(self._cachedir): +@@ -1073,6 +1089,10 @@ class RPMDBPackageSack(PackageSackBase): + self._idx2pkg[index] = po + self._name2pkg.setdefault(po.name, []).append(po) + self._tup2pkg[po.pkgtup] = po ++ if self.__cache_rpmdb__ and self._cached_rpmdb_mtime is None: ++ rpmdbfname = self.root + "/var/lib/rpm/Packages" ++ self._cached_rpmdb_mtime = os.path.getmtime(rpmdbfname) ++ + return po + + def _hdr2pkgTuple(self, hdr): +-- +1.7.0.1 + + +From d26c78e7ed4fb564e2bb7e709d8847d27cd82389 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 13 May 2010 17:47:00 -0400 +Subject: [PATCH 127] Deal with bad rpmdb caches better eg. BZ 591382 + +--- + yum/rpmsack.py | 30 +++++++++++++++++++++++++++++- + 1 files changed, 29 insertions(+), 1 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index d6bd5c9..ef3343a 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -518,6 +518,27 @@ class RPMDBPackageSack(PackageSackBase): + rpmdbv = self.simpleVersion(main_only=True)[0] + self._write_conflicts_new(pkgs, rpmdbv) --#: ../yumcommands.py:180 -+#: ../yumcommands.py:181 - msgid "Setting up Install Process" - msgstr "Förbereder installationsprocessen" ++ def _deal_with_bad_rpmdbcache(self, caller): ++ """ This shouldn't be called, but people are hitting weird stuff so ++ we want to deal with it so it doesn't stay broken "forever". """ ++ misc.unlink_f(self._cachedir + "/version") ++ misc.unlink_f(self._cachedir + '/conflicts') ++ misc.unlink_f(self._cachedir + '/file-requires') ++ misc.unlink_f(self._cachedir + '/yumdb-package-checksums') ++ # We have a couple of options here, we can: ++ # ++ # . Ignore it and continue - least invasive, least likely to get any ++ # bugs fixed. ++ # ++ # . Ignore it and continue, when not in debug mode - Helps users doing ++ # weird things (and we won't know), but normal bugs will be seen by ++ # anyone not running directly from a package. ++ # ++ # . Always throw - but at least it shouldn't happen again. ++ # ++ if __debug__: ++ raise Errors.PackageSackError, 'Rpmdb checksum is invalid: %s' % caller ++ + def _read_conflicts(self): + if not self.__cache_rpmdb__: + return None +@@ -550,6 +571,7 @@ class RPMDBPackageSack(PackageSackBase): + if fo.readline() != '': # Should be EOF + return None + except ValueError: ++ self._deal_with_bad_rpmdbcache("conflicts") + return None --#: ../yumcommands.py:191 -+#: ../yumcommands.py:192 - msgid "[PACKAGE...]" - msgstr "[PAKET...]" + self._cached_conflicts_data = ret +@@ -663,6 +685,7 @@ class RPMDBPackageSack(PackageSackBase): + if fo.readline() != '': # Should be EOF + return None, None + except ValueError: ++ self._deal_with_bad_rpmdbcache("file requires") + return None, None --#: ../yumcommands.py:194 -+#: ../yumcommands.py:195 - msgid "Update a package or packages on your system" - msgstr "Uppdatera ett eller flera paket på ditt system" + return iFR, iFP +@@ -800,11 +823,16 @@ class RPMDBPackageSack(PackageSackBase): + if fo.readline() != '': # Should be EOF + return + except ValueError: ++ self._deal_with_bad_rpmdbcache("pkg checksums") + return --#: ../yumcommands.py:201 -+#: ../yumcommands.py:202 - msgid "Setting up Update Process" - msgstr "Förbereder uppdateringsprocessen" + for pkgtup in checksum_data: + (n, a, e, v, r) = pkgtup +- pkg = self.searchNevra(n, e, v, r, a)[0] ++ pkg = self.searchNevra(n, e, v, r, a) ++ if not pkg: ++ self._deal_with_bad_rpmdbcache("pkg checksums") ++ continue ++ pkg = pkg[0] + (T, D) = checksum_data[pkgtup] + if ('checksum_type' in pkg.yumdb_info._read_cached_data or + 'checksum_data' in pkg.yumdb_info._read_cached_data): +-- +1.7.0.1 + + +From 2326d832a915be17b92e61f3198b25a8d28ca7b4 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 14 May 2010 13:26:00 -0400 +Subject: [PATCH 128] Add comment about vtrans_prob_pkgs and old versions of sqlite + +--- + yum/history.py | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index b37089d..d5a167e 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -841,7 +841,9 @@ class YumHistory: + version || '-' || release || '.' || arch AS nevra + FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) + ORDER BY name; +-''', '''\ ++''', # NOTE: Old versions of sqlite don't like this next view, they are only ++ # there for debugging anyway ... but it's worth remembering. ++'''\ + \ + CREATE VIEW vtrans_prob_pkgs AS + SELECT tid,rpid,name,epoch,version,release,arch,pkgtups.pkgtupid, +-- +1.7.0.1 + + +From 7ae7d888e28a8de689fde7f21bb7797709906b78 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?G=C3=B6ran=20Uddeborg?= +Date: Mon, 17 May 2010 14:45:26 +0000 +Subject: [PATCH 129] l10n: Updates to Swedish (sv) translation + +New status: 529 messages complete with 27 fuzzies and 13 untranslated. + +Transmitted-via: Transifex (www.transifex.net). +--- + po/sv.po | 1422 +++++++++++++++++++++++++++++++++++--------------------------- + 1 files changed, 810 insertions(+), 612 deletions(-) + +diff --git a/po/sv.po b/po/sv.po +index 59a2df1..7b0d4ce 100644 +--- a/po/sv.po ++++ b/po/sv.po +@@ -1,49 +1,50 @@ + # Swedish messages for yum +-# Copyright © 2009 Free Software Foundation ++# Copyright © 2009-2010 Free Software Foundation + # This file is distributed under the same license as the yum package. +-# Göran Uddeborg , 2009. ++# Göran Uddeborg , 2009-2010. + # +-# $Id: yum-HEAD.patch,v 1.59 2010/06/11 19:50:20 james Exp $ ++# $Id: yum-HEAD.patch,v 1.59 2010/06/11 19:50:20 james Exp $ + # + msgid "" + msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2009-10-15 15:45+0200\n" +-"PO-Revision-Date: 2009-09-05 16:56+0200\n" ++"POT-Creation-Date: 2010-02-11 10:54-0500\n" ++"PO-Revision-Date: 2010-05-17 16:44+0200\n" + "Last-Translator: Göran Uddeborg \n" + "Language-Team: Swedish \n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" --#: ../yumcommands.py:246 -+#: ../yumcommands.py:244 - msgid "Display details about a package or group of packages" - msgstr "Visa detaljer om ett paket eller en grupp paket" +-#: ../callback.py:48 ../output.py:940 ../yum/rpmtrans.py:71 ++#: ../callback.py:48 ../output.py:947 ../yum/rpmtrans.py:72 + msgid "Updating" + msgstr "Uppdaterar" --#: ../yumcommands.py:295 -+#: ../yumcommands.py:293 - msgid "Installed Packages" - msgstr "Installerade paket" +-#: ../callback.py:49 ../yum/rpmtrans.py:72 ++#: ../callback.py:49 ../yum/rpmtrans.py:73 + msgid "Erasing" + msgstr "Raderar" --#: ../yumcommands.py:303 -+#: ../yumcommands.py:301 - msgid "Available Packages" - msgstr "Tillgängliga paket" +-#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:939 +-#: ../yum/rpmtrans.py:73 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:76 ++#: ../callback.py:50 ../callback.py:51 ../callback.py:53 ../output.py:946 ++#: ../output.py:1659 ../yum/rpmtrans.py:74 ../yum/rpmtrans.py:75 ++#: ../yum/rpmtrans.py:77 + msgid "Installing" + msgstr "Installerar" --#: ../yumcommands.py:307 -+#: ../yumcommands.py:305 - msgid "Extra Packages" - msgstr "Extra paket" +-#: ../callback.py:52 ../callback.py:58 ../yum/rpmtrans.py:75 ++#: ../callback.py:52 ../callback.py:58 ../output.py:1484 ../yum/rpmtrans.py:76 + msgid "Obsoleted" +-msgstr "Låter utgå" ++msgstr "Utfasad" --#: ../yumcommands.py:311 -+#: ../yumcommands.py:309 - msgid "Updated Packages" - msgstr "Uppdaterade paket" +-#: ../callback.py:54 ../output.py:1063 ../output.py:1403 ++#: ../callback.py:54 ../output.py:1070 ../output.py:1442 ../output.py:1491 + msgid "Updated" + msgstr "Uppdaterade" - #. This only happens in verbose mode --#: ../yumcommands.py:319 ../yumcommands.py:326 ../yumcommands.py:603 -+#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 - msgid "Obsoleting Packages" - msgstr "Fasar ut paket" +-#: ../callback.py:55 ../output.py:1399 ++#: ../callback.py:55 ../output.py:1438 + msgid "Erased" + msgstr "Raderade" --#: ../yumcommands.py:328 -+#: ../yumcommands.py:326 - msgid "Recently Added Packages" - msgstr "Nyligen tillagda paket" +-#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1061 +-#: ../output.py:1395 ++#: ../callback.py:56 ../callback.py:57 ../callback.py:59 ../output.py:1068 ++#: ../output.py:1434 ../output.py:1646 + msgid "Installed" + msgstr "Installerade" --#: ../yumcommands.py:335 -+#: ../yumcommands.py:333 - msgid "No matching Packages to list" - msgstr "Inga matchande paket att lista" +@@ -65,68 +66,73 @@ msgstr "Fel: ogiltig utdatatillstånd: %s för %s" + msgid "Erased: %s" + msgstr "Raderade: %s" --#: ../yumcommands.py:349 -+#: ../yumcommands.py:347 - msgid "List a package or groups of packages" - msgstr "Lista ett paket eller en grupp paket" +-#: ../callback.py:217 ../output.py:941 ++#: ../callback.py:217 ../output.py:948 ../output.py:1648 + msgid "Removing" + msgstr "Tar bort" --#: ../yumcommands.py:361 -+#: ../yumcommands.py:359 - msgid "Remove a package or packages from your system" - msgstr "Ta bort ett eller flera paket från ditt system" +-#: ../callback.py:219 ../yum/rpmtrans.py:77 ++#: ../callback.py:219 ../yum/rpmtrans.py:78 + msgid "Cleanup" + msgstr "Rensar upp" --#: ../yumcommands.py:368 -+#: ../yumcommands.py:366 - msgid "Setting up Remove Process" - msgstr "Förbereder processen att ta bort" +-#: ../cli.py:106 ++#: ../cli.py:107 + #, python-format + msgid "Command \"%s\" already defined" + msgstr "Kommando \"%s\" redan definierat" --#: ../yumcommands.py:382 -+#: ../yumcommands.py:380 - msgid "Setting up Group Process" - msgstr "Förbereder grupprocessen" +-#: ../cli.py:118 ++#: ../cli.py:119 + msgid "Setting up repositories" + msgstr "Gör i ordning förråd" --#: ../yumcommands.py:388 -+#: ../yumcommands.py:386 - msgid "No Groups on which to run command" - msgstr "Inga grupper att köra kommandot på" +-#: ../cli.py:129 ++#: ../cli.py:130 + msgid "Reading repository metadata in from local files" + msgstr "Läser in förrådsmetadata från lokala filer" --#: ../yumcommands.py:401 -+#: ../yumcommands.py:399 - msgid "List available package groups" - msgstr "Lista tillgängliga paketgrupper" +-#: ../cli.py:192 ../utils.py:107 ++#: ../cli.py:194 ../utils.py:193 + #, python-format + msgid "Config Error: %s" + msgstr "Konfigurationsfel: %s" --#: ../yumcommands.py:418 -+#: ../yumcommands.py:416 - msgid "Install the packages in a group on your system" - msgstr "Installera paketen i en grupp på ditt system" +-#: ../cli.py:195 ../cli.py:1251 ../utils.py:110 ++#: ../cli.py:197 ../cli.py:1272 ../utils.py:196 + #, python-format + msgid "Options Error: %s" + msgstr "Fel bland flaggor: %s" --#: ../yumcommands.py:440 -+#: ../yumcommands.py:438 - msgid "Remove the packages in a group from your system" - msgstr "Ta bort paketen in en grupp från ditt system" +-#: ../cli.py:223 ++#: ../cli.py:227 + #, python-format + msgid " Installed: %s-%s at %s" + msgstr " Installerade: %s-%s %s" --#: ../yumcommands.py:467 -+#: ../yumcommands.py:465 - msgid "Display details about a package group" - msgstr "Visa detaljer om en paketgrupp" +-#: ../cli.py:225 ++#: ../cli.py:229 + #, python-format + msgid " Built : %s at %s" + msgstr " Byggde : %s %s" --#: ../yumcommands.py:491 -+#: ../yumcommands.py:489 - msgid "Generate the metadata cache" - msgstr "Generera metadata-cache:n" +-#: ../cli.py:227 ++#: ../cli.py:231 + #, python-format + msgid " Committed: %s at %s" + msgstr " Verkställde : %s %s" --#: ../yumcommands.py:497 -+#: ../yumcommands.py:495 - msgid "Making cache files for all metadata files." - msgstr "Skapar cache-filer för alla metadatafiler." +-#: ../cli.py:266 ++#: ../cli.py:270 + msgid "You need to give some command" + msgstr "Du måste ange något kommando" --#: ../yumcommands.py:498 -+#: ../yumcommands.py:496 - msgid "This may take a while depending on the speed of this computer" - msgstr "Detta kan ta ett tag beroende på datorns fart" +-#: ../cli.py:309 ++#: ../cli.py:284 ++#, python-format ++msgid "No such command: %s. Please use %s --help" ++msgstr "Inget sådant kommando: %s. Använd %s --help" ++ ++#: ../cli.py:314 + msgid "Disk Requirements:\n" + msgstr "Diskbehov:\n" --#: ../yumcommands.py:519 -+#: ../yumcommands.py:517 - msgid "Metadata Cache Created" - msgstr "Metadata-cache skapad" +-#: ../cli.py:311 ++#: ../cli.py:316 + #, python-format +-msgid " At least %dMB needed on the %s filesystem.\n" +-msgstr " Åtminstone %d MB behövs på filsystemet %s.\n" ++msgid " At least %dMB more space needed on the %s filesystem.\n" ++msgstr " Åtminstone %d MB mer utrymme behövs på filsystemet %s.\n" --#: ../yumcommands.py:533 -+#: ../yumcommands.py:531 - msgid "Remove cached data" - msgstr "Ta bort cache:ade data" + #. TODO: simplify the dependency errors? + #. Fixup the summary +-#: ../cli.py:316 ++#: ../cli.py:321 + msgid "" + "Error Summary\n" + "-------------\n" +@@ -134,64 +140,60 @@ msgstr "" + "Felsammandrag\n" + "-------------\n" --#: ../yumcommands.py:553 -+#: ../yumcommands.py:551 - msgid "Find what package provides the given value" - msgstr "Ta reda på vilka paket som tillhandahåller det angivna värdet" +-#: ../cli.py:359 ++#: ../cli.py:364 + msgid "Trying to run the transaction but nothing to do. Exiting." + msgstr "Försöker köra transaktionen men det finns inget att göra. Avslutar." --#: ../yumcommands.py:573 -+#: ../yumcommands.py:571 - msgid "Check for available package updates" - msgstr "Leta efter tillgängliga paketuppdateringar" +-#: ../cli.py:395 ++#: ../cli.py:403 + msgid "Exiting on user Command" + msgstr "Avslutar på användarens order" --#: ../yumcommands.py:623 -+#: ../yumcommands.py:621 - msgid "Search package details for the given string" - msgstr "Sök i paketdetaljer efter den angivna strängen" +-#: ../cli.py:399 ++#: ../cli.py:407 + msgid "Downloading Packages:" + msgstr "Hämtar paket:" --#: ../yumcommands.py:629 -+#: ../yumcommands.py:627 - msgid "Searching Packages: " - msgstr "Söker paket: " +-#: ../cli.py:404 ++#: ../cli.py:412 + msgid "Error Downloading Packages:\n" + msgstr "Fel när paket hämtades:\n" --#: ../yumcommands.py:646 -+#: ../yumcommands.py:644 - msgid "Update packages taking obsoletes into account" - msgstr "Uppdatera paket med hänsyn tagen till utfasningar" +-#: ../cli.py:418 ../yum/__init__.py:4014 ++#: ../cli.py:426 ../yum/__init__.py:4195 + msgid "Running rpm_check_debug" + msgstr "Kör rpm_check_debug" --#: ../yumcommands.py:654 -+#: ../yumcommands.py:652 - msgid "Setting up Upgrade Process" - msgstr "Förbereder uppgraderingsprocessen" +-#: ../cli.py:427 ../yum/__init__.py:4023 ++#: ../cli.py:435 ../yum/__init__.py:4204 + msgid "ERROR You need to update rpm to handle:" + msgstr "FEL Du behöver uppdatera rpm för att hantera:" --#: ../yumcommands.py:668 -+#: ../yumcommands.py:666 - msgid "Install a local RPM" - msgstr "Installera en lokal RPM" +-#: ../cli.py:429 ../yum/__init__.py:4026 ++#: ../cli.py:437 ../yum/__init__.py:4207 + msgid "ERROR with rpm_check_debug vs depsolve:" + msgstr "FEL med rpm_check_debug mot depsolve:" --#: ../yumcommands.py:676 -+#: ../yumcommands.py:674 - msgid "Setting up Local Package Process" - msgstr "Förbereder den lokala paketprocessen" +-#: ../cli.py:435 ++#: ../cli.py:443 + msgid "RPM needs to be updated" + msgstr "RPM behöver uppdateras" --#: ../yumcommands.py:695 -+#: ../yumcommands.py:693 - msgid "Determine which package provides the given dependency" - msgstr "Avgör vilket paket som tillhandahåller ett angivet beroende" +-#: ../cli.py:436 ++#: ../cli.py:444 + #, python-format + msgid "Please report this error in %s" + msgstr "Vänligen rapportera detta fel i %s" --#: ../yumcommands.py:698 -+#: ../yumcommands.py:696 - msgid "Searching Packages for Dependency:" - msgstr "Söker i paketen efter beroende:" +-#: ../cli.py:442 ++#: ../cli.py:450 + msgid "Running Transaction Test" + msgstr "Kör transaktionstest" --#: ../yumcommands.py:712 -+#: ../yumcommands.py:710 - msgid "Run an interactive yum shell" - msgstr "Kör ett interactivt yum-skal" +-#: ../cli.py:458 +-msgid "Finished Transaction Test" +-msgstr "Avslutade transaktionstest" +- +-#: ../cli.py:460 ++#: ../cli.py:466 + msgid "Transaction Check Error:\n" + msgstr "Transaktionskontrollfel:\n" --#: ../yumcommands.py:718 -+#: ../yumcommands.py:716 - msgid "Setting up Yum Shell" - msgstr "Förbereder ett yum-skal" +-#: ../cli.py:467 ++#: ../cli.py:473 + msgid "Transaction Test Succeeded" + msgstr "Transaktionskontrollen lyckades" --#: ../yumcommands.py:736 -+#: ../yumcommands.py:734 - msgid "List a package's dependencies" - msgstr "Lista ett pakets beroenden" +-#: ../cli.py:489 ++#: ../cli.py:495 + msgid "Running Transaction" + msgstr "Kör transaktionen" --#: ../yumcommands.py:742 -+#: ../yumcommands.py:740 - msgid "Finding dependencies: " - msgstr "Letar efter beroenden: " +-#: ../cli.py:519 ++#: ../cli.py:525 + msgid "" + "Refusing to automatically import keys when running unattended.\n" + "Use \"-y\" to override." +@@ -199,79 +201,84 @@ msgstr "" + "Vägrar att automatiskt importera nycklar vid oövervakad körning.\n" + "Använd \"-y\" för att åsidosätta." --#: ../yumcommands.py:758 -+#: ../yumcommands.py:756 - msgid "Display the configured software repositories" - msgstr "Visa konfigurerade programvaruförråd" +-#: ../cli.py:538 ../cli.py:572 ++#: ../cli.py:544 ../cli.py:578 + msgid " * Maybe you meant: " + msgstr " * Du kanske menade: " --#: ../yumcommands.py:810 ../yumcommands.py:811 -+#: ../yumcommands.py:822 ../yumcommands.py:823 - msgid "enabled" - msgstr "aktivt" +-#: ../cli.py:555 ../cli.py:563 ++#: ../cli.py:561 ../cli.py:569 + #, python-format + msgid "Package(s) %s%s%s available, but not installed." + msgstr "Paket %s%s%s tillgängliga, men inte installerade." --#: ../yumcommands.py:819 ../yumcommands.py:820 -+#: ../yumcommands.py:849 ../yumcommands.py:850 - msgid "disabled" - msgstr "inaktivt" +-#: ../cli.py:569 ../cli.py:600 ../cli.py:678 ++#: ../cli.py:575 ../cli.py:607 ../cli.py:687 + #, python-format + msgid "No package %s%s%s available." + msgstr "Inget paket %s%s%s tillgängligt." --#: ../yumcommands.py:834 -+#: ../yumcommands.py:866 - msgid "Repo-id : " - msgstr "Förråds-id : " +-#: ../cli.py:605 ../cli.py:738 ++#: ../cli.py:612 ../cli.py:748 + msgid "Package(s) to install" + msgstr "Paket att installera" --#: ../yumcommands.py:835 -+#: ../yumcommands.py:867 - msgid "Repo-name : " - msgstr "Förrådsnamn : " +-#: ../cli.py:606 ../cli.py:684 ../cli.py:717 ../cli.py:739 +-#: ../yumcommands.py:159 ++#: ../cli.py:613 ../cli.py:693 ../cli.py:727 ../cli.py:749 ++#: ../yumcommands.py:160 + msgid "Nothing to do" + msgstr "Inget att göra" --#: ../yumcommands.py:836 -+#: ../yumcommands.py:870 - msgid "Repo-status : " - msgstr "Förrådsstatus : " +-#: ../cli.py:639 ++#: ../cli.py:647 + #, python-format + msgid "%d packages marked for Update" + msgstr "%d paket noterade att uppdateras" --#: ../yumcommands.py:838 -+#: ../yumcommands.py:873 - msgid "Repo-revision: " - msgstr "Förrådsversion : " +-#: ../cli.py:642 ++#: ../cli.py:650 + msgid "No Packages marked for Update" + msgstr "Inga paket noterade att uppdateras" --#: ../yumcommands.py:842 -+#: ../yumcommands.py:877 - msgid "Repo-tags : " - msgstr "Förrådstaggar : " +-#: ../cli.py:656 ++#: ../cli.py:664 + #, python-format + msgid "%d packages marked for removal" + msgstr "%d paket noterade att tas bort" --#: ../yumcommands.py:848 -+#: ../yumcommands.py:883 - msgid "Repo-distro-tags: " - msgstr "Förråds-distro-taggar: " +-#: ../cli.py:659 ++#: ../cli.py:667 + msgid "No Packages marked for removal" + msgstr "Inga paket noterade att tas bort" --#: ../yumcommands.py:853 -+#: ../yumcommands.py:888 - msgid "Repo-updated : " - msgstr "Förråd uppdaterat: " +-#: ../cli.py:683 ++#: ../cli.py:692 + msgid "Package(s) to downgrade" + msgstr "Paket att nedgradera" --#: ../yumcommands.py:855 -+#: ../yumcommands.py:890 - msgid "Repo-pkgs : " - msgstr "Förrådspaket : " +-#: ../cli.py:707 ++#: ../cli.py:717 + #, python-format + msgid " (from %s)" + msgstr " (från %s)" --#: ../yumcommands.py:856 -+#: ../yumcommands.py:891 - msgid "Repo-size : " - msgstr "Förrådstorlek : " +-#: ../cli.py:709 ++#: ../cli.py:719 + #, python-format + msgid "Installed package %s%s%s%s not available." + msgstr "Installerat paket %s%s%s%s inte tillgängligt." --#: ../yumcommands.py:863 -+#: ../yumcommands.py:898 - msgid "Repo-baseurl : " - msgstr "Förrådsbasurl : " +-#: ../cli.py:716 ++#: ../cli.py:726 + msgid "Package(s) to reinstall" + msgstr "Paket att ominstallera" --#: ../yumcommands.py:871 -+#: ../yumcommands.py:906 - msgid "Repo-metalink: " - msgstr "Förrådsmetalänk : " +-#: ../cli.py:729 ++#: ../cli.py:739 + msgid "No Packages Provided" + msgstr "Inga paket angivna" --#: ../yumcommands.py:875 -+#: ../yumcommands.py:910 - msgid " Updated : " - msgstr " Uppdaterat :" +-#: ../cli.py:813 ++#: ../cli.py:818 ++#, python-format ++msgid "Matched: %s" ++msgstr "Matchade: %s" ++ ++#: ../cli.py:825 + #, python-format + msgid "Warning: No matches found for: %s" + msgstr "Varning: Ingen matchning hittades för: %s" --#: ../yumcommands.py:878 -+#: ../yumcommands.py:913 - msgid "Repo-mirrors : " - msgstr "Förrådspeglar : " +-#: ../cli.py:816 ++#: ../cli.py:828 + msgid "No Matches found" + msgstr "Inga matchningar hittades" --#: ../yumcommands.py:882 ../yummain.py:133 --msgid "Unknown" --msgstr "Okänd" -- --#: ../yumcommands.py:888 -+#: ../yumcommands.py:923 +-#: ../cli.py:855 ++#: ../cli.py:868 #, python-format - msgid "Never (last: %s)" - msgstr "Aldrig (senast: %s)" + msgid "" + "Warning: 3.0.x versions of yum would erroneously match against filenames.\n" +@@ -281,108 +288,112 @@ msgstr "" + " Du kan använda \"%s*/%s%s\" och/eller \"%s*bin/%s%s\" för att få detta " + "beteende" --#: ../yumcommands.py:890 -+#: ../yumcommands.py:925 +-#: ../cli.py:871 ++#: ../cli.py:884 #, python-format - msgid "Instant (last: %s)" - msgstr "Omedelbart (senast: %s)" + msgid "No Package Found for %s" + msgstr "Inga paket hittades för %s" --#: ../yumcommands.py:893 -+#: ../yumcommands.py:928 - #, python-format - msgid "%s second(s) (last: %s)" - msgstr "%s sekunder (senast: %s)" +-#: ../cli.py:883 ++#: ../cli.py:896 + msgid "Cleaning up Everything" + msgstr "Rensar upp allt" --#: ../yumcommands.py:895 -+#: ../yumcommands.py:930 - msgid "Repo-expire : " - msgstr "Förråd går ut : " +-#: ../cli.py:897 ++#: ../cli.py:912 + msgid "Cleaning up Headers" + msgstr "Rensar upp huvuden" --#: ../yumcommands.py:898 -+#: ../yumcommands.py:933 - msgid "Repo-exclude : " - msgstr "Förråd utesluter : " +-#: ../cli.py:900 ++#: ../cli.py:915 + msgid "Cleaning up Packages" + msgstr "Rensar upp paket" --#: ../yumcommands.py:902 -+#: ../yumcommands.py:937 - msgid "Repo-include : " - msgstr "Förråd inkluderar: " +-#: ../cli.py:903 ++#: ../cli.py:918 + msgid "Cleaning up xml metadata" + msgstr "Rensar upp xml-metadata" -+#: ../yumcommands.py:941 -+msgid "Repo-excluded: " -+msgstr "Förråd uteslutet : " +-#: ../cli.py:906 ++#: ../cli.py:921 + msgid "Cleaning up database cache" + msgstr "Rensar upp databas-cache" + +-#: ../cli.py:909 ++#: ../cli.py:924 + msgid "Cleaning up expire-cache metadata" + msgstr "Rensar upp expire-cache-metadata" + +-#: ../cli.py:912 ++#: ../cli.py:927 ++msgid "Cleaning up cached rpmdb data" ++msgstr "Rensar upp cachad rpmdb-data" + - #. Work out the first (id) and last (enabled/disalbed/count), - #. then chop the middle (name)... --#: ../yumcommands.py:912 ../yumcommands.py:938 -+#: ../yumcommands.py:951 ../yumcommands.py:980 - msgid "repo id" - msgstr "förråds-id" ++#: ../cli.py:930 + msgid "Cleaning up plugins" + msgstr "Rensar upp insticksmoduler" --#: ../yumcommands.py:926 ../yumcommands.py:927 ../yumcommands.py:941 -+#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 - msgid "status" - msgstr "status" +-#: ../cli.py:937 ++#: ../cli.py:955 + msgid "Installed Groups:" + msgstr "Installerade grupper:" --#: ../yumcommands.py:939 -+#: ../yumcommands.py:981 - msgid "repo name" - msgstr "förrådsnamn" +-#: ../cli.py:949 ++#: ../cli.py:967 + msgid "Available Groups:" + msgstr "Tillgängliga grupper:" --#: ../yumcommands.py:965 -+#: ../yumcommands.py:1018 - msgid "Display a helpful usage message" - msgstr "Visa ett hjälpsamt meddelande om användning" +-#: ../cli.py:959 ++#: ../cli.py:977 + msgid "Done" + msgstr "Klart" --#: ../yumcommands.py:999 -+#: ../yumcommands.py:1052 +-#: ../cli.py:970 ../cli.py:988 ../cli.py:994 ../yum/__init__.py:2629 ++#: ../cli.py:988 ../cli.py:1006 ../cli.py:1012 ../yum/__init__.py:2788 #, python-format - msgid "No help available for %s" - msgstr "Ingen hjälp tillgänglig för %s" + msgid "Warning: Group %s does not exist." + msgstr "Varning: Grupp %s finns inte." --#: ../yumcommands.py:1004 -+#: ../yumcommands.py:1057 - msgid "" - "\n" - "\n" -@@ -1489,7 +1651,7 @@ msgstr "" - "\n" - "alias: " +-#: ../cli.py:998 ++#: ../cli.py:1016 + msgid "No packages in any requested group available to install or update" + msgstr "" + "Inget paket i någon begärd grupp är tillgängligt för installation eller " + "uppdatering" --#: ../yumcommands.py:1006 -+#: ../yumcommands.py:1059 - msgid "" - "\n" - "\n" -@@ -1499,148 +1661,98 @@ msgstr "" - "\n" - "alias: " +-#: ../cli.py:1000 ++#: ../cli.py:1018 + #, python-format + msgid "%d Package(s) to Install" + msgstr "%d paket att installera" --#: ../yumcommands.py:1034 -+#: ../yumcommands.py:1087 - msgid "Setting up Reinstall Process" - msgstr "Förbereder ominstallationsprocessen" +-#: ../cli.py:1010 ../yum/__init__.py:2641 ++#: ../cli.py:1028 ../yum/__init__.py:2800 + #, python-format + msgid "No group named %s exists" + msgstr "Ingen grupp med namnet %s finns" --#: ../yumcommands.py:1042 -+#: ../yumcommands.py:1095 - msgid "reinstall a package" - msgstr "ominstallera ett paket" +-#: ../cli.py:1016 ++#: ../cli.py:1034 + msgid "No packages to remove from groups" + msgstr "Inget paket att ta bort från grupper" --#: ../yumcommands.py:1060 -+#: ../yumcommands.py:1113 - msgid "Setting up Downgrade Process" - msgstr "Förbereder nedgraderingsprocessen" +-#: ../cli.py:1018 ++#: ../cli.py:1036 + #, python-format + msgid "%d Package(s) to remove" + msgstr "%d paket att ta bort" --#: ../yumcommands.py:1067 -+#: ../yumcommands.py:1120 - msgid "downgrade a package" - msgstr "nedgradera ett paket" +-#: ../cli.py:1060 ++#: ../cli.py:1078 + #, python-format + msgid "Package %s is already installed, skipping" + msgstr "Paket %s är redan installerat, hoppar över" --#: ../yumcommands.py:1081 -+#: ../yumcommands.py:1134 - msgid "Display a version for the machine and/or available repos." - msgstr "Visa en version för maskinen och/eller tillgängliga förråd." +-#: ../cli.py:1071 ++#: ../cli.py:1089 + #, python-format + msgid "Discarding non-comparable pkg %s.%s" + msgstr "Kastar ojämförbart paket %s.%s" --#: ../yumcommands.py:1111 -+#: ../yumcommands.py:1173 - msgid " Yum version groups:" --msgstr "" -+msgstr " Yum versionsgrupper:" + #. we've not got any installed that match n or n+a +-#: ../cli.py:1097 ++#: ../cli.py:1115 + #, python-format + msgid "No other %s installed, adding to list for potential install" + msgstr "" + "Ingen annat %s installerat, lägger till listan för potentiell installation" --#: ../yumcommands.py:1121 --#, fuzzy -+#: ../yumcommands.py:1183 - msgid " Group :" --msgstr " Grupp-id: %s" -+msgstr " Grupp:" +-#: ../cli.py:1117 ++#: ../cli.py:1135 + msgid "Plugin Options" + msgstr "Insticksmodulsalternativ" + +-#: ../cli.py:1125 ++#: ../cli.py:1143 + #, python-format + msgid "Command line error: %s" + msgstr "Kommandoradsfel: %s" --#: ../yumcommands.py:1122 --#, fuzzy -+#: ../yumcommands.py:1184 - msgid " Packages:" --msgstr "Paket" -+msgstr " Paket:" +-#: ../cli.py:1138 ++#: ../cli.py:1156 + #, python-format + msgid "" + "\n" +@@ -393,106 +404,114 @@ msgstr "" + "\n" + "%s: flaggan %s behöver ett argument" --#: ../yumcommands.py:1152 -+#: ../yumcommands.py:1213 - msgid "Installed:" - msgstr "Installerade:" +-#: ../cli.py:1191 ++#: ../cli.py:1209 + msgid "--color takes one of: auto, always, never" + msgstr "--color tar en av: auto, always, never" --#: ../yumcommands.py:1157 --#, fuzzy -+#: ../yumcommands.py:1218 - msgid "Group-Installed:" --msgstr "Installerade:" -+msgstr "Gruppinstallerade:" +-#: ../cli.py:1298 ++#: ../cli.py:1319 + msgid "show this help message and exit" + msgstr "visa detta hjälpmeddelande och avsluta" --#: ../yumcommands.py:1166 -+#: ../yumcommands.py:1227 - msgid "Available:" - msgstr "Tillgängliga:" +-#: ../cli.py:1302 ++#: ../cli.py:1323 + msgid "be tolerant of errors" + msgstr "var tolerant vid fel" --#: ../yumcommands.py:1172 --#, fuzzy -+#: ../yumcommands.py:1233 - msgid "Group-Available:" --msgstr "Tillgängliga:" -+msgstr "Grupptillgängliga:" +-#: ../cli.py:1304 +-msgid "run entirely from cache, don't update cache" +-msgstr "kör helt från cache, uppdatera inte cachen" ++#: ../cli.py:1326 ++msgid "run entirely from system cache, don't update cache" ++msgstr "kör helt från systemets cache, uppdatera inte cachen" --#: ../yumcommands.py:1211 -+#: ../yumcommands.py:1272 - msgid "Display, or use, the transaction history" --msgstr "" -+msgstr "Visa, eller använd, transaktionshistorien" +-#: ../cli.py:1306 ++#: ../cli.py:1329 + msgid "config file location" + msgstr "konfigurationsfilens plats" --#: ../yumcommands.py:1239 -+#: ../yumcommands.py:1300 - #, python-format - msgid "Invalid history sub-command, use: %s." --msgstr "" -- --#: ../yummain.py:128 --msgid "Running" --msgstr "Kör" -+msgstr "Ogiltigt underkommando till history, använd: %s." +-#: ../cli.py:1308 ++#: ../cli.py:1332 + msgid "maximum command wait time" + msgstr "maximal tid att vänta på kommandon" --#: ../yummain.py:129 --msgid "Sleeping" --msgstr "Sover" -- --#: ../yummain.py:130 --msgid "Uninteruptable" --msgstr "Oavbrytbar" -+#: ../yumcommands.py:1345 -+msgid "Check for problems in the rpmdb" -+msgstr "Kontrollera om det finns problem i rpmdb:n" +-#: ../cli.py:1310 ++#: ../cli.py:1334 + msgid "debugging output level" + msgstr "nivå på felsökningsutskrifter" --#: ../yummain.py:131 --msgid "Zombie" --msgstr "Zombie" -- --#: ../yummain.py:132 --msgid "Traced/Stopped" --msgstr "Spårad/Stoppad" -- --#: ../yummain.py:137 --msgid " The other application is: PackageKit" --msgstr " Det andra programmet är: PackageKit" -- --#: ../yummain.py:139 --#, python-format --msgid " The other application is: %s" --msgstr " Det andra programmet är: %s" -- --#: ../yummain.py:142 --#, python-format --msgid " Memory : %5s RSS (%5sB VSZ)" --msgstr " Minne : %5s RSS (%5s B VSZ)" -- --#: ../yummain.py:146 --#, python-format --msgid " Started: %s - %s ago" --msgstr " Startade: %s - för %s sedan" -- --#: ../yummain.py:148 --#, python-format --msgid " State : %s, pid: %d" --msgstr " Status : %s, pid: %d" -- --#: ../yummain.py:173 -+#: ../yummain.py:102 - msgid "" - "Another app is currently holding the yum lock; waiting for it to exit..." - msgstr "" - "Ett annat program håller för närvarande yum-låset, väntar på att den skall " - "avsluta ..." +-#: ../cli.py:1314 ++#: ../cli.py:1338 + msgid "show duplicates, in repos, in list/search commands" + msgstr "visa dubletter, i förråd, i list-/search-kommandon" --#: ../yummain.py:201 ../yummain.py:240 -+#: ../yummain.py:130 ../yummain.py:169 - #, python-format - msgid "Error: %s" - msgstr "Fel: %s" +-#: ../cli.py:1316 ++#: ../cli.py:1340 + msgid "error output level" + msgstr "nivå på felutskrifter" --#: ../yummain.py:211 ../yummain.py:253 -+#: ../yummain.py:140 ../yummain.py:182 - #, python-format - msgid "Unknown Error(s): Exit Code: %d:" - msgstr "Okänt fel: Felkod: %d:" +-#: ../cli.py:1319 ++#: ../cli.py:1343 ++msgid "debugging output level for rpm" ++msgstr "nivå på felsökningsutskrifter för rpm" ++ ++#: ../cli.py:1346 + msgid "quiet operation" + msgstr "tyst operation" - #. Depsolve stage --#: ../yummain.py:218 -+#: ../yummain.py:147 - msgid "Resolving Dependencies" - msgstr "Löser upp beroenden" +-#: ../cli.py:1321 ++#: ../cli.py:1348 + msgid "verbose operation" + msgstr "utförlig operation" --#: ../yummain.py:242 -+#: ../yummain.py:173 - msgid " You could try using --skip-broken to work around the problem" - msgstr " Du kan försöka använda --skip-broken för att gå runt problemet" +-#: ../cli.py:1323 ++#: ../cli.py:1350 + msgid "answer yes for all questions" + msgstr "svara ja på alla frågor" --#: ../yummain.py:243 --msgid "" --" You could try running: package-cleanup --problems\n" --" package-cleanup --dupes\n" --" rpm -Va --nofiles --nodigest" --msgstr "" --" Du kan försöka köra: package-cleanup --problems\n" --" package-cleanup --dupes\n" --" rpm -Va --nofiles --nodigest" -+#: ../yummain.py:175 ../yummain.py:208 -+msgid " You could try running: rpm -Va --nofiles --nodigest" -+msgstr " Du kan försöka köra: rpm -Va --nofiles --nodigest" +-#: ../cli.py:1325 ++#: ../cli.py:1352 + msgid "show Yum version and exit" + msgstr "visa Yum-version och avsluta" --#: ../yummain.py:259 -+#: ../yummain.py:188 - msgid "" - "\n" - "Dependencies Resolved" -@@ -1648,7 +1760,7 @@ msgstr "" - "\n" - "Beroenden upplösta" +-#: ../cli.py:1326 ++#: ../cli.py:1353 + msgid "set install root" + msgstr "ange installationsrot" --#: ../yummain.py:326 -+#: ../yummain.py:265 - msgid "" - "\n" - "\n" -@@ -1686,170 +1798,165 @@ msgstr "Potentiell match av %s från %s" - msgid "Matched %s to require for %s" - msgstr "Matchade %s mot behov från %s" +-#: ../cli.py:1330 ++#: ../cli.py:1357 + msgid "enable one or more repositories (wildcards allowed)" + msgstr "aktivera ett eller flera förråd (jokrertecken tillåts)" --#: ../yum/depsolve.py:224 -+#: ../yum/depsolve.py:225 - #, python-format - msgid "Member: %s" - msgstr "Medlem: %s" +-#: ../cli.py:1334 ++#: ../cli.py:1361 + msgid "disable one or more repositories (wildcards allowed)" + msgstr "inaktivera ett eller flera förråd (jokertecken tillåts)" --#: ../yum/depsolve.py:238 ../yum/depsolve.py:749 -+#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 - #, python-format - msgid "%s converted to install" - msgstr "%s konverterad till att installera" +-#: ../cli.py:1337 ++#: ../cli.py:1364 + msgid "exclude package(s) by name or glob" + msgstr "uteslut paket via namn eller mönster" --#: ../yum/depsolve.py:245 -+#: ../yum/depsolve.py:246 - #, python-format - msgid "Adding Package %s in mode %s" - msgstr "Lägger till paket %s i läge %s" +-#: ../cli.py:1339 ++#: ../cli.py:1366 + msgid "disable exclude from main, for a repo or for everything" + msgstr "inaktivera uteslutningar från main, för ett förråd, eller för allt" --#: ../yum/depsolve.py:255 -+#: ../yum/depsolve.py:256 - #, python-format - msgid "Removing Package %s" - msgstr "Tar bort paket %s" +-#: ../cli.py:1342 ++#: ../cli.py:1369 + msgid "enable obsoletes processing during updates" + msgstr "aktivera bearbetning av utfasningar under uppdateringar" --#: ../yum/depsolve.py:277 -+#: ../yum/depsolve.py:278 - #, python-format - msgid "%s requires: %s" - msgstr "%s behöver: %s" +-#: ../cli.py:1344 ++#: ../cli.py:1371 + msgid "disable Yum plugins" + msgstr "inaktivera Yum-insticksmoduler" --#: ../yum/depsolve.py:335 -+#: ../yum/depsolve.py:319 -+#, python-format -+msgid "%s requires %s" -+msgstr "%s behöver %s" -+ -+#: ../yum/depsolve.py:346 - msgid "Needed Require has already been looked up, cheating" - msgstr "Nödvändigt behov har redan slagits upp, fuskar" +-#: ../cli.py:1346 ++#: ../cli.py:1373 + msgid "disable gpg signature checking" + msgstr "inaktivera kontroll av gpg-signatur" --#: ../yum/depsolve.py:345 -+#: ../yum/depsolve.py:356 - #, python-format - msgid "Needed Require is not a package name. Looking up: %s" - msgstr "Nödvändigt behov är inte ett paketnamn. Slår upp: %s" +-#: ../cli.py:1348 ++#: ../cli.py:1375 + msgid "disable plugins by name" + msgstr "inaktivera insticksmoduler efter namn" --#: ../yum/depsolve.py:352 -+#: ../yum/depsolve.py:363 - #, python-format - msgid "Potential Provider: %s" - msgstr "Potentiell tillhandahållare: %s" +-#: ../cli.py:1351 ++#: ../cli.py:1378 + msgid "enable plugins by name" + msgstr "aktivera insticksmoduler efter namn" --#: ../yum/depsolve.py:375 -+#: ../yum/depsolve.py:386 - #, python-format - msgid "Mode is %s for provider of %s: %s" - msgstr "Läget är %s för tillhandahållare av %s: %s" +-#: ../cli.py:1354 ++#: ../cli.py:1381 + msgid "skip packages with depsolving problems" + msgstr "hoppa över paket med problem vid beroendeupplösning" --#: ../yum/depsolve.py:379 -+#: ../yum/depsolve.py:390 - #, python-format - msgid "Mode for pkg providing %s: %s" - msgstr "Läge för paket som tillhandahåller %s: %s" +-#: ../cli.py:1356 ++#: ../cli.py:1383 + msgid "control whether color is used" + msgstr "styr om färg skall användas" --#: ../yum/depsolve.py:383 -+#: ../yum/depsolve.py:394 - #, python-format - msgid "TSINFO: %s package requiring %s marked as erase" - msgstr "TSINFO: paket %s behöver %s noteras att raderas" ++#: ../cli.py:1385 ++msgid "set value of $releasever in yum config and repo files" ++msgstr "sätt värdet på $releasever i yum-konfigurations- och repo-filer" ++ + #: ../output.py:305 + msgid "Jan" + msgstr "jan" +@@ -545,105 +564,104 @@ msgstr "dec" + msgid "Trying other mirror." + msgstr "Försöker med en annan spegel." --#: ../yum/depsolve.py:396 -+#: ../yum/depsolve.py:407 +-#: ../output.py:538 ++#: ../output.py:534 #, python-format - msgid "TSINFO: Obsoleting %s with %s to resolve dep." - msgstr "TSINFO: Fasar ut %s med %s för att lösa upp beroenden." + msgid "Name : %s%s%s" + msgstr "Namn : %s%s%s" --#: ../yum/depsolve.py:399 -+#: ../yum/depsolve.py:410 +-#: ../output.py:539 ++#: ../output.py:535 #, python-format - msgid "TSINFO: Updating %s to resolve dep." - msgstr "TSINFO: Uppdaterar %s för att lösa upp beroenden" + msgid "Arch : %s" + msgstr "Arkitektur : %s" --#: ../yum/depsolve.py:407 -+#: ../yum/depsolve.py:418 +-#: ../output.py:541 ++#: ../output.py:537 #, python-format - msgid "Cannot find an update path for dep for: %s" - msgstr "Hittar ingen uppdateringsväg för beroende för: %s" + msgid "Epoch : %s" + msgstr "Epok : %s" --#: ../yum/depsolve.py:417 --#, python-format --msgid "Unresolvable requirement %s for %s" --msgstr "Ej upplösbart behov %s för %s" -- --#: ../yum/depsolve.py:440 -+#: ../yum/depsolve.py:449 +-#: ../output.py:542 ++#: ../output.py:538 #, python-format - msgid "Quick matched %s to require for %s" - msgstr "Snabb matcning av %s mot behov för %s" + msgid "Version : %s" + msgstr "Version : %s" - #. is it already installed? --#: ../yum/depsolve.py:482 -+#: ../yum/depsolve.py:491 +-#: ../output.py:543 ++#: ../output.py:539 #, python-format - msgid "%s is in providing packages but it is already installed, removing." - msgstr "" - "%s finns bland tillhandahållande paket men det är redan installerat, tar " - "bort." + msgid "Release : %s" + msgstr "Utgåva : %s" --#: ../yum/depsolve.py:498 -+#: ../yum/depsolve.py:507 +-#: ../output.py:544 ++#: ../output.py:540 #, python-format - msgid "Potential resolving package %s has newer instance in ts." - msgstr "Potentiellt upplösande paket %s har nyare instans i ts." + msgid "Size : %s" + msgstr "Storlek : %s" --#: ../yum/depsolve.py:509 -+#: ../yum/depsolve.py:518 +-#: ../output.py:545 ++#: ../output.py:541 #, python-format - msgid "Potential resolving package %s has newer instance installed." - msgstr "Potentiellt upplösande paket %s har nyare instans installerad." + msgid "Repo : %s" + msgstr "Förråd : %s" --#: ../yum/depsolve.py:517 ../yum/depsolve.py:563 --#, python-format --msgid "Missing Dependency: %s is needed by package %s" --msgstr "Saknat beroende: %s behövs av paketet %s" -- --#: ../yum/depsolve.py:530 -+#: ../yum/depsolve.py:536 +-#: ../output.py:547 ++#: ../output.py:543 #, python-format - msgid "%s already in ts, skipping this one" - msgstr "%s är redan i ts, hoppar över denna" + msgid "From repo : %s" + msgstr "Från förråd: %s" --#: ../yum/depsolve.py:573 -+#: ../yum/depsolve.py:578 +-#: ../output.py:549 ++#: ../output.py:545 #, python-format - msgid "TSINFO: Marking %s as update for %s" - msgstr "TSINFO: Noterar %s som en uppdatering av %s" + msgid "Committer : %s" + msgstr "Verkställare: %s" --#: ../yum/depsolve.py:581 -+#: ../yum/depsolve.py:586 +-#: ../output.py:550 ++#: ../output.py:546 #, python-format - msgid "TSINFO: Marking %s as install for %s" - msgstr "TSINFO: Noterar %s som en installation av %s" - --#: ../yum/depsolve.py:685 ../yum/depsolve.py:767 -+#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 - msgid "Success - empty transaction" - msgstr "Klart - tom transaktion" - --#: ../yum/depsolve.py:724 ../yum/depsolve.py:739 -+#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 - msgid "Restarting Loop" - msgstr "Startar om slingan" + msgid "Committime : %s" + msgstr "Verkställt : %s" --#: ../yum/depsolve.py:755 -+#: ../yum/depsolve.py:760 - msgid "Dependency Process ending" - msgstr "Beroendeprocessen avslutas" +-#: ../output.py:551 ++#: ../output.py:547 + #, python-format + msgid "Buildtime : %s" + msgstr "Byggt : %s" --#: ../yum/depsolve.py:761 -+#: ../yum/depsolve.py:774 +-#: ../output.py:553 ++#: ../output.py:549 #, python-format - msgid "%s from %s has depsolving problems" - msgstr "%s från %s har problem att lösa beroenden" + msgid "Installtime: %s" + msgstr "Installerat: %s" --#: ../yum/depsolve.py:768 -+#: ../yum/depsolve.py:782 - msgid "Success - deps resolved" - msgstr "Klart - beroenden upplösta" +-#: ../output.py:554 ++#: ../output.py:550 + msgid "Summary : " + msgstr "Sammandrag : " --#: ../yum/depsolve.py:782 -+#: ../yum/depsolve.py:796 +-#: ../output.py:556 ++#: ../output.py:552 #, python-format - msgid "Checking deps for %s" - msgstr "Kontrollerar beroenden för %s" + msgid "URL : %s" + msgstr "URL : %s" --#: ../yum/depsolve.py:865 -+#: ../yum/depsolve.py:874 - #, python-format - msgid "looking for %s as a requirement of %s" - msgstr "letar efter %s som ett behov för %s" +-#: ../output.py:557 +-#, python-format +-msgid "License : %s" +-msgstr "Licens : %s" ++#: ../output.py:553 ++msgid "License : " ++msgstr "Licens : " --#: ../yum/depsolve.py:1007 -+#: ../yum/depsolve.py:1090 - #, python-format - msgid "Running compare_providers() for %s" - msgstr "Kör compare_providers() för %s" +-#: ../output.py:558 ++#: ../output.py:554 + msgid "Description: " + msgstr "Beskrivning: " --#: ../yum/depsolve.py:1041 ../yum/depsolve.py:1047 -+#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 - #, python-format - msgid "better arch in po %s" - msgstr "bättre arkitektur i po %s" +-#: ../output.py:626 ++#: ../output.py:622 + msgid "y" + msgstr "j" --#: ../yum/depsolve.py:1142 -+#: ../yum/depsolve.py:1218 - #, python-format - msgid "%s obsoletes %s" - msgstr "%s fasar ut %s" +-#: ../output.py:626 ++#: ../output.py:622 + msgid "yes" + msgstr "ja" --#: ../yum/depsolve.py:1154 -+#: ../yum/depsolve.py:1230 - #, python-format - msgid "" - "archdist compared %s to %s on %s\n" -@@ -1858,103 +1965,122 @@ msgstr "" - "arkitekturavstånd jämför %s med %s på %s\n" - " Vinnare: %s" +-#: ../output.py:627 ++#: ../output.py:623 + msgid "n" + msgstr "n" --#: ../yum/depsolve.py:1161 -+#: ../yum/depsolve.py:1237 - #, python-format - msgid "common sourcerpm %s and %s" - msgstr "samma käll-rpm %s och %s" +-#: ../output.py:627 ++#: ../output.py:623 + msgid "no" + msgstr "nej" --#: ../yum/depsolve.py:1167 -+#: ../yum/depsolve.py:1241 -+#, python-format -+msgid "base package %s is installed for %s" -+msgstr "baspaket %s är installerat för %s" -+ -+#: ../yum/depsolve.py:1247 - #, python-format - msgid "common prefix of %s between %s and %s" - msgstr "gemensamt prefix för %s mellan %s och %s" +-#: ../output.py:631 ++#: ../output.py:627 + msgid "Is this ok [y/N]: " + msgstr "Är detta ok [j/N]: " --#: ../yum/depsolve.py:1175 -+#: ../yum/depsolve.py:1256 +-#: ../output.py:722 ++#: ../output.py:715 #, python-format - msgid "Best Order: %s" - msgstr "Bästa ordning: %s" + msgid "" + "\n" +@@ -652,150 +670,151 @@ msgstr "" + "\n" + "Grupp: %s" --#: ../yum/__init__.py:187 -+#: ../yum/__init__.py:192 - msgid "doConfigSetup() will go away in a future version of Yum.\n" - msgstr "doConfigSetup() kommer att försvinna i en framtida version av Yum.\n" +-#: ../output.py:726 ++#: ../output.py:719 + #, python-format + msgid " Group-Id: %s" + msgstr " Grupp-id: %s" --#: ../yum/__init__.py:412 -+#: ../yum/__init__.py:424 +-#: ../output.py:731 ++#: ../output.py:724 #, python-format - msgid "Repository %r is missing name in configuration, using id" - msgstr "Förrådet %r saknar namn i konfigurationen, använder id" + msgid " Description: %s" + msgstr " Beskrivning: %s" --#: ../yum/__init__.py:450 -+#: ../yum/__init__.py:462 - msgid "plugins already initialised" - msgstr "insticksmoduler redan initierade" +-#: ../output.py:733 ++#: ../output.py:726 + msgid " Mandatory Packages:" + msgstr " Obligatoriska paket:" --#: ../yum/__init__.py:457 -+#: ../yum/__init__.py:469 - msgid "doRpmDBSetup() will go away in a future version of Yum.\n" - msgstr "doRpmDBSetup() kommer att försvinna i en framtida version av Yum.\n" +-#: ../output.py:734 ++#: ../output.py:727 + msgid " Default Packages:" + msgstr " Standardpaket:" --#: ../yum/__init__.py:468 -+#: ../yum/__init__.py:480 - msgid "Reading Local RPMDB" - msgstr "Läser lokal RPMDB" +-#: ../output.py:735 ++#: ../output.py:728 + msgid " Optional Packages:" + msgstr " Valfria paket:" --#: ../yum/__init__.py:489 -+#: ../yum/__init__.py:504 - msgid "doRepoSetup() will go away in a future version of Yum.\n" - msgstr "doRepoSetup() kommer att försvinna i en framtida version av Yum.\n" +-#: ../output.py:736 ++#: ../output.py:729 + msgid " Conditional Packages:" + msgstr " Villkorliga paket:" --#: ../yum/__init__.py:509 -+#: ../yum/__init__.py:524 - msgid "doSackSetup() will go away in a future version of Yum.\n" - msgstr "doSackSetup() kommer att försvinna i en framtida version av Yum.\n" +-#: ../output.py:756 ++#: ../output.py:749 + #, python-format + msgid "package: %s" + msgstr "paket: %s" --#: ../yum/__init__.py:539 -+#: ../yum/__init__.py:554 - msgid "Setting up Package Sacks" - msgstr "Förbereder paketsäckar" +-#: ../output.py:758 ++#: ../output.py:751 + msgid " No dependencies for this package" + msgstr " Inga beroenden för detta paket" --#: ../yum/__init__.py:584 -+#: ../yum/__init__.py:599 +-#: ../output.py:763 ++#: ../output.py:756 #, python-format - msgid "repo object for repo %s lacks a _resetSack method\n" - msgstr "förrådsobjekt för förrådet %s saknar en _resetSack-metod\n" - --#: ../yum/__init__.py:585 -+#: ../yum/__init__.py:600 - msgid "therefore this repo cannot be reset.\n" - msgstr "därför kan inte detta förråd återställas.\n" + msgid " dependency: %s" + msgstr " beroende: %s" --#: ../yum/__init__.py:590 -+#: ../yum/__init__.py:605 - msgid "doUpdateSetup() will go away in a future version of Yum.\n" - msgstr "doUpdateSetup() kommer att försvinna i en framtida version av Yum.\n" +-#: ../output.py:765 ++#: ../output.py:758 + msgid " Unsatisfied dependency" + msgstr " Ej uppfyllt beroende" --#: ../yum/__init__.py:602 -+#: ../yum/__init__.py:617 - msgid "Building updates object" - msgstr "Bygger uppdateringsobjekt" +-#: ../output.py:837 ++#: ../output.py:830 + #, python-format + msgid "Repo : %s" + msgstr "Förråd : %s" --#: ../yum/__init__.py:637 -+#: ../yum/__init__.py:652 - msgid "doGroupSetup() will go away in a future version of Yum.\n" - msgstr "doGroupSetup() kommer att försvinna i en framtida version av Yum.\n" +-#: ../output.py:838 ++#: ../output.py:831 + msgid "Matched from:" + msgstr "Matchat från:" --#: ../yum/__init__.py:662 -+#: ../yum/__init__.py:677 - msgid "Getting group metadata" - msgstr "Hämtar gruppmetadata" +-#: ../output.py:847 ++#: ../output.py:840 + msgid "Description : " + msgstr "Beskrivning : " --#: ../yum/__init__.py:688 -+#: ../yum/__init__.py:703 +-#: ../output.py:850 ++#: ../output.py:843 #, python-format - msgid "Adding group file from repository: %s" - msgstr "Lägger till gruppfil från förrådet: %s" + msgid "URL : %s" + msgstr "URL : %s" --#: ../yum/__init__.py:697 -+#: ../yum/__init__.py:712 +-#: ../output.py:853 ++#: ../output.py:846 #, python-format - msgid "Failed to add groups file for repository: %s - %s" - msgstr "Kunde inte lägga till gruppfil för förrådet: %s - %s" - --#: ../yum/__init__.py:703 -+#: ../yum/__init__.py:718 - msgid "No Groups Available in any repository" - msgstr "Inga grupper tillgängliga i något förråd" - --#: ../yum/__init__.py:763 -+#: ../yum/__init__.py:730 -+msgid "Getting pkgtags metadata" -+msgstr "Hämtar pakettaggsmetadata" -+ -+#: ../yum/__init__.py:740 -+#, python-format -+msgid "Adding tags from repository: %s" -+msgstr "Lägger till taggar från förrådet: %s" -+ -+#: ../yum/__init__.py:749 -+#, python-format -+msgid "Failed to add Pkg Tags for repository: %s - %s" -+msgstr "Kunde inte lägga till pakettaggar för förrådet: %s - %s" -+ -+#: ../yum/__init__.py:827 - msgid "Importing additional filelist information" - msgstr "Importerar ytterligare fillisteinformation" + msgid "License : %s" + msgstr "Licens : %s" --#: ../yum/__init__.py:777 -+#: ../yum/__init__.py:841 +-#: ../output.py:856 ++#: ../output.py:849 #, python-format - msgid "The program %s%s%s is found in the yum-utils package." - msgstr "Programmet %s%s%s finns i paketet yum-utils." + msgid "Filename : %s" + msgstr "Filnamn : %s" --#: ../yum/__init__.py:785 -+#: ../yum/__init__.py:849 - msgid "" - "There are unfinished transactions remaining. You might consider running yum-" - "complete-transaction first to finish them." -@@ -1962,17 +2088,18 @@ msgstr "" - "Det finns oavslutade transaktioner kvar. Du kan överväga att köra " - "yumcomplete-transaction först för att avsluta dem." +-#: ../output.py:860 ++#: ../output.py:853 + msgid "Other : " + msgstr "Övrigt : " --#: ../yum/__init__.py:853 -+#. Kind of hacky -+#: ../yum/__init__.py:922 - #, python-format - msgid "Skip-broken round %i" - msgstr "Hoppa-över-trasiga runda %i" +-#: ../output.py:893 ++#: ../output.py:896 + msgid "There was an error calculating total download size" + msgstr "Ett fel uppstod vid beräkningen av total storlek att hämta" --#: ../yum/__init__.py:906 -+#: ../yum/__init__.py:975 +-#: ../output.py:898 ++#: ../output.py:901 #, python-format - msgid "Skip-broken took %i rounds " - msgstr "Hoppa-över-trasiga tog %i rundor " - --#: ../yum/__init__.py:907 -+#: ../yum/__init__.py:976 - msgid "" - "\n" - "Packages skipped because of dependency problems:" -@@ -1980,78 +2107,91 @@ msgstr "" - "\n" - "Paket hoppades över på grund av beroendeproblem:" + msgid "Total size: %s" + msgstr "Total storlek: %s" --#: ../yum/__init__.py:911 -+#: ../yum/__init__.py:980 +-#: ../output.py:901 ++#: ../output.py:904 #, python-format - msgid " %s from %s" - msgstr " %s från %s" + msgid "Total download size: %s" + msgstr "Total storlek att hämta: %s" --#: ../yum/__init__.py:1083 -+#: ../yum/__init__.py:1121 -+msgid "Warning: RPMDB altered outside of yum." -+msgstr "Varning: RPMDB ändrad utanför yum." -+ -+#: ../yum/__init__.py:1126 -+msgid "missing requires" -+msgstr "saknade behov" -+ -+#: ../yum/__init__.py:1127 -+msgid "installed conflict" -+msgstr "installerade konflikter" +-#: ../output.py:942 ++#: ../output.py:908 ++#, python-format ++msgid "Installed size: %s" ++msgstr "Installerad storlek: %s" + -+#: ../yum/__init__.py:1180 - msgid "" - "Warning: scriptlet or other non-fatal errors occurred during transaction." - msgstr "" - "Varning: skript- eller annat icke ödesdigert fel inträffade under " - "transaktionen." ++#: ../output.py:949 + msgid "Reinstalling" + msgstr "Ominstallerar" --#: ../yum/__init__.py:1101 -+#: ../yum/__init__.py:1198 - #, python-format - msgid "Failed to remove transaction file %s" - msgstr "Kunde inte ta bort transaktionsfilen %s" +-#: ../output.py:943 ++#: ../output.py:950 + msgid "Downgrading" + msgstr "Nedgraderar" - #. maybe a file log here, too - #. but raising an exception is not going to do any good --#: ../yum/__init__.py:1130 -+#: ../yum/__init__.py:1227 - #, python-format - msgid "%s was supposed to be installed but is not!" - msgstr "%s skulle installerats men gjordes det inte!" +-#: ../output.py:944 ++#: ../output.py:951 + msgid "Installing for dependencies" + msgstr "Installerar på grund av beroenden" - #. maybe a file log here, too - #. but raising an exception is not going to do any good --#: ../yum/__init__.py:1169 -+#: ../yum/__init__.py:1266 - #, python-format - msgid "%s was supposed to be removed but is not!" - msgstr "%s skulle tagits bort men det gjordes inte!" +-#: ../output.py:945 ++#: ../output.py:952 + msgid "Updating for dependencies" + msgstr "Uppdaterar på grund av beroenden" - #. Whoa. What the heck happened? --#: ../yum/__init__.py:1289 -+#: ../yum/__init__.py:1386 - #, python-format - msgid "Unable to check if PID %s is active" - msgstr "Kan inte kontrollera om PID %s är aktiv" +-#: ../output.py:946 ++#: ../output.py:953 + msgid "Removing for dependencies" + msgstr "Tar bort på grund av beroenden" - #. Another copy seems to be running. --#: ../yum/__init__.py:1293 -+#: ../yum/__init__.py:1390 - #, python-format - msgid "Existing lock %s: another copy is running as pid %s." - msgstr "Existerande lås %s: en annan kopia kör som pid %s." +-#: ../output.py:953 ../output.py:1065 ++#: ../output.py:960 ../output.py:1072 + msgid "Skipped (dependency problems)" + msgstr "Hoppas över (beroendeproblem)" - #. Whoa. What the heck happened? --#: ../yum/__init__.py:1328 -+#: ../yum/__init__.py:1425 - #, python-format - msgid "Could not create lock at %s: %s " --msgstr "" -+msgstr "Kunde inte skapa lås av %s: %s " +-#: ../output.py:976 ++#: ../output.py:983 + msgid "Package" + msgstr "Paket" --#: ../yum/__init__.py:1373 --msgid "Package does not match intended download" --msgstr "Paketet matchar inte avsedd det avsett att laddas ner" -+#: ../yum/__init__.py:1470 -+msgid "" -+"Package does not match intended download. Suggestion: run yum clean metadata" -+msgstr "Paketet matchar inte den avsedda hämtningen. Förslag: kör yum clean metadata" +-#: ../output.py:976 ++#: ../output.py:983 + msgid "Arch" + msgstr "Ark" --#: ../yum/__init__.py:1388 -+#: ../yum/__init__.py:1486 - msgid "Could not perform checksum" - msgstr "Kunde inte utföra kontrollsummering" +-#: ../output.py:977 ++#: ../output.py:984 + msgid "Version" + msgstr "Version" --#: ../yum/__init__.py:1391 -+#: ../yum/__init__.py:1489 - msgid "Package does not match checksum" - msgstr "Paketet stämmer inte med kontrollsumman" +-#: ../output.py:977 ++#: ../output.py:984 + msgid "Repository" + msgstr "Förråd" --#: ../yum/__init__.py:1433 -+#: ../yum/__init__.py:1531 - #, python-format - msgid "package fails checksum but caching is enabled for %s" - msgstr "paketet misslyckas med kontrollsumman men cachning är aktiverat för %s" +-#: ../output.py:978 ++#: ../output.py:985 + msgid "Size" + msgstr "Storl." --#: ../yum/__init__.py:1436 ../yum/__init__.py:1465 -+#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 +-#: ../output.py:990 ++#: ../output.py:997 #, python-format - msgid "using local copy of %s" - msgstr "använder lokal kopia av %s" +-msgid "" +-" replacing %s%s%s.%s %s\n" +-"\n" +-msgstr "" +-" ersätter %s%s%s.%s %s\n" +-"\n" ++msgid " replacing %s%s%s.%s %s\n" ++msgstr " ersätter %s%s%s.%s %s\n" --#: ../yum/__init__.py:1477 -+#: ../yum/__init__.py:1575 +-#: ../output.py:999 ++#: ../output.py:1006 #, python-format msgid "" - "Insufficient space in download directory %s\n" -@@ -2062,11 +2202,11 @@ msgstr "" - " * fritt %s\n" - " * behovet %s" - --#: ../yum/__init__.py:1526 -+#: ../yum/__init__.py:1624 - msgid "Header is not complete." - msgstr "Huvudet är inte komplett." + "\n" +@@ -806,7 +825,7 @@ msgstr "" + "Transaktionssammanfattning\n" + "%s\n" --#: ../yum/__init__.py:1563 -+#: ../yum/__init__.py:1661 +-#: ../output.py:1006 ++#: ../output.py:1013 #, python-format msgid "" - "Header not in local cache and caching-only mode enabled. Cannot download %s" -@@ -2074,64 +2214,64 @@ msgstr "" - "Huvudet finns inte i den lokala cachen och endast-cache-läget är aktiverat. " - "Kan inte hämta %s" - --#: ../yum/__init__.py:1618 -+#: ../yum/__init__.py:1716 - #, python-format - msgid "Public key for %s is not installed" - msgstr "Den publika nyckeln för %s är inte installerad" + "Install %5.5s Package(s)\n" +@@ -815,7 +834,7 @@ msgstr "" + "Installerar %5.5s Paket\n" + "Uppdaterar %5.5s Paket\n" --#: ../yum/__init__.py:1622 -+#: ../yum/__init__.py:1720 +-#: ../output.py:1015 ++#: ../output.py:1022 #, python-format - msgid "Problem opening package %s" - msgstr "Problem att öppna paketet %s" + msgid "" + "Remove %5.5s Package(s)\n" +@@ -826,32 +845,32 @@ msgstr "" + "Ominstallerar %5.5s Paket\n" + "Nedgraderar %5.5s Paket\n" --#: ../yum/__init__.py:1630 -+#: ../yum/__init__.py:1728 - #, python-format - msgid "Public key for %s is not trusted" - msgstr "Den publika nyckeln för %s är inte betrodd" +-#: ../output.py:1059 ++#: ../output.py:1066 + msgid "Removed" + msgstr "Borttagna" --#: ../yum/__init__.py:1634 -+#: ../yum/__init__.py:1732 - #, python-format - msgid "Package %s is not signed" - msgstr "Paket %s är inte signerat" +-#: ../output.py:1060 ++#: ../output.py:1067 + msgid "Dependency Removed" + msgstr "Borttagna beroenden" --#: ../yum/__init__.py:1672 -+#: ../yum/__init__.py:1770 - #, python-format - msgid "Cannot remove %s" - msgstr "Det går inte att ta bort %s" +-#: ../output.py:1062 ++#: ../output.py:1069 + msgid "Dependency Installed" + msgstr "Installerade beroenden" --#: ../yum/__init__.py:1676 -+#: ../yum/__init__.py:1774 - #, python-format - msgid "%s removed" - msgstr "%s borttaget" +-#: ../output.py:1064 ++#: ../output.py:1071 + msgid "Dependency Updated" + msgstr "Uppdaterade beroenden" - # Första %s blir ett oöversatt engelskt ord. - # Felrapporterat: http://yum.baseurl.org/ticket/41 --#: ../yum/__init__.py:1712 -+#: ../yum/__init__.py:1820 - #, python-format - msgid "Cannot remove %s file %s" - msgstr "Det går inte att ta bort %s-filen %s" +-#: ../output.py:1066 ++#: ../output.py:1073 + msgid "Replaced" + msgstr "Ersatte" --#: ../yum/__init__.py:1716 -+#: ../yum/__init__.py:1824 - #, python-format - msgid "%s file %s removed" - msgstr "%s-filen %s borttagen" +-#: ../output.py:1067 ++#: ../output.py:1074 + msgid "Failed" + msgstr "Misslyckade" --#: ../yum/__init__.py:1718 -+#: ../yum/__init__.py:1826 - #, python-format - msgid "%d %s files removed" - msgstr "%d %s-filer borttagna" + #. Delta between C-c's so we treat as exit +-#: ../output.py:1133 ++#: ../output.py:1140 + msgid "two" + msgstr "två" --#: ../yum/__init__.py:1787 -+#: ../yum/__init__.py:1895 +@@ -859,7 +878,7 @@ msgstr "två" + #. Current download cancelled, interrupt (ctrl-c) again within two seconds + #. to exit. + #. Where "interupt (ctrl-c) again" and "two" are highlighted. +-#: ../output.py:1144 ++#: ../output.py:1151 #, python-format - msgid "More than one identical match in sack for %s" - msgstr "Mer än en identisk matchning i säcken för %s" + msgid "" + "\n" +@@ -871,217 +890,362 @@ msgstr "" + " Aktuell nedladdning avbröts, %savbryt (ctrl-c) igen%s inom %s%s%s sekunder\n" + "för att avsluta.\n" --#: ../yum/__init__.py:1793 -+#: ../yum/__init__.py:1901 - #, python-format - msgid "Nothing matches %s.%s %s:%s-%s from update" - msgstr "Ingenting matchar %s.%s %s:%s-%s från uppdateringarna" +-#: ../output.py:1155 ++#: ../output.py:1162 + msgid "user interrupt" + msgstr "avbrott från användaren" --#: ../yum/__init__.py:2026 -+#: ../yum/__init__.py:2180 - msgid "" - "searchPackages() will go away in a future version of " - "Yum. Use searchGenerator() instead. \n" -@@ -2139,181 +2279,181 @@ msgstr "" - "searchPackages() kommer att försvinna i en framtida version av " - "Yum. Använd searchGenerator() istället. \n" +-#: ../output.py:1173 ++#: ../output.py:1180 + msgid "Total" + msgstr "Totalt" --#: ../yum/__init__.py:2065 -+#: ../yum/__init__.py:2219 - #, python-format - msgid "Searching %d packages" - msgstr "Söker i %d paket" ++#: ../output.py:1202 ++msgid "I" ++msgstr "I" ++ + #: ../output.py:1203 +-msgid "" +-msgstr "" ++msgid "O" ++msgstr "UF" --#: ../yum/__init__.py:2069 -+#: ../yum/__init__.py:2223 - #, python-format - msgid "searching package %s" - msgstr "söker i paketet %s" + #: ../output.py:1204 ++msgid "E" ++msgstr "R" ++ ++#: ../output.py:1205 ++msgid "R" ++msgstr "O" ++ ++#: ../output.py:1206 ++msgid "D" ++msgstr "N" ++ ++#: ../output.py:1207 ++msgid "U" ++msgstr "U" ++ ++#: ../output.py:1217 ++msgid "" ++msgstr "" ++ ++#: ../output.py:1218 + msgid "System" +-msgstr "" ++msgstr "System" --#: ../yum/__init__.py:2081 -+#: ../yum/__init__.py:2235 - msgid "searching in file entries" - msgstr "söker i filposter" +-#: ../output.py:1240 ++#: ../output.py:1254 + msgid "Bad transaction IDs, or package(s), given" +-msgstr "" ++msgstr "Felaktiga transaktions ID:n, eller paket, angivna" --#: ../yum/__init__.py:2088 -+#: ../yum/__init__.py:2242 - msgid "searching in provides entries" - msgstr "söker i tillhandahållandeposter" +-#: ../output.py:1284 ../yumcommands.py:1149 ../yum/__init__.py:1067 +-msgid "Warning: RPMDB has been altered since the last yum transaction." +-msgstr "" ++#: ../output.py:1266 ++msgid "ID" ++msgstr "ID" ++ ++#: ../output.py:1267 ../output.py:1520 ++msgid "Login user" ++msgstr "Inloggad användare" --#: ../yum/__init__.py:2121 -+#: ../yum/__init__.py:2275 - #, python-format - msgid "Provides-match: %s" - msgstr "Tillhandahållandematchning: %s" +-#: ../output.py:1289 ++#: ../output.py:1268 ++msgid "Date and time" ++msgstr "Datum och tid" ++ ++#: ../output.py:1269 ../output.py:1522 ++msgid "Action(s)" ++msgstr "Åtgärd(er)" ++ ++#: ../output.py:1270 ../output.py:1523 ++msgid "Altered" ++msgstr "Ändrade" ++ ++#: ../output.py:1310 + msgid "No transaction ID given" +-msgstr "" ++msgstr "Inget transaktions-ID angivet" --#: ../yum/__init__.py:2170 -+#: ../yum/__init__.py:2324 - msgid "No group data available for configured repositories" - msgstr "Inga gruppdata är tillgängliga för de konfigurerade förråden" +-#: ../output.py:1297 ++#: ../output.py:1336 + msgid "Bad transaction ID given" +-msgstr "" ++msgstr "Felaktigt transaktions-ID angivet" --#: ../yum/__init__.py:2201 ../yum/__init__.py:2220 ../yum/__init__.py:2251 --#: ../yum/__init__.py:2257 ../yum/__init__.py:2336 ../yum/__init__.py:2340 --#: ../yum/__init__.py:2655 -+#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 -+#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 -+#: ../yum/__init__.py:2814 - #, python-format - msgid "No Group named %s exists" - msgstr "Det finns ingen grupp med namnet %s" +-#: ../output.py:1302 +-#, fuzzy ++#: ../output.py:1341 + msgid "Not found given transaction ID" +-msgstr "Kör transaktionen" ++msgstr "Hittade inte angivet transaktions-ID" --#: ../yum/__init__.py:2232 ../yum/__init__.py:2353 -+#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 - #, python-format - msgid "package %s was not marked in group %s" - msgstr "paket %s noterades inte i gruppen %s" +-#: ../output.py:1310 ++#: ../output.py:1349 + msgid "Found more than one transaction ID!" +-msgstr "" ++msgstr "Hittade mer än ett transaktions-ID!" --#: ../yum/__init__.py:2279 -+#: ../yum/__init__.py:2433 - #, python-format - msgid "Adding package %s from group %s" - msgstr "Lägger till paket %s från grupp %s" +-#: ../output.py:1331 ++#: ../output.py:1370 + msgid "No transaction ID, or package, given" +-msgstr "" ++msgstr "Inget transaktions-ID, eller paket, angivet" --#: ../yum/__init__.py:2283 -+#: ../yum/__init__.py:2437 - #, python-format - msgid "No package named %s available to be installed" - msgstr "Inget paket med namnet %s är tillgängligt för installation" +-#: ../output.py:1357 +-#, fuzzy ++#: ../output.py:1396 + msgid "Transaction ID :" +-msgstr "Transaktionskontrollfel:\n" ++msgstr "Transaktions-ID:" --#: ../yum/__init__.py:2380 -+#: ../yum/__init__.py:2539 - #, python-format - msgid "Package tuple %s could not be found in packagesack" - msgstr "Pakettupel %s fanns inte i paketsäcken" +-#: ../output.py:1359 ++#: ../output.py:1398 + msgid "Begin time :" +-msgstr "" ++msgstr "Starttid :" --#: ../yum/__init__.py:2399 +-#: ../output.py:1362 ../output.py:1364 ++#: ../output.py:1401 ../output.py:1403 + msgid "Begin rpmdb :" +-msgstr "" ++msgstr "Start-rpmdb :" + +-#: ../output.py:1378 -#, fuzzy, python-format -+#: ../yum/__init__.py:2558 ++#: ../output.py:1417 +#, python-format - msgid "Package tuple %s could not be found in rpmdb" --msgstr "Pakettupel %s fanns inte i paketsäcken" -+msgstr "Pakettupel %s fanns inte i rpmdb" + msgid "(%s seconds)" +-msgstr "%s sekunder (senast: %s)" ++msgstr "(%s sekunder)" --#: ../yum/__init__.py:2455 ../yum/__init__.py:2505 -+#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 - msgid "Invalid version flag" - msgstr "Ogiltig versionsflagga" +-#: ../output.py:1379 +-#, fuzzy ++#: ../output.py:1418 + msgid "End time :" +-msgstr "Övrigt : " ++msgstr "Sluttid : " --#: ../yum/__init__.py:2475 ../yum/__init__.py:2480 -+#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 - #, python-format - msgid "No Package found for %s" - msgstr "Inga paket hittades för %s" +-#: ../output.py:1382 ../output.py:1384 ++#: ../output.py:1421 ../output.py:1423 + msgid "End rpmdb :" +-msgstr "" ++msgstr "Slut-rpmdb :" --#: ../yum/__init__.py:2696 -+#: ../yum/__init__.py:2855 - msgid "Package Object was not a package object instance" - msgstr "Paketobjektet var inte en paketobjektinstans" +-#: ../output.py:1385 +-#, fuzzy ++#: ../output.py:1424 + msgid "User :" +-msgstr "URL : %s" ++msgstr "Användare :" --#: ../yum/__init__.py:2700 -+#: ../yum/__init__.py:2859 - msgid "Nothing specified to install" - msgstr "Inget angivet att installeras" +-#: ../output.py:1387 ../output.py:1389 ../output.py:1391 ++#: ../output.py:1426 ../output.py:1428 ../output.py:1430 + msgid "Return-Code :" +-msgstr "" ++msgstr "Returkod :" --#: ../yum/__init__.py:2716 ../yum/__init__.py:3489 -+#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 - #, python-format - msgid "Checking for virtual provide or file-provide for %s" - msgstr "" - "Kontrollerar virtuella tillhandahållanden eller filtillhandahållanden för %s" +-#: ../output.py:1387 +-#, fuzzy ++#: ../output.py:1426 + msgid "Aborted" +-msgstr "Låter utgå" ++msgstr "Avbruten" --#: ../yum/__init__.py:2722 ../yum/__init__.py:3037 ../yum/__init__.py:3205 --#: ../yum/__init__.py:3495 -+#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 -+#: ../yum/__init__.py:3658 - #, python-format - msgid "No Match for argument: %s" - msgstr "Ingen matchning för argument: %s" +-#: ../output.py:1389 +-#, fuzzy ++#: ../output.py:1428 + msgid "Failure:" +-msgstr "Misslyckade" ++msgstr "Misslyckades:" + +-#: ../output.py:1391 ++#: ../output.py:1430 + msgid "Success" +-msgstr "" ++msgstr "Lyckades" + +-#: ../output.py:1392 +-#, fuzzy ++#: ../output.py:1431 + msgid "Transaction performed with:" +-msgstr "Transaktionskontrollfel:\n" ++msgstr "Transaktionen utförd med:" + +-#: ../output.py:1405 +-#, fuzzy ++#: ../output.py:1444 ../output.py:1489 + msgid "Downgraded" +-msgstr "Nedgraderar" ++msgstr "Nedgraderade" --#: ../yum/__init__.py:2798 -+#: ../yum/__init__.py:2957 - #, python-format - msgid "Package %s installed and not available" - msgstr "Paket %s installerat och inte tillgänligt" + #. multiple versions installed, both older and newer +-#: ../output.py:1407 ++#: ../output.py:1446 + msgid "Weird" +-msgstr "" ++msgstr "Mystisk" --#: ../yum/__init__.py:2801 -+#: ../yum/__init__.py:2960 - msgid "No package(s) available to install" - msgstr "Inga paket tillgängliga att installera" +-#: ../output.py:1409 +-#, fuzzy ++#: ../output.py:1448 + msgid "Packages Altered:" +-msgstr "Inga paket angivna" ++msgstr "Ändrade paket:" --#: ../yum/__init__.py:2813 -+#: ../yum/__init__.py:2972 - #, python-format - msgid "Package: %s - already in transaction set" - msgstr "Paket: %s - redan i transaktionsmängden" +-#: ../output.py:1412 ++#: ../output.py:1451 + msgid "Scriptlet output:" +-msgstr "" ++msgstr "Skriptutdata:" --#: ../yum/__init__.py:2839 -+#: ../yum/__init__.py:2998 - #, python-format - msgid "Package %s is obsoleted by %s which is already installed" - msgstr "Paket %s fasas ut av %s, som redan är installerat" +-#: ../output.py:1418 +-#, fuzzy ++#: ../output.py:1457 + msgid "Errors:" +-msgstr "Fel: %s" ++msgstr "Fel:" --#: ../yum/__init__.py:2842 -+#: ../yum/__init__.py:3001 - #, python-format - msgid "Package %s is obsoleted by %s, trying to install %s instead" - msgstr "Paket %s fasas ut av %s, försöker installera %s istället" +-#: ../output.py:1489 +-msgid "Last day" +-msgstr "" ++#: ../output.py:1481 ../output.py:1482 ++msgid "Install" ++msgstr "Installation" ++ ++#: ../output.py:1483 ++msgid "Dep-Install" ++msgstr "Ber-inst" ++ ++#: ../output.py:1485 ++msgid "Obsoleting" ++msgstr "Fasar ut" ++ ++#: ../output.py:1486 ++msgid "Erase" ++msgstr "Radering" ++ ++#: ../output.py:1487 ++msgid "Reinstall" ++msgstr "Ominstallation" ++ ++#: ../output.py:1488 ++msgid "Downgrade" ++msgstr "Nedgradering" --#: ../yum/__init__.py:2850 -+#: ../yum/__init__.py:3009 - #, python-format - msgid "Package %s already installed and latest version" --msgstr "Paket %s är redan installerast och senaste version" -+msgstr "Paket %s är redan installerat och senaste version" + #: ../output.py:1490 ++msgid "Update" ++msgstr "Uppdatering" ++ ++#: ../output.py:1521 ++msgid "Time" ++msgstr "Tid" ++ ++#: ../output.py:1547 ++msgid "Last day" ++msgstr "Senaste dag" ++ ++#: ../output.py:1548 + msgid "Last week" +-msgstr "" ++msgstr "Senaste vecka" --#: ../yum/__init__.py:2864 -+#: ../yum/__init__.py:3023 - #, python-format - msgid "Package matching %s already installed. Checking for update." - msgstr "Paket som matchar %s är redan installerat. Letar efter uppdatering." +-#: ../output.py:1491 ++#: ../output.py:1549 + msgid "Last 2 weeks" + msgstr "" - #. update everything (the easy case) --#: ../yum/__init__.py:2966 -+#: ../yum/__init__.py:3126 - msgid "Updating Everything" - msgstr "Uppdaterar allt" + #. US default :p +-#: ../output.py:1492 ++#: ../output.py:1550 + msgid "Last 3 months" + msgstr "" --#: ../yum/__init__.py:2987 ../yum/__init__.py:3102 ../yum/__init__.py:3129 --#: ../yum/__init__.py:3155 -+#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 -+#: ../yum/__init__.py:3315 - #, python-format - msgid "Not Updating Package that is already obsoleted: %s.%s %s:%s-%s" - msgstr "Uppdaterar inte paket som redan är utfasade: %s.%s %s:%s-%s" +-#: ../output.py:1493 ++#: ../output.py:1551 + msgid "Last 6 months" + msgstr "" --#: ../yum/__init__.py:3022 ../yum/__init__.py:3202 -+#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 - #, python-format - msgid "%s" - msgstr "%s" +-#: ../output.py:1494 ++#: ../output.py:1552 + msgid "Last year" + msgstr "" --#: ../yum/__init__.py:3093 -+#: ../yum/__init__.py:3253 - #, python-format - msgid "Package is already obsoleted: %s.%s %s:%s-%s" - msgstr "Paketet är redan utfasat: %s.%s %s:%s-%s" +-#: ../output.py:1495 ++#: ../output.py:1553 + msgid "Over a year ago" + msgstr "" --#: ../yum/__init__.py:3124 -+#: ../yum/__init__.py:3284 - #, python-format - msgid "Not Updating Package that is obsoleted: %s" --msgstr "Uppdaterar inte paket som är utfasade: %s" -+msgstr "Uppdaterar inte paket som fasas ut: %s" +-#: ../output.py:1524 ++#: ../output.py:1585 + msgid "installed" + msgstr "installeras" --#: ../yum/__init__.py:3133 ../yum/__init__.py:3159 -+#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 - #, python-format - msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s" - msgstr "Uppdaterar inte paket som redan är uppdaterat: %s.%s %s:%s-%s" +-#: ../output.py:1525 ++#: ../output.py:1586 + msgid "updated" + msgstr "uppdateras" --#: ../yum/__init__.py:3218 -+#: ../yum/__init__.py:3378 - msgid "No package matched to remove" --msgstr "Inget paket matchar att tas bort" -+msgstr "Inget paket att tas bort matchar" +-#: ../output.py:1526 ++#: ../output.py:1587 + msgid "obsoleted" +-msgstr "fasas ut" ++msgstr "utfasas" --#: ../yum/__init__.py:3251 ../yum/__init__.py:3349 ../yum/__init__.py:3432 -+#: ../yum/__init__.py:3412 - #, python-format --msgid "Cannot open file: %s. Skipping." --msgstr "Det går inte att öppna filen: %s. Hoppar över." -+msgid "Cannot open: %s. Skipping." -+msgstr "Det går inte att öppna: %s. Hoppar över." +-#: ../output.py:1527 ++#: ../output.py:1588 + msgid "erased" + msgstr "raderas" --#: ../yum/__init__.py:3254 ../yum/__init__.py:3352 ../yum/__init__.py:3435 -+#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 +-#: ../output.py:1531 ++#: ../output.py:1592 #, python-format - msgid "Examining %s: %s" - msgstr "Undersöker %s: %s" + msgid "---> Package %s.%s %s:%s-%s set to be %s" + msgstr "---> Paket %s.%s %s:%s-%s satt till att %s" --#: ../yum/__init__.py:3262 ../yum/__init__.py:3355 ../yum/__init__.py:3438 -+#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 - #, python-format - msgid "Cannot add package %s to transaction. Not a compatible architecture: %s" - msgstr "" - "Kan inte lägga till paket %s till transaktionen. Inte en kompatibel " - "arkitektur: %s" +-#: ../output.py:1538 ++#: ../output.py:1599 + msgid "--> Running transaction check" + msgstr "--> Kör transaktionskontroll" --#: ../yum/__init__.py:3270 -+#: ../yum/__init__.py:3431 - #, python-format - msgid "" - "Package %s not installed, cannot update it. Run yum install to install it " -@@ -2322,98 +2462,108 @@ msgstr "" - "Paket %s är inte installerat, kan inte uppdatera det. Kör yum install för " - "att installera det istället." +-#: ../output.py:1543 ++#: ../output.py:1604 + msgid "--> Restarting Dependency Resolution with new changes." + msgstr "--> Startar om beroendeupplösning med nya ändringar." --#: ../yum/__init__.py:3299 ../yum/__init__.py:3360 ../yum/__init__.py:3443 -+#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 - #, python-format - msgid "Excluding %s" - msgstr "Utesluter %s" +-#: ../output.py:1548 ++#: ../output.py:1609 + msgid "--> Finished Dependency Resolution" + msgstr "--> Avslutade beroendeupplösning" --#: ../yum/__init__.py:3304 -+#: ../yum/__init__.py:3465 +-#: ../output.py:1553 ../output.py:1558 ++#: ../output.py:1614 ../output.py:1619 #, python-format - msgid "Marking %s to be installed" - msgstr "Noterar %s för installation" + msgid "--> Processing Dependency: %s for package: %s" + msgstr "--> Bearbetar beroende: %s för paket: %s" --#: ../yum/__init__.py:3310 -+#: ../yum/__init__.py:3471 +-#: ../output.py:1562 ++#: ../output.py:1623 #, python-format - msgid "Marking %s as an update to %s" - msgstr "Noterar %s som en uppdatering av %s" + msgid "--> Unresolved Dependency: %s" + msgstr "--> Ej upplöst beroende: %s" + +-#: ../output.py:1568 ../output.py:1573 ++#: ../output.py:1634 ++#, fuzzy, python-format ++msgid "Package: %s" ++msgstr "paket: %s" ++ ++#: ../output.py:1636 ++#, fuzzy, python-format ++msgid "" ++"\n" ++" Requires: %s" ++msgstr "%s behöver: %s" ++ ++#: ../output.py:1649 ../output.py:1660 ++#, fuzzy, python-format ++msgid "" ++"\n" ++" %s: %s (%s)" ++msgstr " %s från %s" ++ ++#: ../output.py:1657 ++#, fuzzy ++msgid "Available" ++msgstr "Tillgängliga:" ++ ++#: ../output.py:1665 ../output.py:1670 + #, python-format + msgid "--> Processing Conflict: %s conflicts %s" + msgstr "--> Bearbetar konflikt: %s står i konflikt med %s" --#: ../yum/__init__.py:3317 -+#: ../yum/__init__.py:3478 +-#: ../output.py:1577 ++#: ../output.py:1674 + msgid "--> Populating transaction set with selected packages. Please wait." + msgstr "--> Fyller transaktionsmängden med valda paket. Var god dröj." + +-#: ../output.py:1581 ++#: ../output.py:1678 #, python-format - msgid "%s: does not update installed package." - msgstr "%s: uppdaterar inte ett installerat paket." + msgid "---> Downloading header for %s to pack into transaction set." + msgstr "---> Hämtar huvud för %s för att paketera i transaktionsmängden." --#: ../yum/__init__.py:3379 -+#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 +-#: ../utils.py:137 ../yummain.py:42 ++#: ../utils.py:93 ++msgid "Running" ++msgstr "Kör" ++ ++#: ../utils.py:94 ++msgid "Sleeping" ++msgstr "Sover" ++ ++#: ../utils.py:95 ++#, fuzzy ++msgid "Uninterruptible" ++msgstr "Oavbrytbar" ++ ++#: ../utils.py:96 ++msgid "Zombie" ++msgstr "Zombie" ++ ++#: ../utils.py:97 ++msgid "Traced/Stopped" ++msgstr "Spårad/Stoppad" ++ ++#: ../utils.py:98 ../yumcommands.py:917 ++msgid "Unknown" ++msgstr "Okänd" ++ ++#: ../utils.py:109 ++msgid " The other application is: PackageKit" ++msgstr " Det andra programmet är: PackageKit" ++ ++#: ../utils.py:111 +#, python-format -+msgid "Cannot open file: %s. Skipping." -+msgstr "Det går inte att öppna filen: %s. Hoppar över." ++msgid " The other application is: %s" ++msgstr " Det andra programmet är: %s" + -+#: ../yum/__init__.py:3541 - msgid "Problem in reinstall: no package matched to remove" - msgstr "Problem att ominstallera: inget paket matchades att tas bort" ++#: ../utils.py:114 ++#, python-format ++msgid " Memory : %5s RSS (%5sB VSZ)" ++msgstr " Minne : %5s RSS (%5s B VSZ)" ++ ++#: ../utils.py:119 ++#, python-format ++msgid " Started: %s - %s ago" ++msgstr " Startade: %s - för %s sedan" ++ ++#: ../utils.py:121 ++#, python-format ++msgid " State : %s, pid: %d" ++msgstr " Status : %s, pid: %d" ++ ++#: ../utils.py:199 ++#, fuzzy, python-format ++msgid "PluginExit Error: %s" ++msgstr "Konfigurationsfel: %s" ++ ++#: ../utils.py:202 ++#, fuzzy, python-format ++msgid "Yum Error: %s" ++msgstr "Fel: %s" ++ ++#: ../utils.py:235 ../yummain.py:42 + msgid "" + "\n" + "\n" +@@ -1091,7 +1255,7 @@ msgstr "" + "\n" + "Slutar efter att användaren avbröt" --#: ../yum/__init__.py:3392 ../yum/__init__.py:3523 -+#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 - #, python-format - msgid "Package %s is allowed multiple installs, skipping" - msgstr "Paket %s tillåts multipla installationer, hoppar över" +-#: ../utils.py:143 ../yummain.py:48 ++#: ../utils.py:241 ../yummain.py:48 + msgid "" + "\n" + "\n" +@@ -1101,7 +1265,7 @@ msgstr "" + "\n" + "Slutar med brutet rör (pipe)" --#: ../yum/__init__.py:3413 -+#: ../yum/__init__.py:3575 +-#: ../utils.py:145 ../yummain.py:50 ++#: ../utils.py:243 ../yummain.py:50 #, python-format - msgid "Problem in reinstall: no package %s matched to install" - msgstr "Problem att ominstallera: inget paket %s matchades att installera" + msgid "" + "\n" +@@ -1112,15 +1276,15 @@ msgstr "" + "\n" + "%s" --#: ../yum/__init__.py:3515 -+#: ../yum/__init__.py:3678 - msgid "No package(s) available to downgrade" - msgstr "Inga paket tillgängliga att nedgradera" +-#: ../utils.py:184 ../yummain.py:273 ++#: ../utils.py:282 ../yummain.py:211 + msgid "Complete!" + msgstr "Klart!" --#: ../yum/__init__.py:3559 -+#: ../yum/__init__.py:3731 +-#: ../yumcommands.py:42 ++#: ../yumcommands.py:43 + msgid "You need to be root to perform this command." + msgstr "Du måste vara root för att utföra detta kommando." + +-#: ../yumcommands.py:49 ++#: ../yumcommands.py:50 + msgid "" + "\n" + "You have enabled checking of packages via GPG keys. This is a good thing. \n" +@@ -1151,335 +1315,336 @@ msgstr "" + "\n" + "För mer information, kontakta leverantören av din distribution eller paket.\n" + +-#: ../yumcommands.py:69 ++#: ../yumcommands.py:70 #, python-format - msgid "No Match for available package: %s" - msgstr "Ingen matchning för tillgängliga paket: %s" + msgid "Error: Need to pass a list of pkgs to %s" + msgstr "Fel: Behöver skicka en lista paket till %s" --#: ../yum/__init__.py:3565 --#, fuzzy, python-format -+#: ../yum/__init__.py:3738 -+#, python-format - msgid "Only Upgrade available on package: %s" --msgstr "Endast uppdatering tillgängliga för paket: %s" -+msgstr "Endast uppgradering tillgängliga för paket: %s" +-#: ../yumcommands.py:75 ++#: ../yumcommands.py:76 + msgid "Error: Need an item to match" + msgstr "Fel: Behöver något att matcha emot" --#: ../yum/__init__.py:3635 ../yum/__init__.py:3672 --#, fuzzy, python-format -+#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 -+#, python-format - msgid "Failed to downgrade: %s" --msgstr "Paket att nedgradera" -+msgstr "Misslyckades nedgradera: %s" +-#: ../yumcommands.py:81 ++#: ../yumcommands.py:82 + msgid "Error: Need a group or list of groups" + msgstr "Fel: Behöver en grupp eller lista av grupper" --#: ../yum/__init__.py:3704 -+#: ../yum/__init__.py:3877 +-#: ../yumcommands.py:90 ++#: ../yumcommands.py:91 #, python-format - msgid "Retrieving GPG key from %s" - msgstr "Hämtar GPG-nyckel från %s" - --#: ../yum/__init__.py:3724 -+#: ../yum/__init__.py:3897 - msgid "GPG key retrieval failed: " - msgstr "Hämtandet av GPG-nyckeln misslyckades: " + msgid "Error: clean requires an option: %s" + msgstr "Fel: clean behöver ett argument: %s" --#: ../yum/__init__.py:3735 -+#: ../yum/__init__.py:3903 -+#, python-format -+msgid "Invalid GPG Key from %s: %s" -+msgstr "Ogiltig GPG-nyckel från %s: %s" -+ -+#: ../yum/__init__.py:3912 +-#: ../yumcommands.py:95 ++#: ../yumcommands.py:96 #, python-format - msgid "GPG key parsing failed: key does not have value %s" - msgstr "GPG-nyckeltolkning misslyckades: nyckeln har inte värde %s" + msgid "Error: invalid clean argument: %r" + msgstr "Fel: felaktigt argument till clean: %r" --#: ../yum/__init__.py:3767 -+#: ../yum/__init__.py:3944 +-#: ../yumcommands.py:108 ++#: ../yumcommands.py:109 + msgid "No argument to shell" + msgstr "Inget argument till skalet" + +-#: ../yumcommands.py:110 ++#: ../yumcommands.py:111 #, python-format - msgid "GPG key at %s (0x%s) is already installed" - msgstr "GPG-nyckel vid %s (0x%s) är redan installerad" + msgid "Filename passed to shell: %s" + msgstr "Filnamn skickat till skalet: %s" - #. Try installing/updating GPG key --#: ../yum/__init__.py:3772 ../yum/__init__.py:3834 -+#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 +-#: ../yumcommands.py:114 ++#: ../yumcommands.py:115 #, python-format - msgid "Importing GPG key 0x%s \"%s\" from %s" - msgstr "Importerar GPG-nyckel 0x%s \"%s\" från %s" + msgid "File %s given as argument to shell does not exist." + msgstr "Filen %s som gavs som ett argument till skalet finns inte." --#: ../yum/__init__.py:3789 -+#: ../yum/__init__.py:3966 - msgid "Not installing key" - msgstr "Installerar inte nyckeln" +-#: ../yumcommands.py:120 ++#: ../yumcommands.py:121 + msgid "Error: more than one file given as argument to shell." + msgstr "Fel: mer än en fil angiven som argument till skalet." --#: ../yum/__init__.py:3795 -+#: ../yum/__init__.py:3972 - #, python-format - msgid "Key import failed (code %d)" - msgstr "Nyckelimport misslyckades (kod %d)" +-#: ../yumcommands.py:169 ++#: ../yumcommands.py:170 + msgid "PACKAGE..." + msgstr "PAKET..." --#: ../yum/__init__.py:3796 ../yum/__init__.py:3855 -+#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 - msgid "Key imported successfully" - msgstr "Nyckelimport lyckades" +-#: ../yumcommands.py:172 ++#: ../yumcommands.py:173 + msgid "Install a package or packages on your system" + msgstr "Installera ett eller flera paket på ditt system" --#: ../yum/__init__.py:3801 ../yum/__init__.py:3860 -+#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 - #, python-format - msgid "" - "The GPG keys listed for the \"%s\" repository are already installed but they " -@@ -2424,41 +2574,46 @@ msgstr "" - "inte korrekta för detta paket.\n" - "Kontrollera att de rätta nyckel-URL:erna är konfigurerade för detta förråd." +-#: ../yumcommands.py:180 ++#: ../yumcommands.py:181 + msgid "Setting up Install Process" + msgstr "Förbereder installationsprocessen" --#: ../yum/__init__.py:3810 -+#: ../yum/__init__.py:3987 - msgid "Import of key(s) didn't help, wrong key(s)?" - msgstr "Import av nycklar hjälpte inte, fel nycklar?" +-#: ../yumcommands.py:191 ++#: ../yumcommands.py:192 + msgid "[PACKAGE...]" + msgstr "[PAKET...]" --#: ../yum/__init__.py:3829 -+#: ../yum/__init__.py:4006 - #, python-format - msgid "GPG key at %s (0x%s) is already imported" - msgstr "GPG-nyckel vid %s (0x%s) är redan importerad" +-#: ../yumcommands.py:194 ++#: ../yumcommands.py:195 + msgid "Update a package or packages on your system" + msgstr "Uppdatera ett eller flera paket på ditt system" --#: ../yum/__init__.py:3849 -+#: ../yum/__init__.py:4026 - #, python-format - msgid "Not installing key for repo %s" - msgstr "Installerar inte nyckel för förråd %s" +-#: ../yumcommands.py:201 ++#: ../yumcommands.py:202 + msgid "Setting up Update Process" + msgstr "Förbereder uppdateringsprocessen" --#: ../yum/__init__.py:3854 -+#: ../yum/__init__.py:4031 - msgid "Key import failed" - msgstr "Nyckelimport misslyckades" +-#: ../yumcommands.py:246 ++#: ../yumcommands.py:244 + msgid "Display details about a package or group of packages" + msgstr "Visa detaljer om ett paket eller en grupp paket" --#: ../yum/__init__.py:3976 -+#: ../yum/__init__.py:4157 - msgid "Unable to find a suitable mirror." - msgstr "Kan inte hitta en lämplig spegel." +-#: ../yumcommands.py:295 ++#: ../yumcommands.py:293 + msgid "Installed Packages" + msgstr "Installerade paket" --#: ../yum/__init__.py:3978 -+#: ../yum/__init__.py:4159 - msgid "Errors were encountered while downloading packages." - msgstr "Fel uppstod när paket hämtades." +-#: ../yumcommands.py:303 ++#: ../yumcommands.py:301 + msgid "Available Packages" + msgstr "Tillgängliga paket" --#: ../yum/__init__.py:4028 -+#: ../yum/__init__.py:4209 - #, python-format - msgid "Please report this error at %s" - msgstr "Rapportera gärna detta fel till %s" +-#: ../yumcommands.py:307 ++#: ../yumcommands.py:305 + msgid "Extra Packages" + msgstr "Extra paket" --#: ../yum/__init__.py:4052 -+#: ../yum/__init__.py:4233 - msgid "Test Transaction Errors: " - msgstr "Transaktionstestfel: " +-#: ../yumcommands.py:311 ++#: ../yumcommands.py:309 + msgid "Updated Packages" + msgstr "Uppdaterade paket" -+#: ../yum/__init__.py:4334 -+#, python-format -+msgid "Could not set cachedir: %s" -+msgstr "Kunde inte sätta cache-katalog: %s" -+ - #. Mostly copied from YumOutput._outKeyValFill() - #: ../yum/plugins.py:202 - msgid "Loaded plugins: " -@@ -2519,7 +2674,20 @@ msgstr "Kan inte hitta konfigurationsfil för insticksmodulen %s" - msgid "registration of commands not supported" - msgstr "registrering av kommandon stöds inte" + #. This only happens in verbose mode +-#: ../yumcommands.py:319 ../yumcommands.py:326 ../yumcommands.py:603 ++#: ../yumcommands.py:317 ../yumcommands.py:324 ../yumcommands.py:601 + msgid "Obsoleting Packages" + msgstr "Fasar ut paket" --#: ../yum/rpmtrans.py:78 -+#: ../yum/rpmsack.py:102 -+msgid "has missing requires of" -+msgstr "har ett saknat beroende på" -+ -+#: ../yum/rpmsack.py:105 -+msgid "has installed conflicts" -+msgstr "har installerad konflikt" -+ -+#: ../yum/rpmsack.py:114 -+#, python-format -+msgid "%s is a duplicate with %s" -+msgstr "%s är en dubblett med %s" -+ -+#: ../yum/rpmtrans.py:79 - msgid "Repackaging" - msgstr "Paketerar om" +-#: ../yumcommands.py:328 ++#: ../yumcommands.py:326 + msgid "Recently Added Packages" + msgstr "Nyligen tillagda paket" -@@ -2552,10 +2720,3 @@ msgstr "Trasigt huvud %s" - #, python-format - msgid "Error opening rpm %s - error %s" - msgstr "Fel när rpm %s öppnades - fel %s" -- --#~ msgid "" --#~ "getInstalledPackageObject() will go away, use self.rpmdb.searchPkgTuple" --#~ "().\n" --#~ msgstr "" --#~ "getInstalledPackageObject() kommer att försvinna, använd self.rpmdb." --#~ "searchPkgTuple().\n" -diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py -index a925027..b1631ae 100644 ---- a/rpmUtils/miscutils.py -+++ b/rpmUtils/miscutils.py -@@ -170,45 +170,45 @@ def rangeCompare(reqtuple, provtuple): +-#: ../yumcommands.py:335 ++#: ../yumcommands.py:333 + msgid "No matching Packages to list" + msgstr "Inga matchande paket att lista" - # does not match unless - if rc >= 1: -- if reqf in ['GT', 'GE', 4, 12]: -+ if reqf in ['GT', 'GE', 4, 12, '>', '>=']: - return 1 -- if reqf in ['EQ', 8]: -- if f in ['LE', 10, 'LT', 2]: -- return 1 -- if reqf in ['LE', 'LT', 'EQ', 10, 2, 8]: -- if f in ['LE', 'LT', 10, 2]: -+ if reqf in ['EQ', 8, '=']: -+ if f in ['LE', 10, 'LT', 2,'<=', '<']: -+ return 1 -+ if reqf in ['LE', 'LT', 'EQ', 10, 2, 8, '<=', '<', '=']: -+ if f in ['LE', 'LT', 10, 2, '<=', '<']: - return 1 +-#: ../yumcommands.py:349 ++#: ../yumcommands.py:347 + msgid "List a package or groups of packages" + msgstr "Lista ett paket eller en grupp paket" - if rc == 0: -- if reqf in ['GT', 4]: -- if f in ['GT', 'GE', 4, 12]: -+ if reqf in ['GT', 4, '>']: -+ if f in ['GT', 'GE', 4, 12, '>', '>=']: - return 1 -- if reqf in ['GE', 12]: -- if f in ['GT', 'GE', 'EQ', 'LE', 4, 12, 8, 10]: -+ if reqf in ['GE', 12, '>=']: -+ if f in ['GT', 'GE', 'EQ', 'LE', 4, 12, 8, 10, '>', '>=', '=', '<=']: - return 1 -- if reqf in ['EQ', 8]: -- if f in ['EQ', 'GE', 'LE', 8, 12, 10]: -+ if reqf in ['EQ', 8, '=']: -+ if f in ['EQ', 'GE', 'LE', 8, 12, 10, '=', '>=', '<=']: - return 1 -- if reqf in ['LE', 10]: -- if f in ['EQ', 'LE', 'LT', 'GE', 8, 10, 2, 12]: -+ if reqf in ['LE', 10, '<=']: -+ if f in ['EQ', 'LE', 'LT', 'GE', 8, 10, 2, 12, '=', '<=', '<' , '>=']: - return 1 -- if reqf in ['LT', 2]: -- if f in ['LE', 'LT', 10, 2]: -+ if reqf in ['LT', 2, '<']: -+ if f in ['LE', 'LT', 10, 2, '<=', '<']: - return 1 - if rc <= -1: -- if reqf in ['GT', 'GE', 'EQ', 4, 12, 8]: -- if f in ['GT', 'GE', 4, 12]: -+ if reqf in ['GT', 'GE', 'EQ', 4, 12, 8, '>', '>=', '=']: -+ if f in ['GT', 'GE', 4, 12, '>', '>=']: - return 1 -- if reqf in ['LE', 'LT', 10, 2]: -+ if reqf in ['LE', 'LT', 10, 2, '<=', '<']: - return 1 - # if rc >= 1: --# if reqf in ['GT', 'GE', 4, 12]: -+# if reqf in ['GT', 'GE', 4, 12, '>', '>=']: - # return 1 - # if rc == 0: --# if reqf in ['GE', 'LE', 'EQ', 8, 10, 12]: -+# if reqf in ['GE', 'LE', 'EQ', 8, 10, 12, '>=', '<=', '=']: - # return 1 - # if rc <= -1: --# if reqf in ['LT', 'LE', 2, 10]: -+# if reqf in ['LT', 'LE', 2, 10, '<', '<=']: - # return 1 +-#: ../yumcommands.py:361 ++#: ../yumcommands.py:359 + msgid "Remove a package or packages from your system" + msgstr "Ta bort ett eller flera paket från ditt system" - return 0 -@@ -341,11 +341,17 @@ def rpm2cpio(fdno, out=sys.stdout, bufsize=2048): - if tmp == "": break - out.write(tmp) - f.close() -- -+ - def formatRequire (name, version, flags): -+ ''' -+ Return a human readable requirement string (ex. foobar >= 2.0) -+ @param name: requirement name (ex. foobar) -+ @param version: requirent version (ex. 2.0) -+ @param flags: binary flags ( 0010 = equal, 0100 = greater than, 1000 = less than ) -+ ''' - s = name - -- if flags: -+ if flags and (type(flags) == type(0) or type(flags) == type(0L)): # Flag must be set and a int (or a long, now) - if flags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER | - rpm.RPMSENSE_EQUAL): - s = s + " " -@@ -358,6 +364,7 @@ def formatRequire (name, version, flags): - if version: - s = "%s %s" %(s, version) - return s -+ - - def flagToString(flags): - flags = flags & 0xf -diff --git a/rpmUtils/oldUtils.py b/rpmUtils/oldUtils.py -index 8957685..5f1d9ec 100644 ---- a/rpmUtils/oldUtils.py -+++ b/rpmUtils/oldUtils.py -@@ -35,7 +35,7 @@ def checkheader(headerfile, name, arch): - +-#: ../yumcommands.py:368 ++#: ../yumcommands.py:366 + msgid "Setting up Remove Process" + msgstr "Förbereder processen att ta bort" - def checkRpmMD5(package, urlgraberror=0): -- """take a package, check it out by trying to open it, return 1 if its good -+ """take a package, check it out by trying to open it, return 1 if it's good - return 0 if it's not""" - ts.sigChecking('md5') - fdno = os.open(package, os.O_RDONLY) -diff --git a/rpmUtils/transaction.py b/rpmUtils/transaction.py -index 329de69..d50e201 100644 ---- a/rpmUtils/transaction.py -+++ b/rpmUtils/transaction.py -@@ -94,9 +94,8 @@ class TransactionWrapper: - self.addTsFlag(rpm.RPMTRANS_FLAG_TEST) - # FIXME GARBAGE - remove once this is reimplemented elsehwere - # KEEPING FOR API COMPLIANCE ONLY -- if conf.has_key('diskspacecheck'): -- if conf['diskspacecheck'] == 0: -- self.ts.setProbFilter(rpm.RPMPROB_FILTER_DISKSPACE) -+ if conf.get('diskspacecheck') == 0: -+ self.ts.setProbFilter(rpm.RPMPROB_FILTER_DISKSPACE) - tserrors = self.ts.run(cb.callback, '') - - reserrors = [] -@@ -151,7 +150,7 @@ class TransactionWrapper: - preq = 0 - tup = miscutils.pkgTupleFromHeader(h) - for p in _return_all_provides(h): -- if req.has_key(p): -+ if p in req: - # Don't count a package that provides its require - s = req[p] - if len(s) > 1 or tup not in s: -diff --git a/rpmUtils/updates.py b/rpmUtils/updates.py -index 68dee45..c231f5c 100644 ---- a/rpmUtils/updates.py -+++ b/rpmUtils/updates.py -@@ -75,14 +75,11 @@ class Updates: +-#: ../yumcommands.py:382 ++#: ../yumcommands.py:380 + msgid "Setting up Group Process" + msgstr "Förbereder grupprocessen" + +-#: ../yumcommands.py:388 ++#: ../yumcommands.py:386 + msgid "No Groups on which to run command" + msgstr "Inga grupper att köra kommandot på" - def _delFromNADict(self, dict_, pkgtup): - (n, a, e, v, r) = pkgtup -- if dict_.has_key((n, a)): -- dict_[(n, a)] = filter((e,v,r).__ne__, dict_[(n, a)]) -- if not dict_[(n, a)]: -- del dict_[(n, a)] -- if dict_.has_key((n, None)): -- dict_[(n, None)] = filter((e,v,r).__ne__, dict_[(n, None)]) -- if not dict_[(n, None)]: -- del dict_[(n, None)] -+ for aa in (a, None): -+ if (n, aa) in dict_: -+ dict_[(n, aa)] = filter((e,v,r).__ne__, dict_[(n, aa)]) -+ if not dict_[(n, aa)]: -+ del dict_[(n, aa)] +-#: ../yumcommands.py:401 ++#: ../yumcommands.py:399 + msgid "List available package groups" + msgstr "Lista tillgängliga paketgrupper" - def delPackage(self, pkgtup): - """remove available pkgtup that is no longer available""" -@@ -94,7 +91,7 @@ class Updates: - self._delFromDict(self.updating_dict, self.updatesdict.get(pkgtup, []), pkgtup) - self._delFromDict(self.updatesdict, self.updating_dict.get(pkgtup, []), pkgtup) +-#: ../yumcommands.py:418 ++#: ../yumcommands.py:416 + msgid "Install the packages in a group on your system" + msgstr "Installera paketen i en grupp på ditt system" -- if self.rawobsoletes.has_key(pkgtup): -+ if pkgtup in self.rawobsoletes: - if self._obsoletes_by_name: - for name, flag, version in self.rawobsoletes[pkgtup]: - self._delFromDict(self._obsoletes_by_name, [name], (flag, version, pkgtup)) -@@ -114,12 +111,12 @@ class Updates: - - returndict = {} - for (n, a, e, v, r) in pkglist: -- if not returndict.has_key((n, a)): -+ if (n, a) not in returndict: - returndict[(n, a)] = [] - returndict[(n, a)].append((e,v,r)) +-#: ../yumcommands.py:440 ++#: ../yumcommands.py:438 + msgid "Remove the packages in a group from your system" + msgstr "Ta bort paketen in en grupp från ditt system" - if Nonelists: -- if not returndict.has_key((n, None)): -+ if (n, None) not in returndict: - returndict[(n, None)] = [] - returndict[(n, None)].append((a, e, v, r)) - -@@ -202,7 +199,7 @@ class Updates: - returndict = {} - for new in obslist: - for old in obsdict[new]: -- if not returndict.has_key(old): -+ if old not in returndict: - returndict[old] = [] - returndict[old].append(new) - -@@ -224,21 +221,21 @@ class Updates: - # - obs_arches = {} - for (n, a, e, v, r) in self.rawobsoletes: -- if not obs_arches.has_key(n): -+ if n not in obs_arches: - obs_arches[n] = [] - obs_arches[n].append(a) +-#: ../yumcommands.py:467 ++#: ../yumcommands.py:465 + msgid "Display details about a package group" + msgstr "Visa detaljer om en paketgrupp" - for pkgtup in self.rawobsoletes: - (name, arch, epoch, ver, rel) = pkgtup - for (obs_n, flag, (obs_e, obs_v, obs_r)) in self.rawobsoletes[(pkgtup)]: -- if self.installdict.has_key((obs_n, None)): -+ if (obs_n, None) in self.installdict: - for (rpm_a, rpm_e, rpm_v, rpm_r) in self.installdict[(obs_n, None)]: - if flag in [None, 0] or \ - rpmUtils.miscutils.rangeCheck((obs_n, flag, (obs_e, obs_v, obs_r)), - (obs_n, rpm_a, rpm_e, rpm_v, rpm_r)): - # make sure the obsoleting pkg is not already installed - willInstall = 1 -- if self.installdict.has_key((name, None)): -+ if (name, None) in self.installdict: - for (ins_a, ins_e, ins_v, ins_r) in self.installdict[(name, None)]: - pkgver = (epoch, ver, rel) - installedver = (ins_e, ins_v, ins_r) -@@ -248,7 +245,7 @@ class Updates: - if rpm_a != arch and rpm_a in obs_arches[name]: - willInstall = 0 - if willInstall: -- if not obsdict.has_key(pkgtup): -+ if pkgtup not in obsdict: - obsdict[pkgtup] = [] - obsdict[pkgtup].append((obs_n, rpm_a, rpm_e, rpm_v, rpm_r)) - self.obsoletes = obsdict -@@ -261,7 +258,7 @@ class Updates: - self.obsoleted_dict = {} - for new in self.obsoletes: - for old in self.obsoletes[new]: -- if not self.obsoleted_dict.has_key(old): -+ if old not in self.obsoleted_dict: - self.obsoleted_dict[old] = [] - self.obsoleted_dict[old].append(new) - self.obsoleting_dict = {} -@@ -312,7 +309,7 @@ class Updates: +-#: ../yumcommands.py:491 ++#: ../yumcommands.py:489 + msgid "Generate the metadata cache" + msgstr "Generera metadata-cache:n" - for (n, a) in newpkgs: - # simple ones - look for exact matches or older stuff -- if self.installdict.has_key((n, a)): -+ if (n, a) in self.installdict: - for (rpm_e, rpm_v, rpm_r) in self.installdict[(n, a)]: - try: - (e, v, r) = self.returnNewest(newpkgs[(n,a)]) -@@ -365,14 +362,14 @@ class Updates: - for (n, a) in simpleupdate: - # try to be as precise as possible - if n in self.exactarchlist: -- if self.installdict.has_key((n, a)): -+ if (n, a) in self.installdict: - (rpm_e, rpm_v, rpm_r) = self.returnNewest(self.installdict[(n, a)]) -- if newpkgs.has_key((n,a)): -+ if (n, a) in newpkgs: - (e, v, r) = self.returnNewest(newpkgs[(n, a)]) - rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) - if rc > 0: - # this is definitely an update - put it in the dict -- if not updatedict.has_key((n, a, rpm_e, rpm_v, rpm_r)): -+ if (n, a, rpm_e, rpm_v, rpm_r) not in updatedict: - updatedict[(n, a, rpm_e, rpm_v, rpm_r)] = [] - updatedict[(n, a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) - -@@ -382,12 +379,12 @@ class Updates: - # we just need to find the arch of the installed pkg so we can - # check it's (e, v, r) - (rpm_a, rpm_e, rpm_v, rpm_r) = self.installdict[(n, None)][0] -- if newpkgs.has_key((n, None)): -+ if (n, None) in newpkgs: - for (a, e, v, r) in newpkgs[(n, None)]: - rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) - if rc > 0: - # this is definitely an update - put it in the dict -- if not updatedict.has_key((n, rpm_a, rpm_e, rpm_v, rpm_r)): -+ if (n, rpm_a, rpm_e, rpm_v, rpm_r) not in updatedict: - updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = [] - updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) +-#: ../yumcommands.py:497 ++#: ../yumcommands.py:495 + msgid "Making cache files for all metadata files." + msgstr "Skapar cache-filer för alla metadatafiler." -@@ -403,7 +400,7 @@ class Updates: - - archlists = [] - if self._is_multilib: -- if rpmUtils.arch.multilibArches.has_key(self.myarch): -+ if self.myarch in rpmUtils.arch.multilibArches: - biarches = [self.myarch] - else: - biarches = [self.myarch, rpmUtils.arch.arches[self.myarch]] -@@ -448,7 +445,7 @@ class Updates: - rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) - if rc > 0: - # this is definitely an update - put it in the dict -- if not updatedict.has_key((n, a, rpm_e, rpm_v, rpm_r)): -+ if (n, a, rpm_e, rpm_v, rpm_r) not in updatedict: - updatedict[(n, a, rpm_e, rpm_v, rpm_r)] = [] - updatedict[(n, a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) - else: -@@ -482,7 +479,7 @@ class Updates: - rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) - if rc > 0: - # this is definitely an update - put it in the dict -- if not updatedict.has_key((n, rpm_a, rpm_e, rpm_v, rpm_r)): -+ if (n, rpm_a, rpm_e, rpm_v, rpm_r) not in updatedict: - updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = [] - updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) - -@@ -496,7 +493,7 @@ class Updates: - self.updating_dict = {} - for old in self.updatesdict: - for new in self.updatesdict[old]: -- if not self.updating_dict.has_key(new): -+ if new not in self.updating_dict: - self.updating_dict[new] = [] - self.updating_dict[new].append(old) +-#: ../yumcommands.py:498 ++#: ../yumcommands.py:496 + msgid "This may take a while depending on the speed of this computer" + msgstr "Detta kan ta ett tag beroende på datorns fart" -@@ -691,7 +688,7 @@ class Updates: - highdict = {} - for pkgtup in tuplelist: - (n, a, e, v, r) = pkgtup -- if not highdict.has_key((n, a)): -+ if (n, a) not in highdict: - highdict[(n, a)] = pkgtup - else: - pkgtup2 = highdict[(n, a)] -diff --git a/test/depsolvetests.py b/test/depsolvetests.py -index 02bbf8f..7af3f16 100644 ---- a/test/depsolvetests.py -+++ b/test/depsolvetests.py -@@ -1197,3 +1197,18 @@ class DepsolveTests(DepsolveTests): - self.assertEquals('ok', *self.resolveCode()) - self.assertResult((po, po2)) - -+ def testRL_dcbd1(self): -+ xpo = FakePackage('dcbd-devel', version='1', arch='i386') -+ xpo.addRequires('dcbd', None, (None, None, None)) -+ self.tsInfo.addInstall(xpo) -+ -+ po1 = FakePackage('dcbd', version='1') -+ po1.addProvides('dcbd', 'EQ', ('0', '1', '0')) -+ po2 = FakePackage('lldpad', version='2') -+ po2.addObsoletes('dcbd', 'LT', ('0', '2', '0')) -+ po3 = FakePackage('lldpad-devel', version='2') -+ self.xsack.addPackage(po3) -+ self.xsack.addPackage(po2) -+ self.xsack.addPackage(po1) -+ -+ self.assertEquals('err', *self.resolveCode()) -diff --git a/test/simpleobsoletestests.py b/test/simpleobsoletestests.py -index cf1821f..dfaa7e5 100644 ---- a/test/simpleobsoletestests.py -+++ b/test/simpleobsoletestests.py -@@ -157,11 +157,32 @@ class SimpleObsoletesTests(OperationsTests): - self.assert_(res=='ok', msg) - self.assertResult((p.obsoletes_x86_64, p.requires_obsoletes)) +-#: ../yumcommands.py:519 ++#: ../yumcommands.py:517 + msgid "Metadata Cache Created" + msgstr "Metadata-cache skapad" + +-#: ../yumcommands.py:533 ++#: ../yumcommands.py:531 + msgid "Remove cached data" + msgstr "Ta bort cache:ade data" + +-#: ../yumcommands.py:553 ++#: ../yumcommands.py:551 + msgid "Find what package provides the given value" + msgstr "Ta reda på vilka paket som tillhandahåller det angivna värdet" + +-#: ../yumcommands.py:573 ++#: ../yumcommands.py:571 + msgid "Check for available package updates" + msgstr "Leta efter tillgängliga paketuppdateringar" + +-#: ../yumcommands.py:623 ++#: ../yumcommands.py:621 + msgid "Search package details for the given string" + msgstr "Sök i paketdetaljer efter den angivna strängen" + +-#: ../yumcommands.py:629 ++#: ../yumcommands.py:627 + msgid "Searching Packages: " + msgstr "Söker paket: " + +-#: ../yumcommands.py:646 ++#: ../yumcommands.py:644 + msgid "Update packages taking obsoletes into account" + msgstr "Uppdatera paket med hänsyn tagen till utfasningar" + +-#: ../yumcommands.py:654 ++#: ../yumcommands.py:652 + msgid "Setting up Upgrade Process" + msgstr "Förbereder uppgraderingsprocessen" -- def testObsoletex86_64ToMultiarch(self): -+ def testObsoletex86_64ToMultiarch1(self): - p = self.pkgs - res, msg = self.runOperation(['update'], [p.installed_x86_64], [p.obsoletes_i386, p.obsoletes_x86_64]) - self.assert_(res=='ok', msg) - self.assertResult((p.obsoletes_x86_64,)) -+ def testObsoletex86_64ToMultiarch2(self): -+ p = self.pkgs -+ res, msg = self.runOperation(['update'], [p.installed_x86_64], [p.obsoletes_x86_64, p.obsoletes_i386]) -+ self.assert_(res=='ok', msg) -+ self.assertResult((p.obsoletes_x86_64,)) -+ def testInstallObsoletex86_64ToMultiarch1(self): -+ # Found by BZ 593349, libgfortran43/44 -+ p = self.pkgs -+ res, msg = self.runOperation(['install', 'zsh.x86_64'], [], [p.installed_x86_64, p.installed_i386, p.obsoletes_x86_64, p.obsoletes_i386]) -+ self.assert_(res=='ok', msg) -+ self.assertResult((p.obsoletes_x86_64,)) -+ def testInstallObsoletex86_64ToMultiarch2(self): -+ p = self.pkgs -+ res, msg = self.runOperation(['install', 'zsh.i386'], [], [p.installed_x86_64, p.installed_i386, p.obsoletes_x86_64, p.obsoletes_i386]) -+ self.assert_(res=='ok', msg) -+ self.assertResult((p.obsoletes_i386,)) -+ def testInstallObsoletex86_64ToMultiarch3(self): -+ p = self.pkgs -+ res, msg = self.runOperation(['install', 'zsh'], [], [p.installed_noarch, p.obsoletes_x86_64, p.obsoletes_i386]) -+ self.assert_(res=='ok', msg) -+ self.assertResult((p.obsoletes_x86_64,)) - def testObsoletex86_64ToMultiarchForDependency(self): - p = self.pkgs - res, msg = self.runOperation(['install', 'superzippy'], -diff --git a/test/simpleupdatetests.py b/test/simpleupdatetests.py -index f02cc75..df641f7 100644 ---- a/test/simpleupdatetests.py -+++ b/test/simpleupdatetests.py -@@ -764,3 +764,48 @@ class SimpleUpdateTests(OperationsTests): - [pa1, pa2, pa4, pa3]) - self.assert_(res=='ok', msg) - self.assertResult((pa1, pa3)) -+ -+ def testUpdateRLEvince1(self): -+ """ This tests a dep. upgrade from a dep. upgrade, with a multilib. pkg. -+ where only half of the multilib. is installed. """ -+ pi1 = FakePackage('evince', '1', '1', '0', 'x86_64') -+ pi1.addRequires('evince-libs', 'EQ', ('0', '1', '1')) -+ pi2 = FakePackage('evince-libs', '1', '1', '0', 'x86_64') -+ pi3 = FakePackage('evince-djvu', '1', '1', '0', 'x86_64') -+ pi3.addRequires('evince-libs', 'EQ', ('0', '1', '1')) -+ -+ pa1 = FakePackage('evince', '2', '1', '0', 'x86_64') -+ pa1.addRequires('evince-libs', 'EQ', ('0', '2', '1')) -+ pa2i = FakePackage('evince-libs', '2', '1', '0', 'i686') -+ pa2x = FakePackage('evince-libs', '2', '1', '0', 'x86_64') -+ pa3 = FakePackage('evince-djvu', '2', '1', '0', 'x86_64') -+ pa3.addRequires('evince-libs', 'EQ', ('0', '2', '1')) -+ -+ res, msg = self.runOperation(['update', 'evince'], -+ [pi1, pi2, pi3], -+ [pa1, pa2x, pa2i, pa3]) -+ self.assert_(res=='ok', msg) -+ self.assertResult((pa1, pa2x, pa3)) -+ -+ def testUpdateRLEvince2(self): -+ """ Dito. testUpdateRLEvince1, except here pa2i is before pa2x, and -+ thus. will be seen first by .update() when it does an -+ archless "find". """ -+ pi1 = FakePackage('evince', '1', '1', '0', 'x86_64') -+ pi1.addRequires('evince-libs', 'EQ', ('0', '1', '1')) -+ pi2 = FakePackage('evince-libs', '1', '1', '0', 'x86_64') -+ pi3 = FakePackage('evince-djvu', '1', '1', '0', 'x86_64') -+ pi3.addRequires('evince-libs', 'EQ', ('0', '1', '1')) -+ -+ pa1 = FakePackage('evince', '2', '1', '0', 'x86_64') -+ pa1.addRequires('evince-libs', 'EQ', ('0', '2', '1')) -+ pa2i = FakePackage('evince-libs', '2', '1', '0', 'i686') -+ pa2x = FakePackage('evince-libs', '2', '1', '0', 'x86_64') -+ pa3 = FakePackage('evince-djvu', '2', '1', '0', 'x86_64') -+ pa3.addRequires('evince-libs', 'EQ', ('0', '2', '1')) -+ -+ res, msg = self.runOperation(['update', 'evince'], -+ [pi1, pi2, pi3], -+ [pa1, pa2i, pa2x, pa3]) -+ self.assert_(res=='ok', msg) -+ self.assertResult((pa1, pa2x, pa3)) -diff --git a/test/testbase.py b/test/testbase.py -index 0b05812..48611d8 100644 ---- a/test/testbase.py -+++ b/test/testbase.py -@@ -44,11 +44,24 @@ class FakeConf(object): - self.persistdir = '/should-not-exist-bad-test!' - self.showdupesfromrepos = False - self.uid = 0 -+ self.groupremove_leaf_only = False -+ self.protected_packages = [] -+ -+class FakeSack: -+ """ Fake PackageSack to use with FakeRepository""" -+ def __init__(self): -+ pass # This is fake, so do nothing -+ -+ def have_fastReturnFileEntries(self): -+ return True +-#: ../yumcommands.py:668 ++#: ../yumcommands.py:666 + msgid "Install a local RPM" + msgstr "Installera en lokal RPM" - class FakeRepo(object): +-#: ../yumcommands.py:676 ++#: ../yumcommands.py:674 + msgid "Setting up Local Package Process" + msgstr "Förbereder den lokala paketprocessen" -+ __fake_sack = FakeSack() - def __init__(self, id=None,sack=None): - self.id = id -+ if sack is None: -+ sack = self.__fake_sack - self.sack = sack - self.cost = 1000 +-#: ../yumcommands.py:695 ++#: ../yumcommands.py:693 + msgid "Determine which package provides the given dependency" + msgstr "Avgör vilket paket som tillhandahåller ett angivet beroende" -diff --git a/test/yum-leak-test.py b/test/yum-leak-test.py -index 299db51..760b770 100755 ---- a/test/yum-leak-test.py -+++ b/test/yum-leak-test.py -@@ -1,6 +1,10 @@ - #! /usr/bin/python -tt +-#: ../yumcommands.py:698 ++#: ../yumcommands.py:696 + msgid "Searching Packages for Dependency:" + msgstr "Söker i paketen efter beroende:" --import yum, os, time, gc -+# Do either: -+# ./yum-leak-test.py -+# ./yum-leak-test.py zip -+ -+import yum, os, time, gc, sys - from urlgrabber.progress import format_number +-#: ../yumcommands.py:712 ++#: ../yumcommands.py:710 + msgid "Run an interactive yum shell" + msgstr "Kör ett interactivt yum-skal" - def out_mem(pid): -@@ -17,9 +21,15 @@ def out_mem(pid): - (format_number(int(ps['vmrss']) * 1024), - format_number(int(ps['vmsize']) * 1024)) +-#: ../yumcommands.py:718 ++#: ../yumcommands.py:716 + msgid "Setting up Yum Shell" + msgstr "Förbereder ett yum-skal" --out_mem(os.getpid()) --while True: -+print "Running:", yum.__version__ -+ -+def _leak_tst_yb(): -+ print "Doing YumBase leak test. " -+ out_mem(os.getpid()) -+ while True: - yb = yum.YumBase() -+ yb.preconf.debuglevel = 0 -+ yb.preconf.errorlevel = 0 - yb.repos.setCacheDir(yum.misc.getCacheDir()) - yb.rpmdb.returnPackages() - yb.pkgSack.returnPackages() -@@ -33,3 +43,83 @@ while True: - print gc.garbage[0] - print gc.get_referrers(gc.garbage[0]) - # print "DBG:", gc.get_referrers(yb) -+ -+def _leak_tst_cl(): -+ print "Doing closeRpmDB and .up test. " -+ yb = yum.YumBase() -+ yb.preconf.debuglevel = 0 -+ yb.preconf.errorlevel = 0 -+ yb.repos.setCacheDir(yum.misc.getCacheDir()) -+ while True: -+ out_mem(os.getpid()) -+ print "up:", -+ yb.up -+ print "done" -+ out_mem(os.getpid()) -+ -+ print "rpmdb pkgs:", -+ yb.rpmdb.returnPackages() -+ print "done" -+ out_mem(os.getpid()) -+ -+ print "pkgSack pkgs:", -+ yb.pkgSack.returnPackages() -+ print "done" -+ out_mem(os.getpid()) -+ -+ print "close:", -+ yb.closeRpmDB() -+ print "done" -+ -+def _leak_tst_ir(): -+ print "Doing install/remove leak test. " -+ -+ def _init(): -+ yb = cli.YumBaseCli() # Need doTransaction() etc. -+ yb.preconf.debuglevel = 0 -+ yb.preconf.errorlevel = 0 -+ yb.repos.setCacheDir(yum.misc.getCacheDir()) -+ yb.conf.assumeyes = True -+ return yb -+ -+ sys.path.append('/usr/share/yum-cli') -+ import cli -+ yb = _init() -+ out_mem(os.getpid()) -+ -+ def _run(yb): -+ print " Run" -+ (code, msgs) = yb.buildTransaction() -+ if code == 1: -+ print "ERROR:", core, msgs -+ sys.exit(1) -+ returnval = yb.doTransaction() -+ if returnval != 0: # We could allow 1 too, but meh. -+ print "ERROR:", returnval -+ sys.exit(1) -+ yb.closeRpmDB() -+ -+ last = None -+ while True: -+ if True: -+ yb = _init() -+ out_mem(os.getpid()) -+ print " Install:", sys.argv[1:] -+ for pat in sys.argv[1:]: -+ yb.install(pattern=pat) -+ out_mem(os.getpid()) -+ _run(yb) -+ out_mem(os.getpid()) -+ -+ print " Remove:", sys.argv[1:] -+ for pat in sys.argv[1:]: -+ yb.remove(pattern=pat) -+ out_mem(os.getpid()) -+ _run(yb) -+ -+if len(sys.argv) == 2 and sys.argv[1] == 'closeRpmDB': -+ _leak_tst_cl() -+elif sys.argv[1:]: -+ _leak_tst_ir() -+else: -+ _leak_tst_yb() -diff --git a/test/yum-pylintrc b/test/yum-pylintrc -index dd3db57..fa3e57c 100644 ---- a/test/yum-pylintrc -+++ b/test/yum-pylintrc -@@ -82,7 +82,8 @@ disable-msg-cat=C,R - # W0703: *Catch "Exception"* - # W0710: *Exception doesn't inherit from standard "Exception" class* (give false positives on ex. KeyboardInterrupt) - # W0631: *Using possibly undefined loop variable %r* (Gives to many false positives) --disable-msg=E1101,F0401,W0704,W0612,W0212,W0613,W0602,W0511,W0401,W0614,W0232,W0201,W0603,W0621,W0142,W0102,W0105,W0702,W0231,E0202,W0622,W0403,W0223,W0104,W1001,W0221,W0703,W0710,W0631 -+# E1103: *%s %r has no %r member (but some types could not be inferred)* -+disable-msg=E1101,F0401,W0704,W0612,W0212,W0613,W0602,W0511,W0401,W0614,W0232,W0201,W0603,W0621,W0142,W0102,W0105,W0702,W0231,E0202,W0622,W0403,W0223,W0104,W1001,W0221,W0703,W0710,W0631,E1103 +-#: ../yumcommands.py:736 ++#: ../yumcommands.py:734 + msgid "List a package's dependencies" + msgstr "Lista ett pakets beroenden" +-#: ../yumcommands.py:742 ++#: ../yumcommands.py:740 + msgid "Finding dependencies: " + msgstr "Letar efter beroenden: " - [REPORTS] -diff --git a/utils.py b/utils.py -index dd6b642..b5b38bd 100644 ---- a/utils.py -+++ b/utils.py -@@ -105,7 +105,7 @@ def show_lock_owner(pid, logger): +-#: ../yumcommands.py:758 ++#: ../yumcommands.py:756 + msgid "Display the configured software repositories" + msgstr "Visa konfigurerade programvaruförråd" - ps = get_process_info(pid) - # This yumBackend isn't very friendly, so... -- if ps['name'] == 'yumBackend.py': -+ if ps is not None and ps['name'] == 'yumBackend.py': - nmsg = _(" The other application is: PackageKit") - else: - nmsg = _(" The other application is: %s") % ps['name'] -@@ -132,6 +132,10 @@ class YumUtilBase(YumBaseCli): - suppress_keyboard_interrupt_message() - logger = logging.getLogger("yum.util") - verbose_logger = logging.getLogger("yum.verbose.util") -+ # Add yum-utils version to history records. -+ if hasattr(self, 'run_with_package_names'): -+ self.run_with_package_names.add("yum-utils") -+ - - - def getOptionParser(self): -@@ -150,9 +154,12 @@ class YumUtilBase(YumBaseCli): - if "%s" %(e.msg,) != lockerr: - lockerr = "%s" %(e.msg,) - self.logger.critical(lockerr) -- self.logger.critical("Another app is currently holding the yum lock; waiting for it to exit...") -- show_lock_owner(e.pid, self.logger) -- time.sleep(2) -+ if not self.conf.exit_on_lock: -+ self.logger.critical("Another app is currently holding the yum lock; waiting for it to exit...") -+ show_lock_owner(e.pid, self.logger) -+ time.sleep(2) -+ else: -+ raise Errors.YumBaseError, _("Another app is currently holding the yum lock; exiting as configured by exit_on_lock") - else: - break - -@@ -162,6 +169,14 @@ class YumUtilBase(YumBaseCli): - def doUtilConfigSetup(self,args = sys.argv[1:],pluginsTypes=(plugins.TYPE_CORE,)): - # Parse only command line options that affect basic yum setup - opts = self._parser.firstParse(args) -+ -+ # go through all the setopts and set the global ones -+ self._parseSetOpts(opts.setopts) -+ -+ if self.main_setopts: -+ for opt in self.main_setopts.items: -+ setattr(opts, opt, getattr(self.main_setopts, opt)) -+ - # Just print out the version if that's what the user wanted - if opts.version: - self._printUtilVersion() -@@ -189,6 +204,11 @@ class YumUtilBase(YumBaseCli): - pc.enabled_plugins = self._parser._splitArg(opts.enableplugins) - self.conf +-#: ../yumcommands.py:810 ../yumcommands.py:811 ++#: ../yumcommands.py:822 ../yumcommands.py:823 + msgid "enabled" + msgstr "aktivt" -+ # now set all the non-first-start opts from main from our setopts -+ if self.main_setopts: -+ for opt in self.main_setopts.items: -+ setattr(self.conf, opt, getattr(self.main_setopts, opt)) -+ - except Errors.ConfigError, e: - self.logger.critical(_('Config Error: %s'), e) - sys.exit(1) -diff --git a/yum-updatesd.py b/yum-updatesd.py -index f96940c..1ce4720 100644 ---- a/yum-updatesd.py -+++ b/yum-updatesd.py -@@ -118,9 +118,7 @@ class SyslogUpdateEmitter(UpdateEmitter): - "DEBUG": syslog.LOG_DEBUG } - if type(lvl) == int: - return lvl -- if level_map.has_key(lvl.upper()): -- return level_map[lvl.upper()] -- return syslog.LOG_INFO -+ return level_map.get(lvl.upper(), syslog.LOG_INFO) +-#: ../yumcommands.py:819 ../yumcommands.py:820 ++#: ../yumcommands.py:849 ../yumcommands.py:850 + msgid "disabled" + msgstr "inaktivt" - def _facilityMap(self, facility): - facility_map = { "KERN": syslog.LOG_KERN, -@@ -142,9 +140,7 @@ class SyslogUpdateEmitter(UpdateEmitter): - "LOCAL7": syslog.LOG_LOCAL7,} - if type(facility) == int: - return facility -- elif facility_map.has_key(facility.upper()): -- return facility_map[facility.upper()] -- return syslog.LOG_DAEMON -+ return facility_map.get(facility.upper(), syslog.LOG_DAEMON) +-#: ../yumcommands.py:834 ++#: ../yumcommands.py:866 + msgid "Repo-id : " + msgstr "Förråds-id : " +-#: ../yumcommands.py:835 ++#: ../yumcommands.py:867 + msgid "Repo-name : " + msgstr "Förrådsnamn : " - class EmailUpdateEmitter(UpdateEmitter): -diff --git a/yum.spec b/yum.spec -index 29870e5..3b8b3f8 100644 ---- a/yum.spec -+++ b/yum.spec -@@ -22,14 +22,22 @@ Requires: pygpgme - Prereq: /sbin/chkconfig, /sbin/service, coreutils - Conflicts: yum-skip-broken - Conflicts: rpm >= 5-0 --Obsoletes: yum-basearchonly -+Obsoletes: yum-skip-broken <= 1.1.18 -+Obsoletes: yum-basearchonly <= 1.1.9 - Obsoletes: yum-allow-downgrade < 1.1.20-0 - Obsoletes: yum-plugin-allow-downgrade < 1.1.22-0 -+Obsoletes: yum-plugin-protect-packages < 1.1.27-0 -+Provides: yum-skip-broken -+Provides: yum-basearchonly -+Provides: yum-allow-downgrade -+Provides: yum-plugin-allow-downgrade -+Provides: yum-protect-packages -+Provides: yum-plugin-protect-packages +-#: ../yumcommands.py:836 ++#: ../yumcommands.py:870 + msgid "Repo-status : " + msgstr "Förrådsstatus : " - %description - Yum is a utility that can check for and automatically download and - install updated RPM packages. Dependencies are obtained and downloaded --automatically prompting the user as necessary. -+automatically, prompting the user for permission as necessary. +-#: ../yumcommands.py:838 ++#: ../yumcommands.py:873 + msgid "Repo-revision: " + msgstr "Förrådsversion : " - %package updatesd - Summary: Update notification daemon -@@ -57,6 +65,12 @@ make DESTDIR=$RPM_BUILD_ROOT install - # install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/etc/yum/yum.conf - # install -m 755 %{SOURCE2} $RPM_BUILD_ROOT/etc/cron.daily/yum.cron +-#: ../yumcommands.py:842 ++#: ../yumcommands.py:877 + msgid "Repo-tags : " + msgstr "Förrådstaggar : " -+# Ghost files: -+mkdir -p $RPM_BUILD_ROOT/var/lib/yum/history -+mkdir -p $RPM_BUILD_ROOT/var/lib/yum/plugins -+mkdir -p $RPM_BUILD_ROOT/var/lib/yum/yumdb -+touch $RPM_BUILD_ROOT/var/lib/yum/uuid -+ - %find_lang %name +-#: ../yumcommands.py:848 ++#: ../yumcommands.py:883 + msgid "Repo-distro-tags: " + msgstr "Förråds-distro-taggar: " - %clean -@@ -80,8 +94,10 @@ exit 0 - %doc README AUTHORS COPYING TODO INSTALL ChangeLog PLUGINS - %config(noreplace) %{_sysconfdir}/yum/yum.conf - %config(noreplace) %{_sysconfdir}/yum/version-groups.conf --%dir %{_sysconfdir}/%{name} -+%dir %{_sysconfdir}/yum -+%dir %{_sysconfdir}/yum/protected.d - %dir %{_sysconfdir}/yum/repos.d -+%dir %{_sysconfdir}/yum/vars - %config %{_sysconfdir}/logrotate.d/%{name} - %{_sysconfdir}/bash_completion.d - %{_datadir}/yum-cli/* -@@ -91,6 +107,10 @@ exit 0 - /usr/lib/python?.?/site-packages/rpmUtils - %dir /var/cache/yum - %dir /var/lib/yum -+%ghost /var/lib/yum/uuid -+%ghost /var/lib/yum/history -+%ghost /var/lib/yum/plugins -+%ghost /var/lib/yum/yumdb - %{_mandir}/man*/yum.* - %{_mandir}/man*/yum-shell* +-#: ../yumcommands.py:853 ++#: ../yumcommands.py:888 + msgid "Repo-updated : " + msgstr "Förråd uppdaterat: " -diff --git a/yum/__init__.py b/yum/__init__.py -index ea73549..aa522f8 100644 ---- a/yum/__init__.py -+++ b/yum/__init__.py -@@ -30,7 +30,7 @@ import fnmatch - import logging - import logging.config - import operator --import gzip -+ +-#: ../yumcommands.py:855 ++#: ../yumcommands.py:890 + msgid "Repo-pkgs : " + msgstr "Förrådspaket : " - import yum.i18n - _ = yum.i18n._ -@@ -41,7 +41,8 @@ from config import ParsingError, ConfigParser - import Errors - import rpmsack - import rpmUtils.updates --from rpmUtils.arch import canCoinstall, ArchStorage, isMultiLibArch -+from rpmUtils.arch import archDifference, canCoinstall, ArchStorage, isMultiLibArch -+from rpmUtils.miscutils import compareEVR - import rpmUtils.transaction - import comps - import pkgtag_db -@@ -102,7 +103,7 @@ class _YumPreBaseConf: - self.enabled_plugins = None - self.syslog_ident = None - self.syslog_facility = None -- self.syslog_device = '/dev/log' -+ self.syslog_device = None - self.arch = None - self.releasever = None - self.uuid = None -@@ -150,6 +151,9 @@ class YumBase(depsolve.Depsolve): - self.logger = logging.getLogger("yum.YumBase") - self.verbose_logger = logging.getLogger("yum.verbose.YumBase") - self._repos = RepoStorage(self) -+ self.repo_setopts = {} # since we have to use repo_setopts in base and -+ # not in cli - set it up as empty so no one -+ # trips over it later +-#: ../yumcommands.py:856 ++#: ../yumcommands.py:891 + msgid "Repo-size : " + msgstr "Förrådstorlek : " - # Start with plugins disabled - self.disablePlugins() -@@ -270,12 +274,15 @@ class YumBase(depsolve.Depsolve): - startupconf.syslog_ident = syslog_ident - if syslog_facility != None: - startupconf.syslog_facility = syslog_facility -+ if syslog_device != None: -+ startupconf.syslog_device = syslog_device - if releasever != None: - startupconf.releasever = releasever +-#: ../yumcommands.py:863 ++#: ../yumcommands.py:898 + msgid "Repo-baseurl : " + msgstr "Förrådsbasurl : " - self.doLoggingSetup(startupconf.debuglevel, startupconf.errorlevel, - startupconf.syslog_ident, -- startupconf.syslog_facility, syslog_device) -+ startupconf.syslog_facility, -+ startupconf.syslog_device) +-#: ../yumcommands.py:871 ++#: ../yumcommands.py:906 + msgid "Repo-metalink: " + msgstr "Förrådsmetalänk : " + +-#: ../yumcommands.py:875 ++#: ../yumcommands.py:910 + msgid " Updated : " + msgstr " Uppdaterat :" + +-#: ../yumcommands.py:878 ++#: ../yumcommands.py:913 + msgid "Repo-mirrors : " + msgstr "Förrådspeglar : " - if init_plugins and startupconf.plugins: - self.doPluginSetup(optparser, plugin_types, startupconf.pluginpath, -@@ -374,6 +381,10 @@ class YumBase(depsolve.Depsolve): - thisrepo.repo_config_age = repo_age - thisrepo.repofile = repofn +-#: ../yumcommands.py:882 ../yummain.py:133 +-msgid "Unknown" +-msgstr "Okänd" +- +-#: ../yumcommands.py:888 ++#: ../yumcommands.py:923 + #, python-format + msgid "Never (last: %s)" + msgstr "Aldrig (senast: %s)" -+ if thisrepo.id in self.repo_setopts: -+ for opt in self.repo_setopts[thisrepo.id].items: -+ setattr(thisrepo, opt, getattr(self.repo_setopts[thisrepo.id], opt)) -+ - if validate and not validate(thisrepo): - continue - -@@ -480,8 +491,7 @@ class YumBase(depsolve.Depsolve): - _('Reading Local RPMDB')) - self._rpmdb = rpmsack.RPMDBPackageSack(root=self.conf.installroot, - releasever=self.conf.yumvar['releasever'], -- persistdir=self.conf.persistdir, -- cachedir=self.conf.cachedir) -+ persistdir=self.conf.persistdir) - self.verbose_logger.debug('rpmdb time: %0.3f' % (time.time() - rpmdb_st)) - return self._rpmdb +-#: ../yumcommands.py:890 ++#: ../yumcommands.py:925 + #, python-format + msgid "Instant (last: %s)" + msgstr "Omedelbart (senast: %s)" -@@ -706,9 +716,9 @@ class YumBase(depsolve.Depsolve): - self.verbose_logger.log(logginglevels.DEBUG_4, - _('Adding group file from repository: %s'), repo) - groupfile = repo.getGroups() -- # open it up as a file object so iterparse can cope with our gz file -- if groupfile is not None and groupfile.endswith('.gz'): -- groupfile = gzip.open(groupfile) -+ # open it up as a file object so iterparse can cope with our compressed file -+ if groupfile: -+ groupfile = misc.decompress(groupfile) - - try: - self._comps.add(groupfile) -@@ -878,6 +888,45 @@ class YumBase(depsolve.Depsolve): +-#: ../yumcommands.py:893 ++#: ../yumcommands.py:928 + #, python-format + msgid "%s second(s) (last: %s)" + msgstr "%s sekunder (senast: %s)" - if self.tsInfo.pkgSack is not None: # rm Transactions don't have pkgSack - self.tsInfo.pkgSack.dropCachedData() -+ -+ # This is a version of the old "protect-packages" plugin, it allows -+ # you to erase duplicates and do remove+install. -+ # But we don't allow you to turn it off!:) -+ protect_states = [TS_OBSOLETED, TS_ERASE] -+ txmbrs = [] -+ if rescode == 2 and self.conf.protected_packages: -+ protected = set(self.conf.protected_packages) -+ txmbrs = self.tsInfo.getMembersWithState(None, protect_states) -+ bad_togo = {} -+ for txmbr in txmbrs: -+ if txmbr.name not in protected: -+ continue -+ if txmbr.name not in bad_togo: -+ bad_togo[txmbr.name] = [] -+ bad_togo[txmbr.name].append(txmbr.pkgtup) -+ for ipkg in self.rpmdb.searchNames(bad_togo.keys()): -+ if ipkg.name not in bad_togo: -+ continue -+ # If there is at least one version not being removed, allow it -+ if ipkg.pkgtup not in bad_togo[ipkg.name]: -+ del bad_togo[ipkg.name] -+ for pkgname in bad_togo.keys(): -+ for txmbr in self.tsInfo.matchNaevr(name=pkgname): -+ if txmbr.name not in bad_togo: -+ continue -+ if txmbr.pkgtup in bad_togo[ipkg.name]: -+ continue -+ # If we are installing one version we aren't removing, allow it -+ if txmbr.output_state in TS_INSTALL_STATES: -+ del bad_togo[ipkg.name] -+ -+ if bad_togo: -+ rescode = 1 -+ restring = [] -+ for pkgname in sorted(bad_togo): -+ restring.append(_('Trying to remove "%s", which is protected') % -+ pkgname) -+ - self.rpmdb.dropCachedData() +-#: ../yumcommands.py:895 ++#: ../yumcommands.py:930 + msgid "Repo-expire : " + msgstr "Förråd går ut : " - self.verbose_logger.debug('Depsolve time: %0.3f' % (time.time() - ds_st)) -@@ -890,7 +939,7 @@ class YumBase(depsolve.Depsolve): - # Try another depsolve - if self.conf.skip_broken and rescode==1: - if clear_skipped: -- self.skipped_packages = [] # reset the public list of skipped packages. -+ self.skipped_packages = [] # reset the public list of skipped packages. - sb_st = time.time() - rescode, restring = self._skipPackagesWithProblems(rescode, restring) - self._printTransaction() -@@ -975,6 +1024,10 @@ class YumBase(depsolve.Depsolve): - else: - self.verbose_logger.debug('SKIPBROKEN: resetting already resolved packages (transaction not changed)' ) - self.tsInfo.resetResolved(hard=True) -+ else: -+ # Reset the looping counter, because it is only a loop if the same transaction is -+ # unchanged two times in row, not if it has been unchanged in a early stage. -+ looping = 0 - - # if we are all clear, then we have to check that the whole current transaction - # can complete the depsolve without error, because the packages skipped -@@ -1129,27 +1182,73 @@ class YumBase(depsolve.Depsolve): - toRemove.add(dep) - self._getDepsToRemove(dep, deptree, toRemove) +-#: ../yumcommands.py:898 ++#: ../yumcommands.py:933 + msgid "Repo-exclude : " + msgstr "Förråd utesluter : " -- def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd='all'): -+ def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd=None, header=None, -+ ignore_pkgs=[]): - if out is None: - out = self.logger.warning -+ if chkcmd is None: -+ chkcmd = ['dependencies', 'duplicates'] -+ if header is None: -+ # FIXME: _N() -+ msg = _("** Found %d pre-existing rpmdb problem(s)," -+ " 'yum check' output follows:") -+ header = lambda problems: not problems or out(msg % problems) - if warn: - out(_('Warning: RPMDB altered outside of yum.')) +-#: ../yumcommands.py:902 ++#: ../yumcommands.py:937 + msgid "Repo-include : " + msgstr "Förråd inkluderar: " -+ if type(chkcmd) in (type([]), type(set())): -+ chkcmd = set(chkcmd) -+ else: -+ chkcmd = set([chkcmd]) -+ -+ ignore_pkgtups = set((pkg.pkgtup for pkg in ignore_pkgs)) ++#: ../yumcommands.py:941 ++#, fuzzy ++msgid "Repo-excluded: " ++msgstr "Förråd utesluter : " + - rc = 0 - probs = [] -- if chkcmd in ('all', 'dependencies'): -+ if chkcmd.intersection(set(('all', 'dependencies'))): - prob2ui = {'requires' : _('missing requires'), - 'conflicts' : _('installed conflict')} -- probs.extend(self.rpmdb.check_dependencies()) -+ for prob in self.rpmdb.check_dependencies(): -+ if prob.pkg.pkgtup in ignore_pkgtups: -+ continue -+ if prob.problem == 'conflicts': -+ found = True # all the conflicting pkgs have to be ignored -+ for res in prob.conflicts: -+ if res.pkgtup not in ignore_pkgtups: -+ found = False -+ break -+ if found: -+ continue -+ probs.append(prob) + #. Work out the first (id) and last (enabled/disalbed/count), + #. then chop the middle (name)... +-#: ../yumcommands.py:912 ../yumcommands.py:938 ++#: ../yumcommands.py:951 ../yumcommands.py:980 + msgid "repo id" + msgstr "förråds-id" -- if chkcmd in ('all', 'duplicates'): -+ if chkcmd.intersection(set(('all', 'duplicates'))): - iopkgs = set(self.conf.installonlypkgs) -- probs.extend(self.rpmdb.check_duplicates(iopkgs)) -+ for prob in self.rpmdb.check_duplicates(iopkgs): -+ if prob.pkg.pkgtup in ignore_pkgtups: -+ continue -+ if prob.duplicate.pkgtup in ignore_pkgtups: -+ continue -+ probs.append(prob) +-#: ../yumcommands.py:926 ../yumcommands.py:927 ../yumcommands.py:941 ++#: ../yumcommands.py:968 ../yumcommands.py:969 ../yumcommands.py:987 + msgid "status" + msgstr "status" -+ if chkcmd.intersection(set(('all', 'obsoleted'))): -+ for prob in self.rpmdb.check_obsoleted(): -+ if prob.pkg.pkgtup in ignore_pkgtups: -+ continue -+ if prob.obsoleter.pkgtup in ignore_pkgtups: -+ continue -+ probs.append(prob) -+ -+ if chkcmd.intersection(set(('all', 'provides'))): -+ for prob in self.rpmdb.check_provides(): -+ if prob.pkg.pkgtup in ignore_pkgtups: -+ continue -+ probs.append(prob) -+ -+ header(len(probs)) - for prob in sorted(probs): - out(prob) +-#: ../yumcommands.py:939 ++#: ../yumcommands.py:981 + msgid "repo name" + msgstr "förrådsnamn" -- return len(probs) -+ return probs +-#: ../yumcommands.py:965 ++#: ../yumcommands.py:1018 + msgid "Display a helpful usage message" + msgstr "Visa ett hjälpsamt meddelande om användning" - def runTransaction(self, cb): - """takes an rpm callback object, performs the transaction""" -@@ -1163,16 +1262,25 @@ class YumBase(depsolve.Depsolve): - self.run_with_package_names.add('yum-metadata-parser') - break +-#: ../yumcommands.py:999 ++#: ../yumcommands.py:1052 + #, python-format + msgid "No help available for %s" + msgstr "Ingen hjälp tillgänglig för %s" -- using_pkgs_pats = list(self.run_with_package_names) -- using_pkgs = self.rpmdb.returnPackages(patterns=using_pkgs_pats) -- rpmdbv = self.rpmdb.simpleVersion(main_only=True)[0] -- lastdbv = self.history.last() -- if lastdbv is not None: -- lastdbv = lastdbv.end_rpmdbversion -- if lastdbv is None or rpmdbv != lastdbv: -- self._rpmdb_warn_checks(warn=lastdbv is not None) - if self.conf.history_record: -- self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo)) -+ using_pkgs_pats = list(self.run_with_package_names) -+ using_pkgs = self.rpmdb.returnPackages(patterns=using_pkgs_pats) -+ rpmdbv = self.rpmdb.simpleVersion(main_only=True)[0] -+ lastdbv = self.history.last() -+ if lastdbv is not None: -+ lastdbv = lastdbv.end_rpmdbversion -+ rpmdb_problems = [] -+ if lastdbv is None or rpmdbv != lastdbv: -+ txmbrs = self.tsInfo.getMembersWithState(None, TS_REMOVE_STATES) -+ ignore_pkgs = [txmbr.po for txmbr in txmbrs] -+ output_warn = lastdbv is not None -+ rpmdb_problems = self._rpmdb_warn_checks(warn=output_warn, -+ ignore_pkgs=ignore_pkgs) -+ cmdline = None -+ if hasattr(self, 'cmds') and self.cmds: -+ cmdline = ' '.join(self.cmds) -+ self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo), -+ self.skipped_packages, rpmdb_problems, cmdline) +-#: ../yumcommands.py:1004 ++#: ../yumcommands.py:1057 + msgid "" + "\n" + "\n" +@@ -1489,7 +1654,7 @@ msgstr "" + "\n" + "alias: " - # Just before we update the transaction, update what we think the - # rpmdb will look like. This needs to be done before the run, so that if -@@ -1199,7 +1307,12 @@ class YumBase(depsolve.Depsolve): - if self.conf.history_record: - herrors = [to_unicode(to_str(x)) for x in errors] - self.history.end(rpmdbv, 2, errors=herrors) -- raise Errors.YumBaseError, errors -+ -+ self.logger.critical(_("Transaction couldn't start:")) -+ for e in errors: -+ self.logger.critical(e[0]) # should this be 'to_unicoded'? -+ raise Errors.YumBaseError, _("Could not run transaction.") -+ - - if not self.conf.keepcache: - self.cleanUsedHeadersPackages() -@@ -1482,7 +1595,7 @@ class YumBase(depsolve.Depsolve): - os.unlink(fo) +-#: ../yumcommands.py:1006 ++#: ../yumcommands.py:1059 + msgid "" + "\n" + "\n" +@@ -1499,148 +1664,102 @@ msgstr "" + "\n" + "alias: " - if raiseError: -- msg = _('Package does not match intended download. Suggestion: run yum clean metadata') -+ msg = _('Package does not match intended download. Suggestion: run yum --enablerepo=%s clean metadata') % po.repo.id - raise URLGrabError(-1, msg) - else: - return False -@@ -1820,7 +1933,7 @@ class YumBase(depsolve.Depsolve): - return self._cleanFiles(exts, 'cachedir', 'metadata') +-#: ../yumcommands.py:1034 ++#: ../yumcommands.py:1087 + msgid "Setting up Reinstall Process" + msgstr "Förbereder ominstallationsprocessen" - def cleanRpmDB(self): -- cachedir = self.conf.cachedir + "/installed/" -+ cachedir = self.conf.persistdir + "/rpmdb-indexes/" - if not os.path.exists(cachedir): - filelist = [] - else: -@@ -2012,7 +2125,6 @@ class YumBase(depsolve.Depsolve): - elif pkgnarrow == 'recent': - now = time.time() - recentlimit = now-(self.conf.recent*86400) -- ftimehash = {} - if showdups: - avail = self.pkgSack.returnPackages(patterns=patterns, - ignore_case=ic) -@@ -2024,15 +2136,7 @@ class YumBase(depsolve.Depsolve): - avail = [] - - for po in avail: -- ftime = int(po.filetime) -- if ftime > recentlimit: -- if not ftimehash.has_key(ftime): -- ftimehash[ftime] = [po] -- else: -- ftimehash[ftime].append(po) -- -- for sometime in ftimehash: -- for po in ftimehash[sometime]: -+ if int(po.filetime) > recentlimit: - recent.append(po) - - -@@ -2090,10 +2194,7 @@ class YumBase(depsolve.Depsolve): - the search keys in the results. """ - sql_fields = [] - for f in fields: -- if RPM_TO_SQLITE.has_key(f): -- sql_fields.append(RPM_TO_SQLITE[f]) -- else: -- sql_fields.append(f) -+ sql_fields.append(RPM_TO_SQLITE.get(f, f)) +-#: ../yumcommands.py:1042 ++#: ../yumcommands.py:1095 + msgid "reinstall a package" + msgstr "ominstallera ett paket" - # yield the results in order of most terms matched first - sorted_lists = {} # count_of_matches = [(pkgobj, -@@ -2163,10 +2264,10 @@ class YumBase(depsolve.Depsolve): +-#: ../yumcommands.py:1060 ++#: ../yumcommands.py:1113 + msgid "Setting up Downgrade Process" + msgstr "Förbereder nedgraderingsprocessen" - # do the ones we already have - for item in sorted_lists.values(): -- for pkg, keys, values in item: -+ for pkg, k, v in item: - if pkg not in results_by_pkg: - results_by_pkg[pkg] = [] -- results_by_pkg[pkg].append((keys,values)) -+ results_by_pkg[pkg].append((k,v)) +-#: ../yumcommands.py:1067 ++#: ../yumcommands.py:1120 + msgid "downgrade a package" + msgstr "nedgradera ett paket" - # take our existing dict-by-pkg and make the dict-by-count for - # this bizarro sorted_lists format -@@ -2175,9 +2276,9 @@ class YumBase(depsolve.Depsolve): - for pkg in results_by_pkg: - totkeys = [] - totvals = [] -- for (keys, values) in results_by_pkg[pkg]: -- totkeys.extend(keys) -- totvals.extend(values) -+ for (k, v) in results_by_pkg[pkg]: -+ totkeys.extend(k) -+ totvals.extend(v) - - totkeys = misc.unique(totkeys) - totvals = misc.unique(totvals) -@@ -2238,7 +2339,7 @@ class YumBase(depsolve.Depsolve): - for (po, matched_strings) in match_gen: - if callback: - callback(po, matched_strings) -- if not matches.has_key(po): -+ if po not in matches: - matches[po] = [] - - matches[po].extend(matched_strings) -@@ -2514,8 +2615,8 @@ class YumBase(depsolve.Depsolve): - txmbr.groups.append(thisgroup.groupid) - self.tsInfo.conditionals[cond].append(txmbr.po) - continue -- # Otherwise we hook into tsInfo.add to make -- # sure we'll catch it if its added later in this transaction -+ # Otherwise we hook into tsInfo.add to make sure -+ # we'll catch it if it's added later in this transaction - pkgs = self.pkgSack.searchNevra(name=condreq) - if pkgs: - if self.arch.multilib: -@@ -2530,7 +2631,7 @@ class YumBase(depsolve.Depsolve): - - pkgs = packagesNewestByName(pkgs) +-#: ../yumcommands.py:1081 ++#: ../yumcommands.py:1134 + msgid "Display a version for the machine and/or available repos." + msgstr "Visa en version för maskinen och/eller tillgängliga förråd." -- if not self.tsInfo.conditionals.has_key(cond): -+ if cond not in self.tsInfo.conditionals: - self.tsInfo.conditionals[cond] = [] - self.tsInfo.conditionals[cond].extend(pkgs) - return txmbrs_used -@@ -2573,7 +2674,7 @@ class YumBase(depsolve.Depsolve): - for pkg in self.tsInfo.conditionals.get(txmbr.name, []): - self.tsInfo.remove(pkg.pkgtup) - -- def getPackageObject(self, pkgtup): -+ def getPackageObject(self, pkgtup, allow_missing=False): - """retrieves a packageObject from a pkgtuple - if we need - to pick and choose which one is best we better call out - to some method from here to pick the best pkgobj if there are -@@ -2588,6 +2689,8 @@ class YumBase(depsolve.Depsolve): - pkgs = self.pkgSack.searchPkgTuple(pkgtup) +-#: ../yumcommands.py:1111 ++#: ../yumcommands.py:1173 + msgid " Yum version groups:" + msgstr "" - if len(pkgs) == 0: -+ if allow_missing: # This can happen due to excludes after .up has -+ return None # happened. - raise Errors.DepError, _('Package tuple %s could not be found in packagesack') % str(pkgtup) - - if len(pkgs) > 1: # boy it'd be nice to do something smarter here FIXME -@@ -2643,7 +2746,9 @@ class YumBase(depsolve.Depsolve): - def returnPackagesByDep(self, depstring): - """Pass in a generic [build]require string and this function will - pass back the packages it finds providing that dep.""" -- -+ -+ if not depstring: -+ return [] - results = self.pkgSack.searchProvides(depstring) - return results - -@@ -2673,6 +2778,9 @@ class YumBase(depsolve.Depsolve): - """Pass in a generic [build]require string and this function will - pass back the installed packages it finds providing that dep.""" - -+ if not depstring: -+ return [] -+ - # parse the string out - # either it is 'dep (some operator) e:v-r' - # or /file/dep -@@ -2781,9 +2889,53 @@ class YumBase(depsolve.Depsolve): - we should install instead. Or None if there isn't one. """ - thispkgobsdict = self.up.checkForObsolete([po.pkgtup]) - if po.pkgtup in thispkgobsdict: -- obsoleting = thispkgobsdict[po.pkgtup][0] -- obsoleting_pkg = self.getPackageObject(obsoleting) -- return obsoleting_pkg -+ obsoleting = thispkgobsdict[po.pkgtup] -+ oobsoleting = [] -+ # We want to keep the arch. of the obsoleted pkg. if possible. -+ for opkgtup in obsoleting: -+ if not canCoinstall(po.arch, opkgtup[1]): -+ oobsoleting.append(opkgtup) -+ if oobsoleting: -+ obsoleting = oobsoleting -+ if len(obsoleting) > 1: -+ # Pick the first name, and run with it... -+ first = obsoleting[0] -+ obsoleting = [pkgtup for pkgtup in obsoleting -+ if first[0] == pkgtup[0]] -+ if len(obsoleting) > 1: -+ # Lock to the latest version... -+ def _sort_ver(x, y): -+ n1,a1,e1,v1,r1 = x -+ n2,a2,e2,v2,r2 = y -+ return compareEVR((e1,v1,r1), (e2,v2,r2)) -+ obsoleting.sort(_sort_ver) -+ first = obsoleting[0] -+ obsoleting = [pkgtup for pkgtup in obsoleting -+ if not _sort_ver(first, pkgtup)] -+ if len(obsoleting) > 1: -+ # Now do arch distance (see depsolve:compare_providers)... -+ def _sort_arch_i(carch, a1, a2): -+ res1 = archDifference(carch, a1) -+ if not res1: -+ return 0 -+ res2 = archDifference(carch, a2) -+ if not res2: -+ return 0 -+ return res1 - res2 -+ def _sort_arch(x, y): -+ n1,a1,e1,v1,r1 = x -+ n2,a2,e2,v2,r2 = y -+ ret = _sort_arch_i(po.arch, a1, a2) -+ if ret: -+ return ret -+ ret = _sort_arch_i(self.arch.bestarch, a1, a2) -+ return ret -+ obsoleting.sort(_sort_arch) -+ for pkgtup in obsoleting: -+ pkg = self.getPackageObject(pkgtup, allow_missing=True) -+ if pkg is not None: -+ return pkg -+ return None - return None +-#: ../yumcommands.py:1121 ++#: ../yumcommands.py:1183 + #, fuzzy + msgid " Group :" + msgstr " Grupp-id: %s" + +-#: ../yumcommands.py:1122 ++#: ../yumcommands.py:1184 + #, fuzzy + msgid " Packages:" + msgstr "Paket" + +-#: ../yumcommands.py:1152 ++#: ../yumcommands.py:1213 + msgid "Installed:" + msgstr "Installerade:" + +-#: ../yumcommands.py:1157 ++#: ../yumcommands.py:1218 + #, fuzzy + msgid "Group-Installed:" + msgstr "Installerade:" + +-#: ../yumcommands.py:1166 ++#: ../yumcommands.py:1227 + msgid "Available:" + msgstr "Tillgängliga:" - def _test_loop(self, node, next_func): -@@ -2846,6 +2998,17 @@ class YumBase(depsolve.Depsolve): - pkgnames.update(thisgroup.packages) - return self.pkgSack.searchNames(pkgnames) +-#: ../yumcommands.py:1172 ++#: ../yumcommands.py:1233 + #, fuzzy + msgid "Group-Available:" + msgstr "Tillgängliga:" -+ def _minus_deselect(self, pattern): -+ """ Remove things from the transaction, like kickstart. """ -+ assert pattern[0] == '-' -+ pat = pattern[1:] -+ -+ if pat and pat[0] == '@': -+ pat = pat[1:] -+ return self.deselectGroup(pat) -+ -+ return self.tsInfo.deselect(pat) -+ - def _find_obsoletees(self, po): - """ Return the pkgs. that are obsoleted by the po we pass in. """ - if not isinstance(po, YumLocalPackage): -@@ -2854,11 +3017,9 @@ class YumBase(depsolve.Depsolve): - installed_pkg = self.getInstalledPackageObject(inst_tup) - yield installed_pkg - else: -- for (obs_n, obs_f, (obs_e, obs_v, obs_r)) in po.obsoletes: -+ for obs_n in po.obsoletes_names: - for pkg in self.rpmdb.searchNevra(name=obs_n): -- installedtup = (pkg.name, 'EQ', (pkg.epoch, -- pkg.ver, pkg.release)) -- if po.inPrcoRange('obsoletes', installedtup): -+ if pkg.obsoletedBy([po]): - yield pkg +-#: ../yumcommands.py:1211 ++#: ../yumcommands.py:1272 + msgid "Display, or use, the transaction history" + msgstr "" - def _add_prob_flags(self, *flags): -@@ -2888,7 +3049,10 @@ class YumBase(depsolve.Depsolve): - raise Errors.InstallError, _('Nothing specified to install') +-#: ../yumcommands.py:1239 ++#: ../yumcommands.py:1300 + #, python-format + msgid "Invalid history sub-command, use: %s." + msgstr "" - if 'pattern' in kwargs: -- if kwargs['pattern'][0] == '@': -+ if kwargs['pattern'] and kwargs['pattern'][0] == '-': -+ return self._minus_deselect(kwargs['pattern']) -+ -+ if kwargs['pattern'] and kwargs['pattern'][0] == '@': - return self._at_groupinstall(kwargs['pattern']) +-#: ../yummain.py:128 +-msgid "Running" +-msgstr "Kör" +- +-#: ../yummain.py:129 +-msgid "Sleeping" +-msgstr "Sover" +- +-#: ../yummain.py:130 +-msgid "Uninteruptable" +-msgstr "Oavbrytbar" +- +-#: ../yummain.py:131 +-msgid "Zombie" +-msgstr "Zombie" +- +-#: ../yummain.py:132 +-msgid "Traced/Stopped" +-msgstr "Spårad/Stoppad" +- +-#: ../yummain.py:137 +-msgid " The other application is: PackageKit" +-msgstr " Det andra programmet är: PackageKit" +- +-#: ../yummain.py:139 +-#, python-format +-msgid " The other application is: %s" +-msgstr " Det andra programmet är: %s" +- +-#: ../yummain.py:142 +-#, python-format +-msgid " Memory : %5s RSS (%5sB VSZ)" +-msgstr " Minne : %5s RSS (%5s B VSZ)" +- +-#: ../yummain.py:146 +-#, python-format +-msgid " Started: %s - %s ago" +-msgstr " Startade: %s - för %s sedan" +- +-#: ../yummain.py:148 +-#, python-format +-msgid " State : %s, pid: %d" +-msgstr " Status : %s, pid: %d" ++#: ../yumcommands.py:1345 ++msgid "Check for problems in the rpmdb" ++msgstr "" - was_pattern = True -@@ -2957,7 +3121,7 @@ class YumBase(depsolve.Depsolve): +-#: ../yummain.py:173 ++#: ../yummain.py:102 + msgid "" + "Another app is currently holding the yum lock; waiting for it to exit..." + msgstr "" + "Ett annat program håller för närvarande yum-låset, väntar på att den skall " + "avsluta ..." - pkgbyname = {} - for pkg in pkgs: -- if not pkgbyname.has_key(pkg.name): -+ if pkg.name not in pkgbyname: - pkgbyname[pkg.name] = [ pkg ] - else: - pkgbyname[pkg.name].append(pkg) -@@ -3017,18 +3181,23 @@ class YumBase(depsolve.Depsolve): - # pull in foo.i586 when foo.x86_64 already obsoletes the pkg and - # is already installed - already_obs = None -- poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release)) -- for pkg in self.rpmdb.searchNevra(name=obsoleting_pkg.name): -- if pkg.inPrcoRange('obsoletes', poprovtup): -- already_obs = pkg -- continue -+ pkgs = self.rpmdb.searchNevra(name=obsoleting_pkg.name) -+ pkgs = po.obsoletedBy(pkgs, limit=1) -+ if pkgs: -+ already_obs = pkgs[0] -+ continue +-#: ../yummain.py:201 ../yummain.py:240 ++#: ../yummain.py:130 ../yummain.py:169 + #, python-format + msgid "Error: %s" + msgstr "Fel: %s" - if already_obs: - self.verbose_logger.warning(_('Package %s is obsoleted by %s which is already installed'), - po, already_obs) - else: -+ if 'provides_for' in kwargs: -+ if not obsoleting_pkg.provides_for(kwargs['provides_for']): -+ self.verbose_logger.warning(_('Package %s is obsoleted by %s, but obsoleting package does not provide for requirements'), -+ po.name, obsoleting_pkg.name) -+ continue - self.verbose_logger.warning(_('Package %s is obsoleted by %s, trying to install %s instead'), -- po.name, obsoleting_pkg.name, obsoleting_pkg) -+ po.name, obsoleting_pkg.name, obsoleting_pkg) - tx_return.extend(self.install(po=obsoleting_pkg)) - continue - -@@ -3160,7 +3329,10 @@ class YumBase(depsolve.Depsolve): - obsoletes = [] +-#: ../yummain.py:211 ../yummain.py:253 ++#: ../yummain.py:140 ../yummain.py:182 + #, python-format + msgid "Unknown Error(s): Exit Code: %d:" + msgstr "Okänt fel: Felkod: %d:" - for (obsoleting, installed) in obsoletes: -- obsoleting_pkg = self.getPackageObject(obsoleting) -+ obsoleting_pkg = self.getPackageObject(obsoleting, -+ allow_missing=True) -+ if obsoleting_pkg is None: -+ continue - topkg = self._test_loop(obsoleting_pkg, self._pkg2obspkg) - if topkg is not None: - obsoleting_pkg = topkg -@@ -3173,10 +3345,13 @@ class YumBase(depsolve.Depsolve): - - for (new, old) in updates: - if self.tsInfo.isObsoleted(pkgtup=old): -- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), -+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % - old) - else: -- tx_return.extend(self.update(po=self.getPackageObject(new))) -+ new = self.getPackageObject(new, allow_missing=True) -+ if new is None: -+ continue -+ tx_return.extend(self.update(po=new)) - - return tx_return + #. Depsolve stage +-#: ../yummain.py:218 ++#: ../yummain.py:147 + msgid "Resolving Dependencies" + msgstr "Löser upp beroenden" -@@ -3195,7 +3370,10 @@ class YumBase(depsolve.Depsolve): - - - elif 'pattern' in kwargs: -- if kwargs['pattern'][0] == '@': -+ if kwargs['pattern'] and kwargs['pattern'][0] == '-': -+ return self._minus_deselect(kwargs['pattern']) -+ -+ if kwargs['pattern'] and kwargs['pattern'][0] == '@': - return self._at_groupinstall(kwargs['pattern']) +-#: ../yummain.py:242 ++#: ../yummain.py:173 + msgid " You could try using --skip-broken to work around the problem" + msgstr " Du kan försöka använda --skip-broken för att gå runt problemet" - (e, m, u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) -@@ -3268,7 +3446,13 @@ class YumBase(depsolve.Depsolve): - obs_tups = self.up.obsoleted_dict.get(installed_pkg.pkgtup, []) - # This is done so we don't have to returnObsoletes(newest=True) - # It's a minor UI problem for RHEL, but might as well dtrt. -- obs_pkgs = [self.getPackageObject(tup) for tup in obs_tups] -+ obs_pkgs = [] -+ for pkgtup in obs_tups: -+ obsoleting_pkg = self.getPackageObject(pkgtup, -+ allow_missing=True) -+ if obsoleting_pkg is None: -+ continue -+ obs_pkgs.append(obsoleting_pkg) - for obsoleting_pkg in packagesNewestByName(obs_pkgs): - tx_return.extend(self.install(po=obsoleting_pkg)) - for available_pkg in availpkgs: -@@ -3279,16 +3463,18 @@ class YumBase(depsolve.Depsolve): - txmbr.setAsDep(requiringPo) - tx_return.append(txmbr) - if self.tsInfo.isObsoleted(obsoleted): -- self.verbose_logger.log(logginglevels.DEBUG_2, _('Package is already obsoleted: %s.%s %s:%s-%s'), obsoleted) -+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Package is already obsoleted: %s.%s %s:%s-%s') % obsoleted) - else: - txmbr = self.tsInfo.addObsoleted(obsoleted_pkg, available_pkg) - tx_return.append(txmbr) +-#: ../yummain.py:243 +-msgid "" +-" You could try running: package-cleanup --problems\n" +-" package-cleanup --dupes\n" +-" rpm -Va --nofiles --nodigest" ++#: ../yummain.py:175 ../yummain.py:208 ++msgid " You could try running: rpm -Va --nofiles --nodigest" + msgstr "" +-" Du kan försöka köra: package-cleanup --problems\n" +-" package-cleanup --dupes\n" +-" rpm -Va --nofiles --nodigest" + +-#: ../yummain.py:259 ++#: ../yummain.py:188 + msgid "" + "\n" + "Dependencies Resolved" +@@ -1648,7 +1767,7 @@ msgstr "" + "\n" + "Beroenden upplösta" + +-#: ../yummain.py:326 ++#: ../yummain.py:265 + msgid "" + "\n" + "\n" +@@ -1686,170 +1805,165 @@ msgstr "Potentiell match av %s från %s" + msgid "Matched %s to require for %s" + msgstr "Matchade %s mot behov från %s" + +-#: ../yum/depsolve.py:224 ++#: ../yum/depsolve.py:225 + #, python-format + msgid "Member: %s" + msgstr "Medlem: %s" + +-#: ../yum/depsolve.py:238 ../yum/depsolve.py:749 ++#: ../yum/depsolve.py:239 ../yum/depsolve.py:754 + #, python-format + msgid "%s converted to install" + msgstr "%s konverterad till att installera" + +-#: ../yum/depsolve.py:245 ++#: ../yum/depsolve.py:246 + #, python-format + msgid "Adding Package %s in mode %s" + msgstr "Lägger till paket %s i läge %s" - for installed_pkg in instpkgs: - for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []): -- po = self.getPackageObject(updating) -+ po = self.getPackageObject(updating, allow_missing=True) -+ if po is None: -+ continue - if self.tsInfo.isObsoleted(installed_pkg.pkgtup): -- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), -+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % - installed_pkg.pkgtup) - # at this point we are going to mark the pkg to be installed, make sure - # it doesn't obsolete anything. If it does, mark that in the tsInfo, too -@@ -3315,11 +3501,11 @@ class YumBase(depsolve.Depsolve): - continue - for updated in self.up.updating_dict.get(available_pkg.pkgtup, []): - if self.tsInfo.isObsoleted(updated): -- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), -+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % - updated) - elif self._newer_update_in_trans(updated, available_pkg, - tx_return): -- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s'), -+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s') % - updated) - - else: -@@ -3341,11 +3527,11 @@ class YumBase(depsolve.Depsolve): +-#: ../yum/depsolve.py:255 ++#: ../yum/depsolve.py:256 + #, python-format + msgid "Removing Package %s" + msgstr "Tar bort paket %s" - for ipkg in pot_updated: - if self.tsInfo.isObsoleted(ipkg.pkgtup): -- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), -+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % - ipkg.pkgtup) - elif self._newer_update_in_trans(ipkg.pkgtup, available_pkg, - tx_return): -- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s'), -+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s') % - ipkg.pkgtup) - elif ipkg.verLT(available_pkg): - txmbr = self._add_up_txmbr(requiringPo, available_pkg, ipkg) -@@ -3376,7 +3562,10 @@ class YumBase(depsolve.Depsolve): - pkgs = [po] - else: - if 'pattern' in kwargs: -- if kwargs['pattern'][0] == '@': -+ if kwargs['pattern'] and kwargs['pattern'][0] == '-': -+ return self._minus_deselect(kwargs['pattern']) -+ -+ if kwargs['pattern'] and kwargs['pattern'][0] == '@': - return self._at_groupremove(kwargs['pattern']) +-#: ../yum/depsolve.py:277 ++#: ../yum/depsolve.py:278 + #, python-format + msgid "%s requires: %s" + msgstr "%s behöver: %s" - (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) -@@ -3670,7 +3859,10 @@ class YumBase(depsolve.Depsolve): - if po: - apkgs = [po] - elif 'pattern' in kwargs: -- if kwargs['pattern'][0] == '@': -+ if kwargs['pattern'] and kwargs['pattern'][0] == '-': -+ return self._minus_deselect(kwargs['pattern']) +-#: ../yum/depsolve.py:335 ++#: ../yum/depsolve.py:319 ++#, fuzzy, python-format ++msgid "%s requires %s" ++msgstr "%s behöver: %s" + -+ if kwargs['pattern'] and kwargs['pattern'][0] == '@': - apkgs = self._at_groupdowngrade(kwargs['pattern']) - doing_group_pkgs = True # Don't warn. about some things - else: -@@ -4312,9 +4504,7 @@ class YumBase(depsolve.Depsolve): - newrepo = yumRepo.YumRepository(repoid) - newrepo.name = repoid - newrepo.basecachedir = self.conf.cachedir -- var_convert = True -- if kwargs.has_key('variable_convert') and not kwargs['variable_convert']: -- var_convert = False -+ var_convert = kwargs.get('variable_convert', True) - - if baseurls: - replaced = [] -@@ -4351,13 +4541,17 @@ class YumBase(depsolve.Depsolve): - self.repos.enableRepo(newrepo.id) - return newrepo - -- def setCacheDir(self, force=False, tmpdir='/var/tmp', reuse=True, -+ def setCacheDir(self, force=False, tmpdir=None, reuse=True, - suffix='/$basearch/$releasever'): - ''' Set a new cache dir, using misc.getCacheDir() and var. replace - on suffix. ''' ++#: ../yum/depsolve.py:346 + msgid "Needed Require has already been looked up, cheating" + msgstr "Nödvändigt behov har redan slagits upp, fuskar" - if not force and os.geteuid() == 0: - return True # We are root, not forced, so happy with the global dir. -+ if tmpdir is None: -+ tmpdir = os.getenv('TMPDIR') -+ if tmpdir is None: # Note that TMPDIR isn't exported by default :( -+ tmpdir = '/var/tmp' - try: - cachedir = misc.getCacheDir(tmpdir, reuse) - except (IOError, OSError), e: -@@ -4369,7 +4563,6 @@ class YumBase(depsolve.Depsolve): +-#: ../yum/depsolve.py:345 ++#: ../yum/depsolve.py:356 + #, python-format + msgid "Needed Require is not a package name. Looking up: %s" + msgstr "Nödvändigt behov är inte ett paketnamn. Slår upp: %s" - cachedir += varReplace(suffix, self.conf.yumvar) - self.repos.setCacheDir(cachedir) -- self.rpmdb.setCacheDir(cachedir) - self.conf.cachedir = cachedir - return True # We got a new cache dir +-#: ../yum/depsolve.py:352 ++#: ../yum/depsolve.py:363 + #, python-format + msgid "Potential Provider: %s" + msgstr "Potentiell tillhandahållare: %s" -@@ -4380,7 +4573,7 @@ class YumBase(depsolve.Depsolve): - - if pkg1.name != pkg2.name: - return False -- if not pkg1.EVR > pkg2.EVR: -+ if pkg1.verLE(pkg2): - return False - if pkg1.arch not in self.arch.archlist: - return False -diff --git a/yum/comps.py b/yum/comps.py -index bbc1ac9..bf070fa 100755 ---- a/yum/comps.py -+++ b/yum/comps.py -@@ -32,10 +32,7 @@ from misc import get_my_lang_code - lang_attr = '{http://www.w3.org/XML/1998/namespace}lang' +-#: ../yum/depsolve.py:375 ++#: ../yum/depsolve.py:386 + #, python-format + msgid "Mode is %s for provider of %s: %s" + msgstr "Läget är %s för tillhandahållare av %s: %s" - def parse_boolean(strng): -- if BOOLEAN_STATES.has_key(strng.lower()): -- return BOOLEAN_STATES[strng.lower()] -- else: -- return False -+ return BOOLEAN_STATES.get(strng.lower(), False) +-#: ../yum/depsolve.py:379 ++#: ../yum/depsolve.py:390 + #, python-format + msgid "Mode for pkg providing %s: %s" + msgstr "Läge för paket som tillhandahåller %s: %s" - def parse_number(strng): - return int(strng) -@@ -235,11 +232,11 @@ class Group(CompsObj): - - # name and description translations - for lang in obj.translated_name: -- if not self.translated_name.has_key(lang): -+ if lang not in self.translated_name: - self.translated_name[lang] = obj.translated_name[lang] - - for lang in obj.translated_description: -- if not self.translated_description.has_key(lang): -+ if lang not in self.translated_description: - self.translated_description[lang] = obj.translated_description[lang] - - def xml(self): -@@ -348,11 +345,11 @@ class Category(CompsObj): - - # name and description translations - for lang in obj.translated_name: -- if not self.translated_name.has_key(lang): -+ if lang not in self.translated_name: - self.translated_name[lang] = obj.translated_name[lang] - - for lang in obj.translated_description: -- if not self.translated_description.has_key(lang): -+ if lang not in self.translated_description: - self.translated_description[lang] = obj.translated_description[lang] +-#: ../yum/depsolve.py:383 ++#: ../yum/depsolve.py:394 + #, python-format + msgid "TSINFO: %s package requiring %s marked as erase" + msgstr "TSINFO: paket %s behöver %s noteras att raderas" - def xml(self): -@@ -424,7 +421,7 @@ class Comps(object): +-#: ../yum/depsolve.py:396 ++#: ../yum/depsolve.py:407 + #, python-format + msgid "TSINFO: Obsoleting %s with %s to resolve dep." + msgstr "TSINFO: Fasar ut %s med %s för att lösa upp beroenden." - for item in group_pattern.split(','): - item = item.strip() -- if self._groups.has_key(item): -+ if item in self._groups: - thisgroup = self._groups[item] - returns[thisgroup.groupid] = thisgroup - continue -@@ -490,14 +487,14 @@ class Comps(object): - return returns.values() +-#: ../yum/depsolve.py:399 ++#: ../yum/depsolve.py:410 + #, python-format + msgid "TSINFO: Updating %s to resolve dep." + msgstr "TSINFO: Uppdaterar %s för att lösa upp beroenden" - def add_group(self, group): -- if self._groups.has_key(group.groupid): -+ if group.groupid in self._groups: - thatgroup = self._groups[group.groupid] - thatgroup.add(group) - else: - self._groups[group.groupid] = group +-#: ../yum/depsolve.py:407 ++#: ../yum/depsolve.py:418 + #, python-format + msgid "Cannot find an update path for dep for: %s" + msgstr "Hittar ingen uppdateringsväg för beroende för: %s" - def add_category(self, category): -- if self._categories.has_key(category.categoryid): -+ if category.categoryid in self._categories: - thatcat = self._categories[category.categoryid] - thatcat.add(category) - else: -@@ -557,7 +554,7 @@ class Comps(object): - check_pkgs = group.optional_packages.keys() + group.default_packages.keys() + group.conditional_packages.keys() - group.installed = False - for pkgname in check_pkgs: -- if inst_pkg_names.has_key(pkgname): -+ if pkgname in inst_pkg_names: - group.installed = True - break - -diff --git a/yum/config.py b/yum/config.py -index ad8db7e..11347a6 100644 ---- a/yum/config.py -+++ b/yum/config.py -@@ -40,7 +40,7 @@ if not _use_iniparse: - import rpmUtils.transaction - import Errors - import types --from misc import get_uuid -+from misc import get_uuid, read_in_items_from_dot_dir +-#: ../yum/depsolve.py:417 +-#, python-format +-msgid "Unresolvable requirement %s for %s" +-msgstr "Ej upplösbart behov %s för %s" +- +-#: ../yum/depsolve.py:440 ++#: ../yum/depsolve.py:449 + #, python-format + msgid "Quick matched %s to require for %s" + msgstr "Snabb matcning av %s mot behov för %s" - # Alter/patch these to change the default checking... - __pkgs_gpgcheck_default__ = False -@@ -55,9 +55,11 @@ class Option(object): - definition easy and consise. - ''' + #. is it already installed? +-#: ../yum/depsolve.py:482 ++#: ../yum/depsolve.py:491 + #, python-format + msgid "%s is in providing packages but it is already installed, removing." + msgstr "" + "%s finns bland tillhandahållande paket men det är redan installerat, tar " + "bort." -- def __init__(self, default=None): -+ def __init__(self, default=None, parse_default=False): - self._setattrname() - self.inherit = False -+ if parse_default: -+ default = self.parse(default) - self.default = default +-#: ../yum/depsolve.py:498 ++#: ../yum/depsolve.py:507 + #, python-format + msgid "Potential resolving package %s has newer instance in ts." + msgstr "Potentiellt upplösande paket %s har nyare instans i ts." - def _setattrname(self): -@@ -87,7 +89,7 @@ class Option(object): - @param value: The value to set the option to. - @return: Nothing. - ''' -- # Only try to parse if its a string -+ # Only try to parse if it's a string - if isinstance(value, basestring): - try: - value = self.parse(value) -@@ -155,13 +157,14 @@ class ListOption(Option): - An option containing a list of strings. - """ +-#: ../yum/depsolve.py:509 ++#: ../yum/depsolve.py:518 + #, python-format + msgid "Potential resolving package %s has newer instance installed." + msgstr "Potentiellt upplösande paket %s har nyare instans installerad." -- def __init__(self, default=None): -+ def __init__(self, default=None, parse_default=False): - if default is None: - default = [] -- super(ListOption, self).__init__(default) -+ super(ListOption, self).__init__(default, parse_default) +-#: ../yum/depsolve.py:517 ../yum/depsolve.py:563 +-#, python-format +-msgid "Missing Dependency: %s is needed by package %s" +-msgstr "Saknat beroende: %s behövs av paketet %s" +- +-#: ../yum/depsolve.py:530 ++#: ../yum/depsolve.py:536 + #, python-format + msgid "%s already in ts, skipping this one" + msgstr "%s är redan i ts, hoppar över denna" - def parse(self, s): -- """Converts a string from the config file to a workable list -+ """Converts a string from the config file to a workable list, parses -+ globdir: paths as foo.d-style dirs +-#: ../yum/depsolve.py:573 ++#: ../yum/depsolve.py:578 + #, python-format + msgid "TSINFO: Marking %s as update for %s" + msgstr "TSINFO: Noterar %s som en uppdatering av %s" - Commas and spaces are used as separators for the list - """ -@@ -169,7 +172,15 @@ class ListOption(Option): - # to sub the \n with a space and then read the lines - s = s.replace('\n', ' ') - s = s.replace(',', ' ') -- return s.split() -+ results = [] -+ for item in s.split(): -+ if item.startswith('glob:'): -+ thisglob = item.replace('glob:', '') -+ results.extend(read_in_items_from_dot_dir(thisglob)) -+ continue -+ results.append(item) -+ -+ return results +-#: ../yum/depsolve.py:581 ++#: ../yum/depsolve.py:586 + #, python-format + msgid "TSINFO: Marking %s as install for %s" + msgstr "TSINFO: Noterar %s som en installation av %s" - def tostring(self, value): - return '\n '.join(value) -@@ -217,8 +228,9 @@ class UrlListOption(ListOption): - Option for handling lists of URLs with validation of the URL scheme. - ''' +-#: ../yum/depsolve.py:685 ../yum/depsolve.py:767 ++#: ../yum/depsolve.py:690 ../yum/depsolve.py:781 + msgid "Success - empty transaction" + msgstr "Klart - tom transaktion" -- def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https')): -- super(UrlListOption, self).__init__(default) -+ def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https'), -+ parse_default=False): -+ super(UrlListOption, self).__init__(default, parse_default) +-#: ../yum/depsolve.py:724 ../yum/depsolve.py:739 ++#: ../yum/depsolve.py:729 ../yum/depsolve.py:744 + msgid "Restarting Loop" + msgstr "Startar om slingan" - # Hold a UrlOption instance to assist with parsing - self._urloption = UrlOption(schemes=schemes) -@@ -228,8 +240,15 @@ class UrlListOption(ListOption): - s = s.replace('\n', ' ') - s = s.replace(',', ' ') - items = [ item.replace(' ', '%20') for item in shlex.split(s) ] -- s = ' '.join(items) -- for url in super(UrlListOption, self).parse(s): -+ tmp = [] -+ for item in items: -+ if item.startswith('glob:'): -+ thisglob = item.replace('glob:', '') -+ tmp.extend(read_in_items_from_dot_dir(thisglob)) -+ continue -+ tmp.append(item) -+ -+ for url in super(UrlListOption, self).parse(' '.join(tmp)): - out.append(self._urloption.parse(url)) - return out +-#: ../yum/depsolve.py:755 ++#: ../yum/depsolve.py:760 + msgid "Dependency Process ending" + msgstr "Beroendeprocessen avslutas" -@@ -601,7 +620,8 @@ class StartupConf(BaseConfig): - pluginconfpath = ListOption(['/etc/yum/pluginconf.d']) - gaftonmode = BoolOption(False) - syslog_ident = Option() -- syslog_facility = Option('LOG_DAEMON') -+ syslog_facility = Option('LOG_USER') -+ syslog_device = Option('/dev/log') - persistdir = Option('/var/lib/yum') - - class YumConf(StartupConf): -@@ -656,6 +676,7 @@ class YumConf(StartupConf): - enabled = BoolOption(True) - enablegroups = BoolOption(True) - enable_group_conditionals = BoolOption(True) -+ groupremove_leaf_only = BoolOption(False) - group_package_types = ListOption(['mandatory', 'default']) - - timeout = FloatOption(30.0) # FIXME: Should use variation of SecondsOption -@@ -712,6 +733,10 @@ class YumConf(StartupConf): +-#: ../yum/depsolve.py:761 ++#: ../yum/depsolve.py:774 + #, python-format + msgid "%s from %s has depsolving problems" + msgstr "%s från %s har problem att lösa beroenden" - rpmverbosity = Option('info') +-#: ../yum/depsolve.py:768 ++#: ../yum/depsolve.py:782 + msgid "Success - deps resolved" + msgstr "Klart - beroenden upplösta" -+ protected_packages = ListOption("yum, glob:/etc/yum/protected.d/*.conf", -+ parse_default=True) -+ exit_on_lock = BoolOption(False) -+ - _reposlist = [] +-#: ../yum/depsolve.py:782 ++#: ../yum/depsolve.py:796 + #, python-format + msgid "Checking deps for %s" + msgstr "Kontrollerar beroenden för %s" - def dump(self): -@@ -728,7 +753,7 @@ class YumConf(StartupConf): - if isinstance(getattr(self, attr), types.MethodType): - continue - res = getattr(self, attr) -- if not res: -+ if not res and type(res) not in (type(False), type(0)): - res = '' - if type(res) == types.ListType: - res = ',\n '.join(res) -@@ -855,13 +880,15 @@ def readMainConfig(startupconf): - yumvars['arch'] = startupconf.arch - yumvars['releasever'] = startupconf.releasever - yumvars['uuid'] = startupconf.uuid -+ # Note: We don't setup the FS yumvars here, because we want to be able to -+ # use the core yumvars in persistdir. Which is the base of FS yumvars. - - # Read [main] section - yumconf = YumConf() - yumconf.populate(startupconf._parser, 'main') +-#: ../yum/depsolve.py:865 ++#: ../yum/depsolve.py:874 + #, python-format + msgid "looking for %s as a requirement of %s" + msgstr "letar efter %s som ett behov för %s" - # Apply the installroot to directory options -- for option in ('cachedir', 'logfile', 'persistdir'): -+ def _apply_installroot(yumconf, option): - path = getattr(yumconf, option) - ir_path = yumconf.installroot + path - ir_path = ir_path.replace('//', '/') # os.path.normpath won't fix this and -@@ -869,6 +896,27 @@ def readMainConfig(startupconf): - ir_path = varReplace(ir_path, yumvars) - setattr(yumconf, option, ir_path) - -+ # Read the FS yumvars -+ try: -+ dir_fsvars = yumconf.installroot + "/etc/yum/vars/" -+ fsvars = os.listdir(dir_fsvars) -+ except OSError: -+ fsvars = [] -+ for fsvar in fsvars: -+ if os.path.islink(dir_fsvars + fsvar): -+ continue -+ try: -+ val = open(dir_fsvars + fsvar).readline() -+ if val and val[-1] == '\n': -+ val = val[:-1] -+ except (OSError, IOError): -+ continue -+ yumvars[fsvar] = val -+ -+ # These can use the above FS yumvars -+ for option in ('cachedir', 'logfile', 'persistdir'): -+ _apply_installroot(yumconf, option) -+ - # Add in some extra attributes which aren't actually configuration values - yumconf.yumvar = yumvars - yumconf.uid = 0 -@@ -953,6 +1001,9 @@ def _getsysver(installroot, distroverpkg): - else: - raise Errors.YumBaseError("Error: " + str(e)) - raise Errors.YumBaseError("Error: " + str(e)) -+ except rpm.error, e: -+ # This is the "new" code for "cannot open rpmdb", 4.8.0 ish -+ raise Errors.YumBaseError("Error: " + str(e)) - # we're going to take the first one - if there is more than one of these - # then the user needs a beating - if idx.count() == 0: -diff --git a/yum/depsolve.py b/yum/depsolve.py -index 11c9f29..8c260a7 100644 ---- a/yum/depsolve.py -+++ b/yum/depsolve.py -@@ -27,6 +27,7 @@ import rpmUtils.miscutils - from rpmUtils.arch import archDifference, canCoinstall - import misc - from misc import unique, version_tuple_to_string -+from transactioninfo import TransactionMember - import rpm +-#: ../yum/depsolve.py:1007 ++#: ../yum/depsolve.py:1090 + #, python-format + msgid "Running compare_providers() for %s" + msgstr "Kör compare_providers() för %s" - from packageSack import ListPackageSack -@@ -138,6 +139,9 @@ class Depsolve(object): - 'test': rpm.RPMTRANS_FLAG_TEST, - 'justdb': rpm.RPMTRANS_FLAG_JUSTDB, - 'repackage': rpm.RPMTRANS_FLAG_REPACKAGE} -+ # This is only in newer rpm.org releases -+ if hasattr(rpm, 'RPMTRANS_FLAG_NOCONTEXTS'): -+ ts_flags_to_rpm['nocontexts'] = rpm.RPMTRANS_FLAG_NOCONTEXTS - - self._ts.setFlags(0) # reset everything. - -@@ -511,18 +515,26 @@ class Depsolve(object): - if pkgmode in ['i', 'u']: - self.verbose_logger.log(logginglevels.DEBUG_2, - _('%s already in ts, skipping this one'), pkg) -- # FIXME: Remove this line, if it is not needed ? -- # checkdeps = 1 - self._last_req = pkg - return checkdeps, missingdep +-#: ../yum/depsolve.py:1041 ../yum/depsolve.py:1047 ++#: ../yum/depsolve.py:1117 ../yum/depsolve.py:1123 + #, python-format + msgid "better arch in po %s" + msgstr "bättre arkitektur i po %s" - # find the best one +-#: ../yum/depsolve.py:1142 ++#: ../yum/depsolve.py:1218 + #, python-format + msgid "%s obsoletes %s" + msgstr "%s fasar ut %s" - # try updating the already install pkgs -+ results = [] - for pkg in provSack.returnNewestByName(): -- results = self.update(requiringPo=requiringPo, name=pkg.name, -- epoch=pkg.epoch, version=pkg.version, -- rel=pkg.rel) -+ tresults = self.update(requiringPo=requiringPo, name=pkg.name, -+ epoch=pkg.epoch, version=pkg.version, -+ rel=pkg.rel) -+ # Note that this does "interesting" things with multilib. We can -+ # have say A.i686 and A.x86_64, and if we hit "A.i686" first, -+ # .update() will actually update "A.x86_64" which will then fail -+ # the pkg == txmbr.po test below, but then they'll be nothing to -+ # update when we get around to A.x86_64 ... so this entire loop -+ # fails. -+ # Keeping results through the loop and thus. testing each pkg -+ # against all txmbr's from previous runs "fixes" this. -+ results.extend(tresults) - for txmbr in results: - if pkg == txmbr.po: - checkdeps = True -@@ -547,7 +559,6 @@ class Depsolve(object): - return checkdeps, missingdep - - -- - # FIXME - why can't we look up in the transaction set for the requiringPkg - # and know what needs it that way and provide a more sensible dep structure in the txmbr - inst = self.rpmdb.searchNevra(name=best.name, arch=best.arch) -@@ -558,23 +569,30 @@ class Depsolve(object): - txmbr = self.tsInfo.addUpdate(best, inst[0]) - txmbr.setAsDep(po=requiringPo) - txmbr.reason = "dep" -+ checkdeps = True - self._last_req = best - else: - self.verbose_logger.debug(_('TSINFO: Marking %s as install for %s'), best, - requiringPo) -- # FIXME: Don't we want .install() here, so obsoletes get done? -- txmbr = self.tsInfo.addInstall(best) -- txmbr.setAsDep(po=requiringPo) -- txmbr.reason = "dep" -- self._last_req = best -- -- # if we had other packages with this name.arch that we found -- # before, they're not going to be installed anymore, so we -- # should mark them to be re-checked -- if best.pkgtup in upgraded: -- map(self.tsInfo.remove, upgraded[best.pkgtup]) -- -- checkdeps = 1 -+ reqtuple = misc.string_to_prco_tuple(needname + str(needflags) + needversion) -+ txmbrs = self.install(best, provides_for=reqtuple) -+ for txmbr in txmbrs: -+ txmbr.setAsDep(po=requiringPo) -+ txmbr.reason = "dep" -+ self._last_req = txmbr.po -+ -+ # if we had other packages with this name.arch that we found -+ # before, they're not going to be installed anymore, so we -+ # should mark them to be re-checked -+ if txmbr.pkgtup in upgraded: -+ map(self.tsInfo.remove, upgraded[txmbr.pkgtup]) -+ if not txmbrs: -+ missingdep = 1 -+ checkdeps = 0 -+ msg = self._err_missing_requires(requiringPo, requirement) -+ errorlist.append(msg) -+ else: -+ checkdeps = 1 - - return checkdeps, missingdep +-#: ../yum/depsolve.py:1154 ++#: ../yum/depsolve.py:1230 + #, python-format + msgid "" + "archdist compared %s to %s on %s\n" +@@ -1858,103 +1972,123 @@ msgstr "" + "arkitekturavstånd jämför %s med %s på %s\n" + " Vinnare: %s" -@@ -850,7 +868,11 @@ class Depsolve(object): - - self.verbose_logger.log(logginglevels.DEBUG_2, _("looking for %s as a requirement of %s"), req, txmbr) - provs = self.tsInfo.getProvides(*req) -- if not provs: -+ # The self provides should mostly be caught before here now, but -+ # at least config() crack still turns up, it's not that -+ # expensive to just do it, and we really don't want "false positive" -+ # requires for compare_providers(). -+ if not provs and not txmbr.po.inPrcoRange('provides', req): - ret.append( (txmbr.po, self._prco_req2req(req)) ) - continue +-#: ../yum/depsolve.py:1161 ++#: ../yum/depsolve.py:1237 + #, python-format + msgid "common sourcerpm %s and %s" + msgstr "samma käll-rpm %s och %s" -@@ -881,11 +903,22 @@ class Depsolve(object): - for prov in provs: - if prov[0].startswith('rpmlib('): # ignore rpmlib() provides - continue -- if newpoprovs.has_key(prov): -+ if prov in newpoprovs: - continue - # FIXME: This is probably the best place to fix the postfix rename - # problem long term (post .21) ... see compare_providers. - for pkg, hits in self.tsInfo.getRequires(*prov).iteritems(): -+ # See the docs, this is to make groupremove "more useful". -+ if (self.conf.groupremove_leaf_only and txmbr.groups and -+ txmbr.output_state == TS_ERASE): -+ cb = self.dsCallback -+ if cb and hasattr(cb, 'groupRemoveReq'): -+ cb.groupRemoveReq(pkg, hits) -+ # We don't undo anything else here ... hopefully that's -+ # fine. -+ self.tsInfo.remove(txmbr.pkgtup) -+ return [] +-#: ../yum/depsolve.py:1167 ++#: ../yum/depsolve.py:1241 ++#, fuzzy, python-format ++msgid "base package %s is installed for %s" ++msgstr "TSINFO: Noterar %s som en installation av %s" + - for hit in hits: - # See if the update solves the problem... - found = False -@@ -1135,6 +1168,10 @@ class Depsolve(object): - # something else in the transaction. :( - # there are many ways I hate this - this is but one - ipkgresults[pkg] = 5 -+ elif newest.verEQ(pkg): -+ # We get here from bestPackagesFromList(), give a giant -+ # bump to stuff that is already installed. -+ ipkgresults[pkg] = 1000 - else: - # just b/c they're not installed pkgs doesn't mean they should - # be ignored entirely. Just not preferred -@@ -1186,8 +1223,7 @@ class Depsolve(object): - pkgresults[po] -= 1024 ++#: ../yum/depsolve.py:1247 + #, python-format + msgid "common prefix of %s between %s and %s" + msgstr "gemensamt prefix för %s mellan %s och %s" - obsoleted = False -- poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release)) -- if nextpo.inPrcoRange('obsoletes', poprovtup): -+ if po.obsoletedBy([nextpo]): - obsoleted = True - pkgresults[po] -= 1024 - -@@ -1209,6 +1245,7 @@ class Depsolve(object): - if res == po: - pkgresults[po] += 5 +-#: ../yum/depsolve.py:1175 ++#: ../yum/depsolve.py:1256 + #, python-format + msgid "Best Order: %s" + msgstr "Bästa ordning: %s" -+ # End of O(N*N): for nextpo in pkgs: - if _common_sourcerpm(po, reqpo): - self.verbose_logger.log(logginglevels.DEBUG_4, - _('common sourcerpm %s and %s' % (po, reqpo))) -@@ -1225,6 +1262,53 @@ class Depsolve(object): - - pkgresults[po] += cpl*2 - -+ # If we have more than one "best", see what would happen if we picked -+ # each package ... ie. what things do they require that _aren't_ already -+ # installed/to-be-installed. In theory this can screw up due to: -+ # pkgA => requires pkgX -+ # pkgB => requires pkgY, requires pkgZ -+ # ...but pkgX requires 666 other things. Going recursive is -+ # "non-trivial" though, python != prolog. This seems to do "better" -+ # from simple testing though. -+ bestnum = max(pkgresults.values()) -+ rec_depsolve = {} -+ for po in pkgs: -+ if pkgresults[po] != bestnum: -+ continue -+ rec_depsolve[po] = 0 -+ if len(rec_depsolve) > 1: -+ for po in rec_depsolve: -+ fake_txmbr = TransactionMember(po) -+ -+ # Note that this is just requirements, so you could also have -+ # 4 requires for a single package. This might be fixable, if -+ # needed, but given the above it's probably better to leave it -+ # like this. -+ reqs = self._checkInstall(fake_txmbr) -+ rec_depsolve[po] = len(reqs) -+ -+ bestnum = min(rec_depsolve.values()) -+ self.verbose_logger.log(logginglevels.DEBUG_4, -+ _('requires minimal: %d') % bestnum) -+ for po in rec_depsolve: -+ if rec_depsolve[po] == bestnum: -+ self.verbose_logger.log(logginglevels.DEBUG_4, -+ _(' Winner: %s') % po) -+ pkgresults[po] += 1 -+ else: -+ num = rec_depsolve[po] -+ self.verbose_logger.log(logginglevels.DEBUG_4, -+ _(' Loser(with %d): %s') % (num, po)) -+ -+ # We don't want to decide to use a "shortest first", if something else -+ # has told us to pick something else. But we want to pick between -+ # multiple "best" packages. So we spike all the best packages (so -+ # only those can win) and then bump them down by package name length. -+ bestnum = max(pkgresults.values()) -+ for po in pkgs: -+ if pkgresults[po] != bestnum: -+ continue -+ pkgresults[po] += 1000 - pkgresults[po] += (len(po.name)*-1) +-#: ../yum/__init__.py:187 ++#: ../yum/__init__.py:192 + msgid "doConfigSetup() will go away in a future version of Yum.\n" + msgstr "doConfigSetup() kommer att försvinna i en framtida version av Yum.\n" + +-#: ../yum/__init__.py:412 ++#: ../yum/__init__.py:424 + #, python-format + msgid "Repository %r is missing name in configuration, using id" + msgstr "Förrådet %r saknar namn i konfigurationen, använder id" + +-#: ../yum/__init__.py:450 ++#: ../yum/__init__.py:462 + msgid "plugins already initialised" + msgstr "insticksmoduler redan initierade" + +-#: ../yum/__init__.py:457 ++#: ../yum/__init__.py:469 + msgid "doRpmDBSetup() will go away in a future version of Yum.\n" + msgstr "doRpmDBSetup() kommer att försvinna i en framtida version av Yum.\n" + +-#: ../yum/__init__.py:468 ++#: ../yum/__init__.py:480 + msgid "Reading Local RPMDB" + msgstr "Läser lokal RPMDB" + +-#: ../yum/__init__.py:489 ++#: ../yum/__init__.py:504 + msgid "doRepoSetup() will go away in a future version of Yum.\n" + msgstr "doRepoSetup() kommer att försvinna i en framtida version av Yum.\n" + +-#: ../yum/__init__.py:509 ++#: ../yum/__init__.py:524 + msgid "doSackSetup() will go away in a future version of Yum.\n" + msgstr "doSackSetup() kommer att försvinna i en framtida version av Yum.\n" + +-#: ../yum/__init__.py:539 ++#: ../yum/__init__.py:554 + msgid "Setting up Package Sacks" + msgstr "Förbereder paketsäckar" + +-#: ../yum/__init__.py:584 ++#: ../yum/__init__.py:599 + #, python-format + msgid "repo object for repo %s lacks a _resetSack method\n" + msgstr "förrådsobjekt för förrådet %s saknar en _resetSack-metod\n" + +-#: ../yum/__init__.py:585 ++#: ../yum/__init__.py:600 + msgid "therefore this repo cannot be reset.\n" + msgstr "därför kan inte detta förråd återställas.\n" - bestorder = sorted(pkgresults.items(), -diff --git a/yum/history.py b/yum/history.py -index 2707cac..bfb0b45 100644 ---- a/yum/history.py -+++ b/yum/history.py -@@ -22,7 +22,7 @@ import os, os.path - import glob - from weakref import proxy as weakref +-#: ../yum/__init__.py:590 ++#: ../yum/__init__.py:605 + msgid "doUpdateSetup() will go away in a future version of Yum.\n" + msgstr "doUpdateSetup() kommer att försvinna i en framtida version av Yum.\n" --from sqlutils import sqlite, executeSQL, sql_esc, sql_esc_glob -+from sqlutils import sqlite, executeSQL, sql_esc_glob - import yum.misc as misc - import yum.constants - from yum.constants import * -@@ -112,6 +112,35 @@ class YumHistoryPackage(PackageObject): - chk = checksum.split(':') - self._checksums = [(chk[0], chk[1], 0)] # (type, checksum, id(0,1)) +-#: ../yum/__init__.py:602 ++#: ../yum/__init__.py:617 + msgid "Building updates object" + msgstr "Bygger uppdateringsobjekt" -+class YumHistoryRpmdbProblem(PackageObject): -+ """ Class representing an rpmdb problem that existed at the time of the -+ transaction. """ -+ -+ def __init__(self, history, rpid, problem, text): -+ self._history = weakref(history) -+ -+ self.rpid = rpid -+ self.problem = problem -+ self.text = text +-#: ../yum/__init__.py:637 ++#: ../yum/__init__.py:652 + msgid "doGroupSetup() will go away in a future version of Yum.\n" + msgstr "doGroupSetup() kommer att försvinna i en framtida version av Yum.\n" + +-#: ../yum/__init__.py:662 ++#: ../yum/__init__.py:677 + msgid "Getting group metadata" + msgstr "Hämtar gruppmetadata" + +-#: ../yum/__init__.py:688 ++#: ../yum/__init__.py:703 + #, python-format + msgid "Adding group file from repository: %s" + msgstr "Lägger till gruppfil från förrådet: %s" + +-#: ../yum/__init__.py:697 ++#: ../yum/__init__.py:712 + #, python-format + msgid "Failed to add groups file for repository: %s - %s" + msgstr "Kunde inte lägga till gruppfil för förrådet: %s - %s" + +-#: ../yum/__init__.py:703 ++#: ../yum/__init__.py:718 + msgid "No Groups Available in any repository" + msgstr "Inga grupper tillgängliga i något förråd" + +-#: ../yum/__init__.py:763 ++#: ../yum/__init__.py:730 ++#, fuzzy ++msgid "Getting pkgtags metadata" ++msgstr "Hämtar gruppmetadata" + -+ self._loaded_P = None ++#: ../yum/__init__.py:740 ++#, fuzzy, python-format ++msgid "Adding tags from repository: %s" ++msgstr "Lägger till gruppfil från förrådet: %s" + -+ def __cmp__(self, other): -+ if other is None: -+ return 1 -+ ret = cmp(self.problem, other.problem) -+ if ret: return -ret -+ ret = cmp(self.rpid, other.rpid) -+ return ret ++#: ../yum/__init__.py:749 ++#, fuzzy, python-format ++msgid "Failed to add Pkg Tags for repository: %s - %s" ++msgstr "Kunde inte lägga till gruppfil för förrådet: %s - %s" + -+ def _getProbPkgs(self): -+ if self._loaded_P is None: -+ self._loaded_P = sorted(self._history._old_prob_pkgs(self.rpid)) -+ return self._loaded_P ++#: ../yum/__init__.py:827 + msgid "Importing additional filelist information" + msgstr "Importerar ytterligare fillisteinformation" + +-#: ../yum/__init__.py:777 ++#: ../yum/__init__.py:841 + #, python-format + msgid "The program %s%s%s is found in the yum-utils package." + msgstr "Programmet %s%s%s finns i paketet yum-utils." + +-#: ../yum/__init__.py:785 ++#: ../yum/__init__.py:849 + msgid "" + "There are unfinished transactions remaining. You might consider running yum-" + "complete-transaction first to finish them." +@@ -1962,17 +2096,18 @@ msgstr "" + "Det finns oavslutade transaktioner kvar. Du kan överväga att köra " + "yumcomplete-transaction först för att avsluta dem." + +-#: ../yum/__init__.py:853 ++#. Kind of hacky ++#: ../yum/__init__.py:922 + #, python-format + msgid "Skip-broken round %i" + msgstr "Hoppa-över-trasiga runda %i" + +-#: ../yum/__init__.py:906 ++#: ../yum/__init__.py:975 + #, python-format + msgid "Skip-broken took %i rounds " + msgstr "Hoppa-över-trasiga tog %i rundor " + +-#: ../yum/__init__.py:907 ++#: ../yum/__init__.py:976 + msgid "" + "\n" + "Packages skipped because of dependency problems:" +@@ -1980,78 +2115,94 @@ msgstr "" + "\n" + "Paket hoppades över på grund av beroendeproblem:" + +-#: ../yum/__init__.py:911 ++#: ../yum/__init__.py:980 + #, python-format + msgid " %s from %s" + msgstr " %s från %s" + +-#: ../yum/__init__.py:1083 ++#: ../yum/__init__.py:1121 ++msgid "Warning: RPMDB altered outside of yum." ++msgstr "" + -+ packages = property(fget=lambda self: self._getProbPkgs()) ++#: ../yum/__init__.py:1126 ++#, fuzzy ++msgid "missing requires" ++msgstr "%s behöver: %s" + ++#: ../yum/__init__.py:1127 ++#, fuzzy ++msgid "installed conflict" ++msgstr "installeras" + - class YumHistoryTransaction: - """ Holder for a history transaction. """ ++#: ../yum/__init__.py:1180 + msgid "" + "Warning: scriptlet or other non-fatal errors occurred during transaction." + msgstr "" + "Varning: skript- eller annat icke ödesdigert fel inträffade under " + "transaktionen." + +-#: ../yum/__init__.py:1101 ++#: ../yum/__init__.py:1198 + #, python-format + msgid "Failed to remove transaction file %s" + msgstr "Kunde inte ta bort transaktionsfilen %s" + + #. maybe a file log here, too + #. but raising an exception is not going to do any good +-#: ../yum/__init__.py:1130 ++#: ../yum/__init__.py:1227 + #, python-format + msgid "%s was supposed to be installed but is not!" + msgstr "%s skulle installerats men gjordes det inte!" + + #. maybe a file log here, too + #. but raising an exception is not going to do any good +-#: ../yum/__init__.py:1169 ++#: ../yum/__init__.py:1266 + #, python-format + msgid "%s was supposed to be removed but is not!" + msgstr "%s skulle tagits bort men det gjordes inte!" + + #. Whoa. What the heck happened? +-#: ../yum/__init__.py:1289 ++#: ../yum/__init__.py:1386 + #, python-format + msgid "Unable to check if PID %s is active" + msgstr "Kan inte kontrollera om PID %s är aktiv" + + #. Another copy seems to be running. +-#: ../yum/__init__.py:1293 ++#: ../yum/__init__.py:1390 + #, python-format + msgid "Existing lock %s: another copy is running as pid %s." + msgstr "Existerande lås %s: en annan kopia kör som pid %s." + + #. Whoa. What the heck happened? +-#: ../yum/__init__.py:1328 ++#: ../yum/__init__.py:1425 + #, python-format + msgid "Could not create lock at %s: %s " + msgstr "" + +-#: ../yum/__init__.py:1373 +-msgid "Package does not match intended download" ++#: ../yum/__init__.py:1470 ++#, fuzzy ++msgid "" ++"Package does not match intended download. Suggestion: run yum clean metadata" + msgstr "Paketet matchar inte avsedd det avsett att laddas ner" + +-#: ../yum/__init__.py:1388 ++#: ../yum/__init__.py:1486 + msgid "Could not perform checksum" + msgstr "Kunde inte utföra kontrollsummering" + +-#: ../yum/__init__.py:1391 ++#: ../yum/__init__.py:1489 + msgid "Package does not match checksum" + msgstr "Paketet stämmer inte med kontrollsumman" + +-#: ../yum/__init__.py:1433 ++#: ../yum/__init__.py:1531 + #, python-format + msgid "package fails checksum but caching is enabled for %s" + msgstr "paketet misslyckas med kontrollsumman men cachning är aktiverat för %s" + +-#: ../yum/__init__.py:1436 ../yum/__init__.py:1465 ++#: ../yum/__init__.py:1534 ../yum/__init__.py:1563 + #, python-format + msgid "using local copy of %s" + msgstr "använder lokal kopia av %s" + +-#: ../yum/__init__.py:1477 ++#: ../yum/__init__.py:1575 + #, python-format + msgid "" + "Insufficient space in download directory %s\n" +@@ -2062,11 +2213,11 @@ msgstr "" + " * fritt %s\n" + " * behovet %s" + +-#: ../yum/__init__.py:1526 ++#: ../yum/__init__.py:1624 + msgid "Header is not complete." + msgstr "Huvudet är inte komplett." + +-#: ../yum/__init__.py:1563 ++#: ../yum/__init__.py:1661 + #, python-format + msgid "" + "Header not in local cache and caching-only mode enabled. Cannot download %s" +@@ -2074,64 +2225,64 @@ msgstr "" + "Huvudet finns inte i den lokala cachen och endast-cache-läget är aktiverat. " + "Kan inte hämta %s" + +-#: ../yum/__init__.py:1618 ++#: ../yum/__init__.py:1716 + #, python-format + msgid "Public key for %s is not installed" + msgstr "Den publika nyckeln för %s är inte installerad" + +-#: ../yum/__init__.py:1622 ++#: ../yum/__init__.py:1720 + #, python-format + msgid "Problem opening package %s" + msgstr "Problem att öppna paketet %s" + +-#: ../yum/__init__.py:1630 ++#: ../yum/__init__.py:1728 + #, python-format + msgid "Public key for %s is not trusted" + msgstr "Den publika nyckeln för %s är inte betrodd" -@@ -128,6 +157,12 @@ class YumHistoryTransaction: +-#: ../yum/__init__.py:1634 ++#: ../yum/__init__.py:1732 + #, python-format + msgid "Package %s is not signed" + msgstr "Paket %s är inte signerat" - self._loaded_TW = None - self._loaded_TD = None -+ self._loaded_TS = None -+ -+ self._loaded_PROB = None -+ -+ self._have_loaded_CMD = False # cmdline can validly be None -+ self._loaded_CMD = None +-#: ../yum/__init__.py:1672 ++#: ../yum/__init__.py:1770 + #, python-format + msgid "Cannot remove %s" + msgstr "Det går inte att ta bort %s" - self._loaded_ER = None - self._loaded_OT = None -@@ -153,9 +188,29 @@ class YumHistoryTransaction: - if self._loaded_TD is None: - self._loaded_TD = sorted(self._history._old_data_pkgs(self.tid)) - return self._loaded_TD -+ def _getTransSkip(self): -+ if self._loaded_TS is None: -+ self._loaded_TS = sorted(self._history._old_skip_pkgs(self.tid)) -+ return self._loaded_TS +-#: ../yum/__init__.py:1676 ++#: ../yum/__init__.py:1774 + #, python-format + msgid "%s removed" + msgstr "%s borttaget" - trans_with = property(fget=lambda self: self._getTransWith()) - trans_data = property(fget=lambda self: self._getTransData()) -+ trans_skip = property(fget=lambda self: self._getTransSkip()) -+ -+ def _getProblems(self): -+ if self._loaded_PROB is None: -+ self._loaded_PROB = sorted(self._history._old_problems(self.tid)) -+ return self._loaded_PROB -+ -+ rpmdb_problems = property(fget=lambda self: self._getProblems()) -+ -+ def _getCmdline(self): -+ if not self._have_loaded_CMD: -+ self._have_loaded_CMD = True -+ self._loaded_CMD = self._history._old_cmdline(self.tid) -+ return self._loaded_CMD -+ -+ cmdline = property(fget=lambda self: self._getCmdline()) + # Första %s blir ett oöversatt engelskt ord. + # Felrapporterat: http://yum.baseurl.org/ticket/41 +-#: ../yum/__init__.py:1712 ++#: ../yum/__init__.py:1820 + #, python-format + msgid "Cannot remove %s file %s" + msgstr "Det går inte att ta bort %s-filen %s" - def _getErrors(self): - if self._loaded_ER is None: -@@ -176,8 +231,12 @@ class YumHistory: - self._conn = None - - self.conf = yum.misc.GenericHolder() -- self.conf.db_path = os.path.normpath(root + '/' + db_path) -+ if not os.path.normpath(db_path).startswith(root): -+ self.conf.db_path = os.path.normpath(root + '/' + db_path) -+ else: -+ self.conf.db_path = os.path.normpath('/' + db_path) - self.conf.writable = False -+ self.conf.readable = True +-#: ../yum/__init__.py:1716 ++#: ../yum/__init__.py:1824 + #, python-format + msgid "%s file %s removed" + msgstr "%s-filen %s borttagen" - if not os.path.exists(self.conf.db_path): - try: -@@ -214,7 +273,15 @@ class YumHistory: +-#: ../yum/__init__.py:1718 ++#: ../yum/__init__.py:1826 + #, python-format + msgid "%d %s files removed" + msgstr "%d %s-filer borttagna" - def _get_cursor(self): - if self._conn is None: -- self._conn = sqlite.connect(self._db_file) -+ if not self.conf.readable: -+ return None -+ -+ try: -+ self._conn = sqlite.connect(self._db_file) -+ except (sqlite.OperationalError, sqlite.DatabaseError): -+ self.conf.readable = False -+ return None -+ - return self._conn.cursor() - def _commit(self): - return self._conn.commit() -@@ -291,17 +358,32 @@ class YumHistory: +-#: ../yum/__init__.py:1787 ++#: ../yum/__init__.py:1895 + #, python-format + msgid "More than one identical match in sack for %s" + msgstr "Mer än en identisk matchning i säcken för %s" - def trans_with_pid(self, pid): - cur = self._get_cursor() -+ if cur is None: -+ return None - res = executeSQL(cur, - """INSERT INTO trans_with_pkgs - (tid, pkgtupid) - VALUES (?, ?)""", (self._tid, pid)) - return cur.lastrowid +-#: ../yum/__init__.py:1793 ++#: ../yum/__init__.py:1901 + #, python-format + msgid "Nothing matches %s.%s %s:%s-%s from update" + msgstr "Ingenting matchar %s.%s %s:%s-%s från uppdateringarna" -+ def trans_skip_pid(self, pid): -+ cur = self._get_cursor() -+ if cur is None or not self._update_db_file_2(): -+ return None -+ -+ res = executeSQL(cur, -+ """INSERT INTO trans_skip_pkgs -+ (tid, pkgtupid) -+ VALUES (?, ?)""", (self._tid, pid)) -+ return cur.lastrowid -+ - def trans_data_pid_beg(self, pid, state): - assert state is not None - if not hasattr(self, '_tid') or state is None: - return # Not configured to run - cur = self._get_cursor() -+ if cur is None: -+ return # Should never happen, due to above - res = executeSQL(cur, - """INSERT INTO trans_data_pkgs - (tid, pkgtupid, state) -@@ -313,6 +395,8 @@ class YumHistory: - return # Not configured to run +-#: ../yum/__init__.py:2026 ++#: ../yum/__init__.py:2180 + msgid "" + "searchPackages() will go away in a future version of " + "Yum. Use searchGenerator() instead. \n" +@@ -2139,181 +2290,181 @@ msgstr "" + "searchPackages() kommer att försvinna i en framtida version av " + "Yum. Använd searchGenerator() istället. \n" - cur = self._get_cursor() -+ if cur is None: -+ return # Should never happen, due to above - res = executeSQL(cur, - """UPDATE trans_data_pkgs SET done = ? - WHERE tid = ? AND pkgtupid = ? AND state = ? -@@ -320,8 +404,61 @@ class YumHistory: - self._commit() - return cur.lastrowid +-#: ../yum/__init__.py:2065 ++#: ../yum/__init__.py:2219 + #, python-format + msgid "Searching %d packages" + msgstr "Söker i %d paket" -- def beg(self, rpmdb_version, using_pkgs, txmbrs): -+ def _trans_rpmdb_problem(self, problem): -+ if not hasattr(self, '_tid'): -+ return # Not configured to run -+ cur = self._get_cursor() -+ if cur is None or not self._update_db_file_2(): -+ return None -+ res = executeSQL(cur, -+ """INSERT INTO trans_rpmdb_problems -+ (tid, problem, msg) -+ VALUES (?, ?, ?)""", (self._tid, -+ problem.problem, str(problem))) -+ rpid = cur.lastrowid -+ -+ if not rpid: -+ return rpid -+ -+ pkgs = {} -+ pkg = problem.pkg -+ pkgs[pkg.pkgtup] = pkg -+ if problem.problem == 'conflicts': -+ for pkg in problem.conflicts: -+ pkgs[pkg.pkgtup] = pkg -+ if problem.problem == 'duplicates': -+ pkgs[problem.duplicate.pkgtup] = problem.duplicate -+ -+ for pkg in pkgs.values(): -+ pid = self.pkg2pid(pkg) -+ if pkg.pkgtup == problem.pkg.pkgtup: -+ main = 'TRUE' -+ else: -+ main = 'FALSE' -+ res = executeSQL(cur, -+ """INSERT INTO trans_prob_pkgs -+ (rpid, pkgtupid, main) -+ VALUES (?, ?, ?)""", (rpid, pid, main)) -+ -+ return rpid -+ -+ def _trans_cmdline(self, cmdline): -+ if not hasattr(self, '_tid'): -+ return # Not configured to run -+ cur = self._get_cursor() -+ if cur is None or not self._update_db_file_2(): -+ return None -+ res = executeSQL(cur, -+ """INSERT INTO trans_cmdline -+ (tid, cmdline) -+ VALUES (?, ?)""", (self._tid, cmdline)) -+ return cur.lastrowid -+ -+ def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[], -+ rpmdb_problems=[], cmdline=None): - cur = self._get_cursor() -+ if cur is None: -+ return - res = executeSQL(cur, - """INSERT INTO trans_beg - (timestamp, rpmdb_version, loginuid) -@@ -339,10 +476,22 @@ class YumHistory: - state = self.txmbr2state(txmbr) - self.trans_data_pid_beg(pid, state) - -+ for pkg in skip_packages: -+ pid = self.pkg2pid(pkg) -+ self.trans_skip_pid(pid) -+ -+ for problem in rpmdb_problems: -+ self._trans_rpmdb_problem(problem) -+ -+ if cmdline: -+ self._trans_cmdline(cmdline) -+ - self._commit() +-#: ../yum/__init__.py:2069 ++#: ../yum/__init__.py:2223 + #, python-format + msgid "searching package %s" + msgstr "söker i paketet %s" + +-#: ../yum/__init__.py:2081 ++#: ../yum/__init__.py:2235 + msgid "searching in file entries" + msgstr "söker i filposter" + +-#: ../yum/__init__.py:2088 ++#: ../yum/__init__.py:2242 + msgid "searching in provides entries" + msgstr "söker i tillhandahållandeposter" + +-#: ../yum/__init__.py:2121 ++#: ../yum/__init__.py:2275 + #, python-format + msgid "Provides-match: %s" + msgstr "Tillhandahållandematchning: %s" + +-#: ../yum/__init__.py:2170 ++#: ../yum/__init__.py:2324 + msgid "No group data available for configured repositories" + msgstr "Inga gruppdata är tillgängliga för de konfigurerade förråden" - def _log_errors(self, errors): - cur = self._get_cursor() -+ if cur is None: -+ return - for error in errors: - error = to_unicode(error) - executeSQL(cur, -@@ -356,7 +505,9 @@ class YumHistory: - return # Not configured to run +-#: ../yum/__init__.py:2201 ../yum/__init__.py:2220 ../yum/__init__.py:2251 +-#: ../yum/__init__.py:2257 ../yum/__init__.py:2336 ../yum/__init__.py:2340 +-#: ../yum/__init__.py:2655 ++#: ../yum/__init__.py:2355 ../yum/__init__.py:2374 ../yum/__init__.py:2405 ++#: ../yum/__init__.py:2411 ../yum/__init__.py:2493 ../yum/__init__.py:2497 ++#: ../yum/__init__.py:2814 + #, python-format + msgid "No Group named %s exists" + msgstr "Det finns ingen grupp med namnet %s" - cur = self._get_cursor() -- for error in msg.split('\n'): -+ if cur is None: -+ return # Should never happen, due to above -+ for error in msg.splitlines(): - error = to_unicode(error) - executeSQL(cur, - """INSERT INTO trans_script_stdout -@@ -387,7 +538,11 @@ class YumHistory: +-#: ../yum/__init__.py:2232 ../yum/__init__.py:2353 ++#: ../yum/__init__.py:2386 ../yum/__init__.py:2513 + #, python-format + msgid "package %s was not marked in group %s" + msgstr "paket %s noterades inte i gruppen %s" - def end(self, rpmdb_version, return_code, errors=None): - assert return_code or not errors -+ if not hasattr(self, '_tid'): -+ return # Failed at beg() time - cur = self._get_cursor() -+ if cur is None: -+ return # Should never happen, due to above - res = executeSQL(cur, - """INSERT INTO trans_end - (tid, timestamp, rpmdb_version, return_code) -@@ -439,11 +594,70 @@ class YumHistory: - obj.state_installed = False - ret.append(obj) - return ret -+ def _old_skip_pkgs(self, tid): -+ cur = self._get_cursor() -+ if cur is None or not self._update_db_file_2(): -+ return [] -+ executeSQL(cur, -+ """SELECT name, arch, epoch, version, release, checksum -+ FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) -+ WHERE tid = ? -+ ORDER BY name ASC, epoch ASC""", (tid,)) -+ ret = [] -+ for row in cur: -+ obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) -+ ret.append(obj) -+ return ret -+ def _old_prob_pkgs(self, rpid): -+ cur = self._get_cursor() -+ if cur is None or not self._update_db_file_2(): -+ return [] -+ executeSQL(cur, -+ """SELECT name, arch, epoch, version, release, checksum, main -+ FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid) -+ WHERE rpid = ? -+ ORDER BY name ASC, epoch ASC""", (rpid,)) -+ ret = [] -+ for row in cur: -+ obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5]) -+ obj.main = row[6] == 'TRUE' -+ ret.append(obj) -+ return ret -+ -+ def _old_problems(self, tid): -+ cur = self._get_cursor() -+ if cur is None or not self._update_db_file_2(): -+ return [] -+ executeSQL(cur, -+ """SELECT rpid, problem, msg -+ FROM trans_rpmdb_problems -+ WHERE tid = ? -+ ORDER BY problem ASC, rpid ASC""", (tid,)) -+ ret = [] -+ for row in cur: -+ obj = YumHistoryRpmdbProblem(self, row[0], row[1], row[2]) -+ ret.append(obj) -+ return ret -+ -+ def _old_cmdline(self, tid): -+ cur = self._get_cursor() -+ if cur is None or not self._update_db_file_2(): -+ return None -+ executeSQL(cur, -+ """SELECT cmdline -+ FROM trans_cmdline -+ WHERE tid = ?""", (tid,)) -+ ret = [] -+ for row in cur: -+ return row[0] -+ return None +-#: ../yum/__init__.py:2279 ++#: ../yum/__init__.py:2433 + #, python-format + msgid "Adding package %s from group %s" + msgstr "Lägger till paket %s från grupp %s" - def old(self, tids=[], limit=None, complete_transactions_only=False): - """ Return a list of the last transactions, note that this includes - partial transactions (ones without an end transaction). """ - cur = self._get_cursor() -+ if cur is None: -+ return [] - sql = """SELECT tid, - trans_beg.timestamp AS beg_ts, - trans_beg.rpmdb_version AS beg_rv, -@@ -551,6 +765,10 @@ class YumHistory: - packages al. la. "yum list". Returns transaction ids. """ - # Search packages ... kind of sucks that it's search not list, pkglist? +-#: ../yum/__init__.py:2283 ++#: ../yum/__init__.py:2437 + #, python-format + msgid "No package named %s available to be installed" + msgstr "Inget paket med namnet %s är tillgängligt för installation" -+ cur = self._get_cursor() -+ if cur is None: -+ return set() -+ - data = _setupHistorySearchSQL(patterns, ignore_case) - (need_full, patterns, fields, names) = data +-#: ../yum/__init__.py:2380 ++#: ../yum/__init__.py:2539 + #, python-format + msgid "Package tuple %s could not be found in packagesack" + msgstr "Pakettupel %s fanns inte i paketsäcken" -@@ -559,7 +777,6 @@ class YumHistory: - for row in self._yieldSQLDataList(patterns, fields, ignore_case): - pkgtupids.add(row[0]) +-#: ../yum/__init__.py:2399 ++#: ../yum/__init__.py:2558 + #, fuzzy, python-format + msgid "Package tuple %s could not be found in rpmdb" + msgstr "Pakettupel %s fanns inte i paketsäcken" -- cur = self._get_cursor() - sql = """SELECT tid FROM trans_data_pkgs WHERE pkgtupid IN """ - sql += "(%s)" % ",".join(['?'] * len(pkgtupids)) - params = list(pkgtupids) -@@ -577,6 +794,91 @@ class YumHistory: - tids.add(row[0]) - return tids +-#: ../yum/__init__.py:2455 ../yum/__init__.py:2505 ++#: ../yum/__init__.py:2614 ../yum/__init__.py:2664 + msgid "Invalid version flag" + msgstr "Ogiltig versionsflagga" -+ _update_ops_2 = ['''\ -+\ -+ CREATE TABLE trans_skip_pkgs ( -+ tid INTEGER NOT NULL REFERENCES trans_beg, -+ pkgtupid INTEGER NOT NULL REFERENCES pkgtups); -+''', '''\ -+\ -+ CREATE TABLE trans_cmdline ( -+ tid INTEGER NOT NULL REFERENCES trans_beg, -+ cmdline TEXT NOT NULL); -+''', '''\ -+\ -+ CREATE TABLE trans_rpmdb_problems ( -+ rpid INTEGER PRIMARY KEY, -+ tid INTEGER NOT NULL REFERENCES trans_beg, -+ problem TEXT NOT NULL, msg TEXT NOT NULL); -+''', '''\ -+\ -+ CREATE TABLE trans_prob_pkgs ( -+ rpid INTEGER NOT NULL REFERENCES trans_rpmdb_problems, -+ pkgtupid INTEGER NOT NULL REFERENCES pkgtups, -+ main BOOL NOT NULL DEFAULT FALSE); -+''', '''\ -+\ -+ CREATE VIEW vtrans_data_pkgs AS -+ SELECT tid,name,epoch,version,release,arch,pkgtupid, -+ state,done, -+ name || '-' || epoch || ':' || -+ version || '-' || release || '.' || arch AS nevra -+ FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid) -+ ORDER BY name; -+''', '''\ -+\ -+ CREATE VIEW vtrans_with_pkgs AS -+ SELECT tid,name,epoch,version,release,arch,pkgtupid, -+ name || '-' || epoch || ':' || -+ version || '-' || release || '.' || arch AS nevra -+ FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid) -+ ORDER BY name; -+''', '''\ -+\ -+ CREATE VIEW vtrans_skip_pkgs AS -+ SELECT tid,name,epoch,version,release,arch,pkgtupid, -+ name || '-' || epoch || ':' || -+ version || '-' || release || '.' || arch AS nevra -+ FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) -+ ORDER BY name; -+''', # NOTE: Old versions of sqlite don't like this next view, they are only -+ # there for debugging anyway ... but it's worth remembering. -+'''\ -+\ -+ CREATE VIEW vtrans_prob_pkgs AS -+ SELECT tid,rpid,name,epoch,version,release,arch,pkgtups.pkgtupid, -+ main, -+ name || '-' || epoch || ':' || -+ version || '-' || release || '.' || arch AS nevra -+ FROM (trans_prob_pkgs JOIN trans_rpmdb_problems USING(rpid)) -+ JOIN pkgtups USING(pkgtupid) -+ ORDER BY name; -+'''] -+ -+ def _update_db_file_2(self): -+ """ Update to version 2 of history, includes trans_skip_pkgs. """ -+ if not self.conf.writable: -+ return False -+ -+ if hasattr(self, '_cached_updated_2'): -+ return self._cached_updated_2 -+ -+ cur = self._get_cursor() -+ if cur is None: -+ return False -+ -+ executeSQL(cur, "PRAGMA table_info(trans_skip_pkgs)") -+ # If we get anything, we're fine. There might be a better way of -+ # saying "anything" but this works. -+ for ob in cur: -+ break -+ else: -+ for op in self._update_ops_2: -+ cur.execute(op) -+ self._commit() -+ self._cached_updated_2 = True -+ return True -+ - def _create_db_file(self): - """ Create a new history DB file, populating tables etc. """ +-#: ../yum/__init__.py:2475 ../yum/__init__.py:2480 ++#: ../yum/__init__.py:2634 ../yum/__init__.py:2639 + #, python-format + msgid "No Package found for %s" + msgstr "Inga paket hittades för %s" + +-#: ../yum/__init__.py:2696 ++#: ../yum/__init__.py:2855 + msgid "Package Object was not a package object instance" + msgstr "Paketobjektet var inte en paketobjektinstans" + +-#: ../yum/__init__.py:2700 ++#: ../yum/__init__.py:2859 + msgid "Nothing specified to install" + msgstr "Inget angivet att installeras" + +-#: ../yum/__init__.py:2716 ../yum/__init__.py:3489 ++#: ../yum/__init__.py:2875 ../yum/__init__.py:3652 + #, python-format + msgid "Checking for virtual provide or file-provide for %s" + msgstr "" + "Kontrollerar virtuella tillhandahållanden eller filtillhandahållanden för %s" -@@ -638,6 +940,8 @@ class YumHistory: - '''] - for op in ops: - cur.execute(op) -+ for op in self._update_ops_2: -+ cur.execute(op) - self._commit() +-#: ../yum/__init__.py:2722 ../yum/__init__.py:3037 ../yum/__init__.py:3205 +-#: ../yum/__init__.py:3495 ++#: ../yum/__init__.py:2881 ../yum/__init__.py:3197 ../yum/__init__.py:3365 ++#: ../yum/__init__.py:3658 + #, python-format + msgid "No Match for argument: %s" + msgstr "Ingen matchning för argument: %s" - # Pasted from sqlitesack -diff --git a/yum/logginglevels.py b/yum/logginglevels.py -index 6c23f88..2002140 100644 ---- a/yum/logginglevels.py -+++ b/yum/logginglevels.py -@@ -45,7 +45,7 @@ logging.addLevelName(DEBUG_4, "DEBUG_4") - __NO_LOGGING = 100 - logging.raiseExceptions = False +-#: ../yum/__init__.py:2798 ++#: ../yum/__init__.py:2957 + #, python-format + msgid "Package %s installed and not available" + msgstr "Paket %s installerat och inte tillgänligt" --import syslog as syslog_module -+from logging.handlers import SysLogHandler as syslog_module +-#: ../yum/__init__.py:2801 ++#: ../yum/__init__.py:2960 + msgid "No package(s) available to install" + msgstr "Inga paket tillgängliga att installera" - syslog = None +-#: ../yum/__init__.py:2813 ++#: ../yum/__init__.py:2972 + #, python-format + msgid "Package: %s - already in transaction set" + msgstr "Paket: %s - redan i transaktionsmängden" -@@ -75,7 +75,7 @@ def syslogFacilityMap(facility): - elif (facility.upper().startswith("LOG_") and - facility[4:].upper() in _syslog_facility_map): - return _syslog_facility_map[facility[4:].upper()] -- return syslog.LOG_USER -+ return _syslog_facility_map["USER"] +-#: ../yum/__init__.py:2839 ++#: ../yum/__init__.py:2998 + #, python-format + msgid "Package %s is obsoleted by %s which is already installed" + msgstr "Paket %s fasas ut av %s, som redan är installerat" - def logLevelFromErrorLevel(error_level): - """ Convert an old-style error logging level to the new style. """ -@@ -140,7 +140,6 @@ def doLoggingSetup(debuglevel, errorlevel, - return +-#: ../yum/__init__.py:2842 ++#: ../yum/__init__.py:3001 + #, python-format + msgid "Package %s is obsoleted by %s, trying to install %s instead" + msgstr "Paket %s fasas ut av %s, försöker installera %s istället" - plainformatter = logging.Formatter("%(message)s") -- syslogformatter = logging.Formatter("yum: %(message)s") - - console_stdout = logging.StreamHandler(sys.stdout) - console_stdout.setFormatter(plainformatter) -@@ -158,20 +157,24 @@ def doLoggingSetup(debuglevel, errorlevel, - filelogger.setLevel(logging.INFO) - filelogger.propagate = False +-#: ../yum/__init__.py:2850 ++#: ../yum/__init__.py:3009 + #, python-format + msgid "Package %s already installed and latest version" +-msgstr "Paket %s är redan installerast och senaste version" ++msgstr "Paket %s är redan installerat och senaste version" -- log_dev = syslog_device - global syslog -- if os.path.exists(log_dev): -- try: -- syslog = logging.handlers.SysLogHandler(log_dev) -- syslog.setFormatter(syslogformatter) -- filelogger.addHandler(syslog) -- if syslog_ident is not None or syslog_facility is not None: -- ident = syslog_ident or '' -- facil = syslog_facility or 'LOG_USER' -- syslog_module.openlog(ident, 0, syslogFacilityMap(facil)) -- except socket.error: -- if syslog is not None: -- syslog.close() -+ if syslog_device: -+ address = None -+ if ":" in syslog_device: -+ address = syslog_device.rsplit(":", 1) -+ address = (address[0], int(address[1])) -+ elif os.path.exists(syslog_device): -+ address = syslog_device -+ if address: -+ try: -+ facil = syslogFacilityMap(syslog_facility or "USER") -+ syslog = logging.handlers.SysLogHandler(address, facil) -+ except socket.error: -+ if syslog is not None: -+ syslog.close() -+ else: -+ setLoggingApp(syslog_ident or "yum") -+ filelogger.addHandler(syslog) - _added_handlers = True +-#: ../yum/__init__.py:2864 ++#: ../yum/__init__.py:3023 + #, python-format + msgid "Package matching %s already installed. Checking for update." + msgstr "Paket som matchar %s är redan installerat. Letar efter uppdatering." - if debuglevel is not None: -@@ -189,7 +192,12 @@ def setFileLog(uid, logfile): - logdir = os.path.dirname(logfile) - if not os.path.exists(logdir): - os.makedirs(logdir, mode=0755) -- -+ -+ if not os.path.exists(logfile): -+ f = open(logfile, 'w') -+ os.chmod(logfile, 0600) # making sure umask doesn't catch us up -+ f.close() -+ - filelogger = logging.getLogger("yum.filelogging") - filehandler = logging.FileHandler(logfile) - formatter = logging.Formatter("%(asctime)s %(message)s", -@@ -201,5 +209,5 @@ def setFileLog(uid, logfile): + #. update everything (the easy case) +-#: ../yum/__init__.py:2966 ++#: ../yum/__init__.py:3126 + msgid "Updating Everything" + msgstr "Uppdaterar allt" - def setLoggingApp(app): - if syslog: -- syslogformatter = logging.Formatter("yum(%s): "% (app,) + "%(message)s") -+ syslogformatter = logging.Formatter(app + "[%(process)d]: %(message)s") - syslog.setFormatter(syslogformatter) -diff --git a/yum/mdparser.py b/yum/mdparser.py -index 2753dad..194d5d1 100644 ---- a/yum/mdparser.py -+++ b/yum/mdparser.py -@@ -132,7 +132,7 @@ class PrimaryEntry(BaseEntry): - elif name in ('checksum', 'location'): - p.update(self._prefixprops(child, name)) - p[name + '_value'] = child.text -- if name == 'location' and not p.has_key("location_base"): -+ if name == 'location' and "location_base" not in p: - p["location_base"] = None - - elif name == 'format': -diff --git a/yum/misc.py b/yum/misc.py -index 66b0653..7793807 100644 ---- a/yum/misc.py -+++ b/yum/misc.py -@@ -19,6 +19,13 @@ import pwd - import fnmatch - import bz2 - import gzip -+_available_compression = ['gz', 'bz2'] -+try: -+ import lzma -+ _available_compression.append('xz') -+except ImportError: -+ lzma = None -+ - from rpmUtils.miscutils import stringToVersion, flagToString - from stat import * - try: -@@ -98,17 +105,16 @@ def re_filename(s): - def re_primary_filename(filename): - """ Tests if a filename string, can be matched against just primary. - Note that this can produce false negatives (but not false -- positives). """ -- if 'bin/' in filename: -- return True -- if filename.startswith('/etc/'): -+ positives). Note that this is a superset of re_primary_dirname(). """ -+ if re_primary_dirname(filename): - return True - if filename == '/usr/lib/sendmail': - return True - return False +-#: ../yum/__init__.py:2987 ../yum/__init__.py:3102 ../yum/__init__.py:3129 +-#: ../yum/__init__.py:3155 ++#: ../yum/__init__.py:3147 ../yum/__init__.py:3262 ../yum/__init__.py:3289 ++#: ../yum/__init__.py:3315 + #, python-format + msgid "Not Updating Package that is already obsoleted: %s.%s %s:%s-%s" + msgstr "Uppdaterar inte paket som redan är utfasade: %s.%s %s:%s-%s" + +-#: ../yum/__init__.py:3022 ../yum/__init__.py:3202 ++#: ../yum/__init__.py:3182 ../yum/__init__.py:3362 + #, python-format + msgid "%s" + msgstr "%s" + +-#: ../yum/__init__.py:3093 ++#: ../yum/__init__.py:3253 + #, python-format + msgid "Package is already obsoleted: %s.%s %s:%s-%s" + msgstr "Paketet är redan utfasat: %s.%s %s:%s-%s" + +-#: ../yum/__init__.py:3124 ++#: ../yum/__init__.py:3284 + #, python-format + msgid "Not Updating Package that is obsoleted: %s" +-msgstr "Uppdaterar inte paket som är utfasade: %s" ++msgstr "Uppdaterar inte paket som fasas ut: %s" + +-#: ../yum/__init__.py:3133 ../yum/__init__.py:3159 ++#: ../yum/__init__.py:3293 ../yum/__init__.py:3319 + #, python-format + msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s" + msgstr "Uppdaterar inte paket som redan är uppdaterat: %s.%s %s:%s-%s" + +-#: ../yum/__init__.py:3218 ++#: ../yum/__init__.py:3378 + msgid "No package matched to remove" +-msgstr "Inget paket matchar att tas bort" ++msgstr "Inget paket att tas bort matchar" + +-#: ../yum/__init__.py:3251 ../yum/__init__.py:3349 ../yum/__init__.py:3432 ++#: ../yum/__init__.py:3412 + #, python-format +-msgid "Cannot open file: %s. Skipping." +-msgstr "Det går inte att öppna filen: %s. Hoppar över." ++msgid "Cannot open: %s. Skipping." ++msgstr "Det går inte att öppna: %s. Hoppar över." + +-#: ../yum/__init__.py:3254 ../yum/__init__.py:3352 ../yum/__init__.py:3435 ++#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598 + #, python-format + msgid "Examining %s: %s" + msgstr "Undersöker %s: %s" + +-#: ../yum/__init__.py:3262 ../yum/__init__.py:3355 ../yum/__init__.py:3438 ++#: ../yum/__init__.py:3423 ../yum/__init__.py:3517 ../yum/__init__.py:3601 + #, python-format + msgid "Cannot add package %s to transaction. Not a compatible architecture: %s" + msgstr "" + "Kan inte lägga till paket %s till transaktionen. Inte en kompatibel " + "arkitektur: %s" + +-#: ../yum/__init__.py:3270 ++#: ../yum/__init__.py:3431 + #, python-format + msgid "" + "Package %s not installed, cannot update it. Run yum install to install it " +@@ -2322,98 +2473,108 @@ msgstr "" + "Paket %s är inte installerat, kan inte uppdatera det. Kör yum install för " + "att installera det istället." + +-#: ../yum/__init__.py:3299 ../yum/__init__.py:3360 ../yum/__init__.py:3443 ++#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606 + #, python-format + msgid "Excluding %s" + msgstr "Utesluter %s" + +-#: ../yum/__init__.py:3304 ++#: ../yum/__init__.py:3465 + #, python-format + msgid "Marking %s to be installed" + msgstr "Noterar %s för installation" - def re_primary_dirname(dirname): -- """ Tests if a dirname string, can be matched against just primary. """ -+ """ Tests if a dirname string, can be matched against just primary. Note -+ that this is a subset of re_primary_filename(). """ - if 'bin/' in dirname: - return True - if dirname.startswith('/etc/'): -@@ -676,10 +682,22 @@ def refineSearchPattern(arg): - restring = re.escape(arg) - - return restring -+ -+ -+def _decompress_chunked(source, dest, ztype): -+ -+ if ztype not in _available_compression: -+ msg = "%s compression not available" % ztype -+ raise Errors.MiscError, msg -+ -+ if ztype == 'bz2': -+ s_fn = bz2.BZ2File(source, 'r') -+ elif ztype == 'xz': -+ s_fn = lzma.LZMAFile(source, 'r') -+ elif ztype == 'gz': -+ s_fn = gzip.GzipFile(source, 'r') -+ - --def bunzipFile(source,dest): -- """ Extract the bzipped contents of source to dest. """ -- s_fn = bz2.BZ2File(source, 'r') - destination = open(dest, 'w') +-#: ../yum/__init__.py:3310 ++#: ../yum/__init__.py:3471 + #, python-format + msgid "Marking %s as an update to %s" + msgstr "Noterar %s som en uppdatering av %s" - while True: -@@ -698,7 +716,11 @@ def bunzipFile(source,dest): - - destination.close() - s_fn.close() -- -+ -+def bunzipFile(source,dest): -+ """ Extract the bzipped contents of source to dest. """ -+ _decompress_chunked(source, dest, ztype='bz2') -+ - def get_running_kernel_pkgtup(ts): - """This takes the output of uname and figures out the pkgtup of the running - kernel (name, arch, epoch, version, release).""" -@@ -983,27 +1005,63 @@ def get_uuid(savepath): - - return myid - --def decompress(filename): -+def decompress(filename, dest=None, fn_only=False): - """take a filename and decompress it into the same relative location. - if the file is not compressed just return the file""" -- out = filename -+ -+ out = dest -+ if not dest: -+ out = filename -+ - if filename.endswith('.gz'): -- out = filename.replace('.gz', '') -- decom = gzip.open(filename) -- fo = open(out, 'w') -- fo.write(decom.read()) -- fo.flush() -- fo.close() -- decom.close() -- elif filename.endswith('.bz') or filename.endswith('.bz2'): -- if filename.endswith('.bz'): -- out = filename.replace('.bz','') -- else: -- out = filename.replace('.bz2', '') -- bunzipFile(filename, out) -+ ztype='gz' -+ if not dest: -+ out = filename.replace('.gz', '') +-#: ../yum/__init__.py:3317 ++#: ../yum/__init__.py:3478 + #, python-format + msgid "%s: does not update installed package." + msgstr "%s: uppdaterar inte ett installerat paket." -- #add magical lzma/xz trick here -+ elif filename.endswith('.bz') or filename.endswith('.bz2'): -+ ztype='bz2' -+ if not dest: -+ if filename.endswith('.bz'): -+ out = filename.replace('.bz','') -+ else: -+ out = filename.replace('.bz2', '') - -+ elif filename.endswith('.xz'): -+ ztype='xz' -+ if not dest: -+ out = filename.replace('.xz', '') -+ -+ else: -+ out = filename # returning the same file since it is not compressed -+ ztype = None -+ -+ if ztype and not fn_only: -+ _decompress_chunked(filename, out, ztype) -+ - return out - - -+def read_in_items_from_dot_dir(thisglob, line_as_list=True): -+ """takes a glob of a dir (like /etc/foo.d/*.foo) -+ returns a list of all the lines in all the files matching -+ that glob, ignores comments and blank lines, -+ optional paramater 'line_as_list tells whether to -+ treat each line as a space or comma-separated list, defaults to True""" -+ results = [] -+ for fname in glob.glob(thisglob): -+ for line in open(fname): -+ if re.match('\s*(#|$)', line): -+ continue -+ line = line.rstrip() # no more trailing \n's -+ line = line.lstrip() # be nice -+ if not line: -+ continue -+ if line_as_list: -+ line = line.replace('\n', ' ') -+ line = line.replace(',', ' ') -+ results.extend(line.split()) -+ continue -+ results.append(line) -+ return results -+ +-#: ../yum/__init__.py:3379 ++#: ../yum/__init__.py:3511 ../yum/__init__.py:3595 ++#, python-format ++msgid "Cannot open file: %s. Skipping." ++msgstr "Det går inte att öppna filen: %s. Hoppar över." + -diff --git a/yum/packageSack.py b/yum/packageSack.py -index 1278cba..d822394 100644 ---- a/yum/packageSack.py -+++ b/yum/packageSack.py -@@ -152,6 +152,11 @@ class PackageSackBase(object): - """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]""" - raise NotImplementedError() ++#: ../yum/__init__.py:3541 + msgid "Problem in reinstall: no package matched to remove" + msgstr "Problem att ominstallera: inget paket matchades att tas bort" -+ def have_fastReturnFileEntries(self): -+ """ Is calling pkg.returnFileEntries(primary_only=True) faster than -+ using searchFiles(). """ -+ raise NotImplementedError() +-#: ../yum/__init__.py:3392 ../yum/__init__.py:3523 ++#: ../yum/__init__.py:3554 ../yum/__init__.py:3686 + #, python-format + msgid "Package %s is allowed multiple installs, skipping" + msgstr "Paket %s tillåts multipla installationer, hoppar över" + +-#: ../yum/__init__.py:3413 ++#: ../yum/__init__.py:3575 + #, python-format + msgid "Problem in reinstall: no package %s matched to install" + msgstr "Problem att ominstallera: inget paket %s matchades att installera" + +-#: ../yum/__init__.py:3515 ++#: ../yum/__init__.py:3678 + msgid "No package(s) available to downgrade" + msgstr "Inga paket tillgängliga att nedgradera" + +-#: ../yum/__init__.py:3559 ++#: ../yum/__init__.py:3731 + #, python-format + msgid "No Match for available package: %s" + msgstr "Ingen matchning för tillgängliga paket: %s" + +-#: ../yum/__init__.py:3565 ++#: ../yum/__init__.py:3738 + #, fuzzy, python-format + msgid "Only Upgrade available on package: %s" + msgstr "Endast uppdatering tillgängliga för paket: %s" + +-#: ../yum/__init__.py:3635 ../yum/__init__.py:3672 ++#: ../yum/__init__.py:3808 ../yum/__init__.py:3845 + #, fuzzy, python-format + msgid "Failed to downgrade: %s" + msgstr "Paket att nedgradera" + +-#: ../yum/__init__.py:3704 ++#: ../yum/__init__.py:3877 + #, python-format + msgid "Retrieving GPG key from %s" + msgstr "Hämtar GPG-nyckel från %s" + +-#: ../yum/__init__.py:3724 ++#: ../yum/__init__.py:3897 + msgid "GPG key retrieval failed: " + msgstr "Hämtandet av GPG-nyckeln misslyckades: " + +-#: ../yum/__init__.py:3735 ++#: ../yum/__init__.py:3903 ++#, fuzzy, python-format ++msgid "Invalid GPG Key from %s: %s" ++msgstr "Hämtar GPG-nyckel från %s" + - def searchFiles(self, name): - """return list of packages by filename""" - raise NotImplementedError() -@@ -227,15 +232,15 @@ class PackageSackBase(object): - """return list of newest packages based on name, arch matching - this means(in name.arch form): foo.i386 and foo.noarch are not - compared to each other for highest version only foo.i386 and -- foo.i386 will be compared""" -+ foo.i386 will be compared -+ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 -+ The last _two_ pkgs will be returned, not just one of them. """ - raise NotImplementedError() ++#: ../yum/__init__.py:3912 + #, python-format + msgid "GPG key parsing failed: key does not have value %s" + msgstr "GPG-nyckeltolkning misslyckades: nyckeln har inte värde %s" + +-#: ../yum/__init__.py:3767 ++#: ../yum/__init__.py:3944 + #, python-format + msgid "GPG key at %s (0x%s) is already installed" + msgstr "GPG-nyckel vid %s (0x%s) är redan installerad" + + #. Try installing/updating GPG key +-#: ../yum/__init__.py:3772 ../yum/__init__.py:3834 ++#: ../yum/__init__.py:3949 ../yum/__init__.py:4011 + #, python-format + msgid "Importing GPG key 0x%s \"%s\" from %s" + msgstr "Importerar GPG-nyckel 0x%s \"%s\" från %s" + +-#: ../yum/__init__.py:3789 ++#: ../yum/__init__.py:3966 + msgid "Not installing key" + msgstr "Installerar inte nyckeln" + +-#: ../yum/__init__.py:3795 ++#: ../yum/__init__.py:3972 + #, python-format + msgid "Key import failed (code %d)" + msgstr "Nyckelimport misslyckades (kod %d)" + +-#: ../yum/__init__.py:3796 ../yum/__init__.py:3855 ++#: ../yum/__init__.py:3973 ../yum/__init__.py:4032 + msgid "Key imported successfully" + msgstr "Nyckelimport lyckades" + +-#: ../yum/__init__.py:3801 ../yum/__init__.py:3860 ++#: ../yum/__init__.py:3978 ../yum/__init__.py:4037 + #, python-format + msgid "" + "The GPG keys listed for the \"%s\" repository are already installed but they " +@@ -2424,41 +2585,46 @@ msgstr "" + "inte korrekta för detta paket.\n" + "Kontrollera att de rätta nyckel-URL:erna är konfigurerade för detta förråd." + +-#: ../yum/__init__.py:3810 ++#: ../yum/__init__.py:3987 + msgid "Import of key(s) didn't help, wrong key(s)?" + msgstr "Import av nycklar hjälpte inte, fel nycklar?" + +-#: ../yum/__init__.py:3829 ++#: ../yum/__init__.py:4006 + #, python-format + msgid "GPG key at %s (0x%s) is already imported" + msgstr "GPG-nyckel vid %s (0x%s) är redan importerad" - def returnNewestByName(self, name=None, patterns=None, ignore_case=False): - """return list of newest packages based on name matching - this means(in name.arch form): foo.i386 and foo.noarch will -- be compared to each other for highest version. -- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 -- The last _two_ pkgs will be returned, not just one of them. """ -+ be compared to each other for highest version.""" - raise NotImplementedError() +-#: ../yum/__init__.py:3849 ++#: ../yum/__init__.py:4026 + #, python-format + msgid "Not installing key for repo %s" + msgstr "Installerar inte nyckel för förråd %s" - def simplePkgList(self, patterns=None, ignore_case=False): -@@ -343,7 +348,7 @@ class PackageSackBase(object): - for po in self.returnPackages(repoid=repoid): - preq = 0 - for p in _return_all_provides(po): -- if req.has_key(p): -+ if p in req: - # If this pkg provides something that is required by - # anything but itself (or another version of itself) it - # isn't an orphan. -@@ -497,7 +502,9 @@ class MetaSack(PackageSackBase): - """return list of newest packages based on name, arch matching - this means(in name.arch form): foo.i386 and foo.noarch are not - compared to each other for highest version only foo.i386 and -- foo.i386 will be compared""" -+ foo.i386 will be compared. -+ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 -+ The last _two_ pkgs will be returned, not just one of them. """ - calr = self._computeAggregateListResult - pkgs = calr("returnNewestByNameArch", naTup, patterns, ignore_case) - pkgs = packagesNewestByNameArch(pkgs) -@@ -509,9 +516,7 @@ class MetaSack(PackageSackBase): - def returnNewestByName(self, name=None, patterns=None, ignore_case=False): - """return list of newest packages based on name matching - this means(in name.arch form): foo.i386 and foo.noarch will -- be compared to each other for highest version. -- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 -- The last _two_ pkgs will be returned, not just one of them. """ -+ be compared to each other for highest version.""" - pkgs = self._computeAggregateListResult("returnNewestByName", name, - patterns, ignore_case) - pkgs = packagesNewestByName(pkgs) -@@ -638,7 +643,7 @@ class PackageSack(PackageSackBase): +-#: ../yum/__init__.py:3854 ++#: ../yum/__init__.py:4031 + msgid "Key import failed" + msgstr "Nyckelimport misslyckades" - def dropCachedData(self): - """ Do nothing, mainly for the testing code. """ -- pass -+ self.clearIndexes() +-#: ../yum/__init__.py:3976 ++#: ../yum/__init__.py:4157 + msgid "Unable to find a suitable mirror." + msgstr "Kan inte hitta en lämplig spegel." - def setCompatArchs(self, compatarchs): - self.compatarchs = compatarchs -@@ -772,18 +777,21 @@ class PackageSack(PackageSackBase): - - return obs - -+ def have_fastReturnFileEntries(self): -+ """ Is calling pkg.returnFileEntries(primary_only=True) faster than -+ using searchFiles(). """ -+ return True +-#: ../yum/__init__.py:3978 ++#: ../yum/__init__.py:4159 + msgid "Errors were encountered while downloading packages." + msgstr "Fel uppstod när paket hämtades." + +-#: ../yum/__init__.py:4028 ++#: ../yum/__init__.py:4209 + #, python-format + msgid "Please report this error at %s" + msgstr "Rapportera gärna detta fel till %s" + +-#: ../yum/__init__.py:4052 ++#: ../yum/__init__.py:4233 + msgid "Test Transaction Errors: " + msgstr "Transaktionstestfel: " + ++#: ../yum/__init__.py:4334 ++#, fuzzy, python-format ++msgid "Could not set cachedir: %s" ++msgstr "Kunde inte utföra kontrollsummering" + - def searchFiles(self, name): -- """return list of packages by filename -- FIXME - need to add regex match against keys in file list -- """ -+ """ Return list of packages by filename. """ - self._checkIndexes(failure='build') -- if self.filenames.has_key(name): -+ if name in self.filenames: - return self.filenames[name] - else: - return [] + #. Mostly copied from YumOutput._outKeyValFill() + #: ../yum/plugins.py:202 + msgid "Loaded plugins: " +@@ -2519,7 +2685,21 @@ msgstr "Kan inte hitta konfigurationsfil för insticksmodulen %s" + msgid "registration of commands not supported" + msgstr "registrering av kommandon stöds inte" - def _addToDictAsList(self, dict, key, data): -- if not dict.has_key(key): -+ if key not in dict: - dict[key] = [] - #if data not in dict[key]: - if I enable this the whole world grinds to a halt - # need a faster way of looking for the object in any particular list -@@ -903,7 +911,10 @@ class PackageSack(PackageSackBase): - """return list of newest packages based on name, arch matching - this means(in name.arch form): foo.i386 and foo.noarch are not - compared to each other for highest version only foo.i386 and -- foo.i386 will be compared""" -+ foo.i386 will be compared -+ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 -+ The last _two_ pkgs will be returned, not just one of them. """ +-#: ../yum/rpmtrans.py:78 ++#: ../yum/rpmsack.py:102 ++msgid "has missing requires of" ++msgstr "" + - highdict = {} - # If naTup is set, only iterate through packages that match that - # name -@@ -917,7 +928,7 @@ class PackageSack(PackageSackBase): - ignore_case=ignore_case) ++#: ../yum/rpmsack.py:105 ++#, fuzzy ++msgid "has installed conflicts" ++msgstr "ange installationsrot" ++ ++#: ../yum/rpmsack.py:114 ++#, fuzzy, python-format ++msgid "%s is a duplicate with %s" ++msgstr "Noterar %s som en uppdatering av %s" ++ ++#: ../yum/rpmtrans.py:79 + msgid "Repackaging" + msgstr "Paketerar om" - for pkg in where: -- if not highdict.has_key((pkg.name, pkg.arch)): -+ if (pkg.name, pkg.arch) not in highdict: - highdict[(pkg.name, pkg.arch)] = pkg - else: - pkg2 = highdict[(pkg.name, pkg.arch)] -@@ -935,16 +946,18 @@ class PackageSack(PackageSackBase): - def returnNewestByName(self, name=None, patterns=None, ignore_case=False): - """return list of newest packages based on name matching - this means(in name.arch form): foo.i386 and foo.noarch will -- be compared to each other for highest version. -- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 -- The last _two_ pkgs will be returned, not just one of them. """ -+ be compared to each other for highest version.""" +@@ -2553,6 +2733,24 @@ msgstr "Trasigt huvud %s" + msgid "Error opening rpm %s - error %s" + msgstr "Fel när rpm %s öppnades - fel %s" - highdict = {} -- for pkg in self.returnPackages(patterns=patterns, -- ignore_case=ignore_case): -- if not highdict.has_key(pkg.name): -- highdict[pkg.name] = [] -- highdict[pkg.name].append(pkg) -+ if patterns is None and name is not None: -+ pkgs = self.searchNevra(name=name) -+ else: -+ pkgs = self.returnPackages(patterns=patterns, -+ ignore_case=ignore_case) ++#~ msgid "Finished Transaction Test" ++#~ msgstr "Avslutade transaktionstest" + -+ for pkg in pkgs: -+ if pkg.name not in highdict: -+ highdict[pkg.name] = [pkg] - else: - pkg2 = highdict[pkg.name][0] - if pkg.verGT(pkg2): -@@ -1002,8 +1015,7 @@ class PackageSack(PackageSackBase): - - def packagesNewestByName(pkgs): - """ Does the same as PackageSack.returnNewestByName(). -- Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 -- The last _two_ pkgs will be returned, not just one of them. """ -+ Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64""" - newest = {} - for pkg in pkgs: - key = pkg.name -@@ -1021,7 +1033,8 @@ def packagesNewestByName(pkgs): - ret.extend(vals) - return ret - def packagesNewestByNameArch(pkgs): -- """ Does the same as PackageSack.returnNewestByNameArch() """ -+ """ Does the same as PackageSack.returnNewestByNameArch() -+ The last _two_ pkgs will be returned, not just one of them.""" - newest = {} - for pkg in pkgs: - key = (pkg.name, pkg.arch) -diff --git a/yum/packages.py b/yum/packages.py -index 33cbc39..4687cd3 100644 ---- a/yum/packages.py -+++ b/yum/packages.py -@@ -91,7 +91,7 @@ def buildPkgRefDict(pkgs, casematch=True): - envra = '%s:%s-%s-%s.%s' % (e, n, v, r, a) - nevra = '%s-%s:%s-%s.%s' % (n, e, v, r, a) - for item in [name, nameArch, nameVerRelArch, nameVer, nameVerRel, envra, nevra]: -- if not pkgdict.has_key(item): -+ if item not in pkgdict: - pkgdict[item] = [] - pkgdict[item].append(pkg) - -@@ -159,6 +159,11 @@ class FakeSack: - def __init__(self): - pass # This is fake, so do nothing - -+ def have_fastReturnFileEntries(self): -+ """ Is calling pkg.returnFileEntries(primary_only=True) faster than -+ using searchFiles(). """ -+ return True ++#~ msgid "" ++#~ " You could try running: package-cleanup --problems\n" ++#~ " package-cleanup --dupes\n" ++#~ " rpm -Va --nofiles --nodigest" ++#~ msgstr "" ++#~ " Du kan försöka köra: package-cleanup --problems\n" ++#~ " package-cleanup --dupes\n" ++#~ " rpm -Va --nofiles --nodigest" + - def delPackage(self, obj): - """delete a pkgobject, do nothing, but make localpackages work with --skip-broken""" - pass # This is fake, so do nothing -@@ -210,8 +215,10 @@ class FakeRepository: - return self.id ++#~ msgid "Unresolvable requirement %s for %s" ++#~ msgstr "Ej upplösbart behov %s för %s" ++ ++#~ msgid "Missing Dependency: %s is needed by package %s" ++#~ msgstr "Saknat beroende: %s behövs av paketet %s" ++ + #~ msgid "" + #~ "getInstalledPackageObject() will go away, use self.rpmdb.searchPkgTuple" + #~ "().\n" +-- +1.7.0.1 + + +From ce411009f3e80fa4b331db72e635b3f1d770bce9 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Sat, 15 May 2010 20:16:01 -0400 +Subject: [PATCH 130] Handle obsoleting pkgs. which are excluded after obsoleted_dict setup + +--- + yum/__init__.py | 7 ++++++- + 1 files changed, 6 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 9546aec..612b6ab 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -3389,7 +3389,12 @@ class YumBase(depsolve.Depsolve): + obs_tups = self.up.obsoleted_dict.get(installed_pkg.pkgtup, []) + # This is done so we don't have to returnObsoletes(newest=True) + # It's a minor UI problem for RHEL, but might as well dtrt. +- obs_pkgs = [self.getPackageObject(tup) for tup in obs_tups] ++ obs_pkgs = [] ++ for pkgtup in obs_tups: ++ opkgs = self.pkgSack.searchPkgTuple(pkgtup) ++ if not opkgs: # Could have been be excluded after ++ continue # obsoleted_dict was setup. ++ obs_pkgs.append(opkgs[0]) + for obsoleting_pkg in packagesNewestByName(obs_pkgs): + tx_return.extend(self.install(po=obsoleting_pkg)) + for available_pkg in availpkgs: +-- +1.7.0.1 + + +From 94f7d48b66c8195da4371ce77212f4efcbe18b4d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Skytt=C3=A4?= +Date: Mon, 17 May 2010 22:29:10 +0300 +Subject: [PATCH 131] Man page formatting fixes. + +--- + docs/yum.8 | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/docs/yum.8 b/docs/yum.8 +index 053173d..d5ede0a 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -123,7 +123,7 @@ Running in verbose mode also shows obsoletes. + Is the same as the update command with the \-\-obsoletes flag set. See update + for more details. + .IP +-.IP "\fBdistribution-synchronization\fP" "\fBdistro-sync\fP" ++.IP "\fBdistribution\-synchronization\fP or \fBdistro\-sync\fP" + Synchronizes the installed package set with the latest packages available, this + is done by either obsoleting, upgrading or downgrading as appropriate. This will + "normally" do the same thing as the upgrade command however if you have the +-- +1.7.0.1 + + +From bbddbbfc24156b17f263c4efea8ffece5595b1a6 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 18 May 2010 15:19:54 -0400 +Subject: [PATCH 132] Add testcase for obsoletes of to be installed pkgs. -- 593349 + +--- + test/simpleobsoletestests.py | 18 +++++++++++++++++- + 1 files changed, 17 insertions(+), 1 deletions(-) + +diff --git a/test/simpleobsoletestests.py b/test/simpleobsoletestests.py +index cf1821f..091e3a4 100644 +--- a/test/simpleobsoletestests.py ++++ b/test/simpleobsoletestests.py +@@ -157,11 +157,27 @@ class SimpleObsoletesTests(OperationsTests): + self.assert_(res=='ok', msg) + self.assertResult((p.obsoletes_x86_64, p.requires_obsoletes)) + +- def testObsoletex86_64ToMultiarch(self): ++ def testObsoletex86_64ToMultiarch1(self): + p = self.pkgs + res, msg = self.runOperation(['update'], [p.installed_x86_64], [p.obsoletes_i386, p.obsoletes_x86_64]) + self.assert_(res=='ok', msg) + self.assertResult((p.obsoletes_x86_64,)) ++ def testObsoletex86_64ToMultiarch2(self): ++ p = self.pkgs ++ res, msg = self.runOperation(['update'], [p.installed_x86_64], [p.obsoletes_x86_64, p.obsoletes_i386]) ++ self.assert_(res=='ok', msg) ++ self.assertResult((p.obsoletes_x86_64,)) ++ def testInstallObsoletex86_64ToMultiarch1(self): ++ # Found by BZ 593349, libgfortran43/44 ++ p = self.pkgs ++ res, msg = self.runOperation(['install', 'zsh.x86_64'], [], [p.installed_x86_64, p.installed_i386, p.obsoletes_x86_64, p.obsoletes_i386]) ++ self.assert_(res=='ok', msg) ++ self.assertResult((p.obsoletes_x86_64,)) ++ def testInstallObsoletex86_64ToMultiarch2(self): ++ p = self.pkgs ++ res, msg = self.runOperation(['install', 'zsh.i386'], [], [p.installed_x86_64, p.installed_i386, p.obsoletes_x86_64, p.obsoletes_i386]) ++ self.assert_(res=='ok', msg) ++ self.assertResult((p.obsoletes_i386,)) + def testObsoletex86_64ToMultiarchForDependency(self): + p = self.pkgs + res, msg = self.runOperation(['install', 'superzippy'], +-- +1.7.0.1 + + +From 0408550d397b266840eb84e1c856ed8830586952 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 18 May 2010 16:17:18 -0400 +Subject: [PATCH 133] Fix for obsoleting pkgs. we are trying to install + +--- + yum/__init__.py | 13 ++++++++++++- + 1 files changed, 12 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 612b6ab..f5f2b51 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2882,7 +2882,18 @@ class YumBase(depsolve.Depsolve): + we should install instead. Or None if there isn't one. """ + thispkgobsdict = self.up.checkForObsolete([po.pkgtup]) + if po.pkgtup in thispkgobsdict: +- obsoleting = thispkgobsdict[po.pkgtup][0] ++ obsoleting = thispkgobsdict[po.pkgtup] ++ oobsoleting = [] ++ # We want to keep the arch. of the obsoleted pkg. if possible. ++ for opkgtup in obsoleting: ++ if not canCoinstall(po.arch, opkgtup[1]): ++ oobsoleting.append(opkgtup) ++ if oobsoleting: ++ obsoleting = oobsoleting ++ # NOTE: if we move from noarch => multilib. then the ordering ++ # here seems to always prefer i386 over x86_64 which is wrong. ++ # Need to sort by arch? ++ obsoleting = obsoleting[0] + obsoleting_pkg = self.getPackageObject(obsoleting) + return obsoleting_pkg + return None +-- +1.7.0.1 + + +From 594a58bb622bc171782e9d0ec2943070507a6c79 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 18 May 2010 16:54:08 -0400 +Subject: [PATCH 134] Now do the same testcase for noarch => multilib + +--- + test/simpleobsoletestests.py | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/test/simpleobsoletestests.py b/test/simpleobsoletestests.py +index 091e3a4..dfaa7e5 100644 +--- a/test/simpleobsoletestests.py ++++ b/test/simpleobsoletestests.py +@@ -178,6 +178,11 @@ class SimpleObsoletesTests(OperationsTests): + res, msg = self.runOperation(['install', 'zsh.i386'], [], [p.installed_x86_64, p.installed_i386, p.obsoletes_x86_64, p.obsoletes_i386]) + self.assert_(res=='ok', msg) + self.assertResult((p.obsoletes_i386,)) ++ def testInstallObsoletex86_64ToMultiarch3(self): ++ p = self.pkgs ++ res, msg = self.runOperation(['install', 'zsh'], [], [p.installed_noarch, p.obsoletes_x86_64, p.obsoletes_i386]) ++ self.assert_(res=='ok', msg) ++ self.assertResult((p.obsoletes_x86_64,)) + def testObsoletex86_64ToMultiarchForDependency(self): + p = self.pkgs + res, msg = self.runOperation(['install', 'superzippy'], +-- +1.7.0.1 + + +From 9a2fa66d899c8c2cd0a91d7dfc61a26cd01bc382 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 18 May 2010 16:54:32 -0400 +Subject: [PATCH 135] Fix obsoleting pkgs. from to multilib. using archdistance + +--- + yum/__init__.py | 40 ++++++++++++++++++++++++++++++++++++---- + 1 files changed, 36 insertions(+), 4 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index f5f2b51..773b433 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -41,7 +41,8 @@ from config import ParsingError, ConfigParser + import Errors + import rpmsack + import rpmUtils.updates +-from rpmUtils.arch import canCoinstall, ArchStorage, isMultiLibArch ++from rpmUtils.arch import archDifference, canCoinstall, ArchStorage, isMultiLibArch ++from rpmUtils.miscutils import compareEVR + import rpmUtils.transaction + import comps + import pkgtag_db +@@ -2890,9 +2891,40 @@ class YumBase(depsolve.Depsolve): + oobsoleting.append(opkgtup) + if oobsoleting: + obsoleting = oobsoleting +- # NOTE: if we move from noarch => multilib. then the ordering +- # here seems to always prefer i386 over x86_64 which is wrong. +- # Need to sort by arch? ++ if len(obsoleting) > 1: ++ # Pick the first name, and run with it... ++ first = obsoleting[0] ++ obsoleting = [pkgtup for pkgtup in obsoleting ++ if first[0] == pkgtup[0]] ++ if len(obsoleting) > 1: ++ # Lock to the latest version... ++ def _sort_ver(x, y): ++ n1,a1,e1,v1,r1 = x ++ n2,a2,e2,v2,r2 = y ++ return compareEVR((e1,v1,r1), (e2,v2,r2)) ++ obsoleting.sort(_sort_ver) ++ first = obsoleting[0] ++ obsoleting = [pkgtup for pkgtup in obsoleting ++ if not _sort_ver(first, pkgtup)] ++ if len(obsoleting) > 1: ++ # Now do arch distance (see depsolve:compare_providers)... ++ def _sort_arch_i(carch, a1, a2): ++ res1 = archDifference(carch, a1) ++ if not res1: ++ return 0 ++ res2 = archDifference(carch, a2) ++ if not res2: ++ return 0 ++ return res1 - res2 ++ def _sort_arch(x, y): ++ n1,a1,e1,v1,r1 = x ++ n2,a2,e2,v2,r2 = y ++ ret = _sort_arch_i(po.arch, a1, a2) ++ if ret: ++ return ret ++ ret = _sort_arch_i(self.arch.bestarch, a1, a2) ++ return ret ++ obsoleting.sort(_sort_arch) + obsoleting = obsoleting[0] + obsoleting_pkg = self.getPackageObject(obsoleting) + return obsoleting_pkg +-- +1.7.0.1 + + +From 3e4a7713512237489a3959329d468d456f87404a Mon Sep 17 00:00:00 2001 +From: Tim Lauridsen +Date: Mon, 17 May 2010 09:41:21 +0200 +Subject: [PATCH 136] SKIP-BROKEN: fix issue where the loop detection are triggered because the have been a unchanged transaction earlier in a skip-broken loop, but was solved by hard reseting the transation. It is only a loop if we have a unchanged transaction 2 times in a row (rhbz # 590454) + +--- + yum/__init__.py | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 773b433..8a2fbf4 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1024,6 +1024,10 @@ class YumBase(depsolve.Depsolve): + else: + self.verbose_logger.debug('SKIPBROKEN: resetting already resolved packages (transaction not changed)' ) + self.tsInfo.resetResolved(hard=True) ++ else: ++ # Reset the looping counter, because it is only a loop if the same transaction is ++ # unchanged two times in row, not if it has been unchanged in a early stage. ++ looping = 0 + + # if we are all clear, then we have to check that the whole current transaction + # can complete the depsolve without error, because the packages skipped +-- +1.7.0.1 + + +From 891f07ced4ae5afc5b4d0f57fc652eda5ba5e156 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?G=C3=B6ran=20Uddeborg?= +Date: Wed, 19 May 2010 20:59:52 +0000 +Subject: [PATCH 137] l10n: Updates to Swedish (sv) translation + +New status: 549 messages complete with 17 fuzzies and 3 untranslated. + +Transmitted-via: Transifex (www.transifex.net). +--- + po/sv.po | 60 +++++++++++++++++++++++++++--------------------------------- + 1 files changed, 27 insertions(+), 33 deletions(-) + +diff --git a/po/sv.po b/po/sv.po +index 7b0d4ce..f9302de 100644 +--- a/po/sv.po ++++ b/po/sv.po +@@ -10,7 +10,7 @@ msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" + "POT-Creation-Date: 2010-02-11 10:54-0500\n" +-"PO-Revision-Date: 2010-05-17 16:44+0200\n" ++"PO-Revision-Date: 2010-05-19 22:57+0200\n" + "Last-Translator: Göran Uddeborg \n" + "Language-Team: Swedish \n" + "MIME-Version: 1.0\n" +@@ -1078,32 +1078,32 @@ msgstr "Tid" + #: ../output.py:1547 + msgid "Last day" +-msgstr "Senaste dag" ++msgstr "Senaste dagen" --# goal for the below is to have a packageobject that can be used by generic -+# Goal for the below is to have a packageobject that can be used by generic - # functions independent of the type of package - ie: installed or available -+# Note that this is also used to history etc. ... so it's more a nevra+checksum -+# holder than a base for things which are actual packages. - class PackageObject(object): - """Base Package Object - sets up the default storage dicts and the - most common returns""" -@@ -296,11 +303,16 @@ class PackageObject(object): - def verEQ(self, other): - """ Compare package to another one, only rpm-version equality. """ - if not other: -- return False -+ return None - ret = cmp(self.name, other.name) - if ret != 0: - return False - return comparePoEVREQ(self, other) -+ def verNE(self, other): -+ """ Compare package to another one, only rpm-version inequality. """ -+ if not other: -+ return None -+ return not self.verEQ(other) - def verLT(self, other): - """ Uses verCMP, tests if the other _rpm-version_ is < ours. """ - return self.verCMP(other) < 0 -@@ -332,6 +344,10 @@ class PackageObject(object): - if csumid: - return (csumtype, csum) + #: ../output.py:1548 + msgid "Last week" +-msgstr "Senaste vecka" ++msgstr "Senaste veckan" -+# This is the virtual base class of actual packages, it basically requires a -+# repo. even though it doesn't set one up in it's __init__. It also doesn't have -+# PackageObject methods ... so is basically unusable on it's own -+# see: YumAvailablePackage. - class RpmBase(object): - """return functions and storage for rpm-specific data""" + #: ../output.py:1549 + msgid "Last 2 weeks" +-msgstr "" ++msgstr "Senaste 2 veckorna" -@@ -377,13 +393,13 @@ class RpmBase(object): - def returnPrco(self, prcotype, printable=False): - """return list of provides, requires, conflicts or obsoletes""" - -- prcos = [] -- if self.prco.has_key(prcotype): -- prcos = self.prco[prcotype] -+ prcos = self.prco.get(prcotype, []) + #. US default :p + #: ../output.py:1550 + msgid "Last 3 months" +-msgstr "" ++msgstr "Senaste 3 månaderna" - if printable: - results = [] - for prco in prcos: -+ if not prco[0]: # empty or none or whatever, doesn't matter -+ continue - results.append(misc.prco_tuple_to_string(prco)) - return results + #: ../output.py:1551 + msgid "Last 6 months" +-msgstr "" ++msgstr "Senaste 6 månaderna" -@@ -458,7 +474,27 @@ class RpmBase(object): + #: ../output.py:1552 + msgid "Last year" +-msgstr "" ++msgstr "Senaste året" - return result + #: ../output.py:1553 + msgid "Over a year ago" +-msgstr "" ++msgstr "Mer än ett år tillbaka" -+ def provides_for(self, reqtuple): -+ """check to see if the package object provides for the requirement -+ passed, including searching filelists if the requirement is a file -+ dep""" -+ -+ if self.checkPrco('provides', reqtuple): -+ return True -+ -+ if reqtuple[0].startswith('/'): -+ if misc.re_primary_filename(reqtuple[0]): -+ pri_only = True -+ else: -+ pri_only = False + #: ../output.py:1585 + msgid "installed" +@@ -1617,9 +1617,8 @@ msgid "Repo-include : " + msgstr "Förråd inkluderar: " -+ files = self.returnFileEntries('file', pri_only) + \ -+ self.returnFileEntries('dir', pri_only) + \ -+ self.returnFileEntries('ghost', pri_only) -+ if reqtuple[0] in files: -+ return True -+ -+ return False - - def returnChangelog(self): - """return changelog entries""" -@@ -478,9 +514,26 @@ class RpmBase(object): - return self.files[ftype] - return [] - -- def returnFileTypes(self): -- """return list of types of files in the package""" -- # maybe should die - use direct access to attribute -+ def returnFileTypes(self, primary_only=False): -+ """return list of types of files in the package, you can pass -+ primary_only=True to limit to those files in the primary repodata""" -+ if primary_only: -+ ret = [] # We only return the types for the primary files. -+ for ftype in self.files.keys(): -+ if ftype == 'dir': -+ match = misc.re_primary_dirname -+ else: -+ match = misc.re_primary_filename -+ # As soon as we find a primary file of this type, we can -+ # return it. -+ for fn in self.files[ftype]: -+ if match(fn): -+ break -+ else: -+ continue -+ ret.append(ftype) -+ return ret -+ - return self.files.keys() + #: ../yumcommands.py:941 +-#, fuzzy + msgid "Repo-excluded: " +-msgstr "Förråd utesluter : " ++msgstr "Förråd uteslutet : " - def returnPrcoNames(self, prcotype): -@@ -538,11 +591,32 @@ class RpmBase(object): + #. Work out the first (id) and last (enabled/disalbed/count), + #. then chop the middle (name)... +@@ -1686,48 +1685,44 @@ msgstr "Visa en version för maskinen och/eller tillgängliga förråd." - base_package_name = property(fget=lambda self: self._getBaseName()) + #: ../yumcommands.py:1173 + msgid " Yum version groups:" +-msgstr "" ++msgstr " Yum versionsgrupper:" -+ def have_fastReturnFileEntries(self): -+ """ Is calling pkg.returnFileEntries(primary_only=True) faster than -+ using searchFiles(). """ -+ return self.repo.sack.have_fastReturnFileEntries() -+ -+ def obsoletedBy(self, obsoleters, limit=0): -+ """ Returns list of obsoleters that obsolete this package. Note that we -+ don't do obsoleting loops. If limit is != 0, then we stop after -+ finding that many. """ -+ provtup = (self.name, 'EQ', (self.epoch, self.version, self.release)) -+ ret = [] -+ for obspo in obsoleters: -+ if obspo.inPrcoRange('obsoletes', provtup): -+ ret.append(obspo) -+ if limit and len(ret) > limit: -+ break -+ return ret -+ + #: ../yumcommands.py:1183 +-#, fuzzy + msgid " Group :" +-msgstr " Grupp-id: %s" ++msgstr " Grupp:" -+ -+# This is kind of deprecated - class PackageEVR: + #: ../yumcommands.py:1184 +-#, fuzzy + msgid " Packages:" +-msgstr "Paket" ++msgstr " Paket:" - """ -- A comparable epoch, version, and release representation. -+ A comparable epoch, version, and release representation. Note that you -+ almost certainly want to use pkg.verEQ() or pkg.verGT() etc. instead. - """ - - def __init__(self,e,v,r): -@@ -585,7 +659,8 @@ class PackageEVR: - return False - + #: ../yumcommands.py:1213 + msgid "Installed:" + msgstr "Installerade:" -- -+# This is the real base class of actual packages, it has a repo. and is -+# usable on it's own, in theory (but in practise see sqlitesack). - class YumAvailablePackage(PackageObject, RpmBase): - """derived class for the packageobject and RpmBase packageobject yum - uses this for dealing with packages in a repository""" -@@ -838,12 +913,9 @@ class YumAvailablePackage(PackageObject, RpmBase): - self.installedsize = pkgdict.size['installed'] - - if hasattr(pkgdict, 'location'): -- if not pkgdict.location.has_key('base'): -+ url = pkgdict.location.get('base') -+ if url == '': - url = None -- elif pkgdict.location['base'] == '': -- url = None -- else: -- url = pkgdict.location['base'] + #: ../yumcommands.py:1218 +-#, fuzzy + msgid "Group-Installed:" +-msgstr "Installerade:" ++msgstr "Gruppinstallerade:" - self.basepath = url - self.relativepath = pkgdict.location['href'] -@@ -863,7 +935,7 @@ class YumAvailablePackage(PackageObject, RpmBase): - if hasattr(pkgdict, 'files'): - for fn in pkgdict.files: - ftype = pkgdict.files[fn] -- if not self.files.has_key(ftype): -+ if ftype not in self.files: - self.files[ftype] = [] - self.files[ftype].append(fn) - -@@ -871,19 +943,17 @@ class YumAvailablePackage(PackageObject, RpmBase): - for rtype in pkgdict.prco: - for rdict in pkgdict.prco[rtype]: - name = rdict['name'] -- f = e = v = r = None -- if rdict.has_key('flags'): f = rdict['flags'] -- if rdict.has_key('epoch'): e = rdict['epoch'] -- if rdict.has_key('ver'): v = rdict['ver'] -- if rdict.has_key('rel'): r = rdict['rel'] -+ f = rdict.get('flags') -+ e = rdict.get('epoch') -+ v = rdict.get('ver') -+ r = rdict.get('rel') - self.prco[rtype].append((name, f, (e,v,r))) + #: ../yumcommands.py:1227 + msgid "Available:" + msgstr "Tillgängliga:" - if hasattr(pkgdict, 'changelog'): - for cdict in pkgdict.changelog: -- date = text = author = None -- if cdict.has_key('date'): date = cdict['date'] -- if cdict.has_key('value'): text = cdict['value'] -- if cdict.has_key('author'): author = cdict['author'] -+ date = cdict.get('date') -+ text = cdict.get('value') -+ author = cdict.get('author') - self._changelog.append((date, author, text)) - - if hasattr(pkgdict, 'checksum'): -@@ -1101,7 +1171,8 @@ class YumAvailablePackage(PackageObject, RpmBase): + #: ../yumcommands.py:1233 +-#, fuzzy + msgid "Group-Available:" +-msgstr "Tillgängliga:" ++msgstr "Grupptillgängliga:" + #: ../yumcommands.py:1272 + msgid "Display, or use, the transaction history" +-msgstr "" ++msgstr "Visa, eller använd, transaktionshistorien" + #: ../yumcommands.py:1300 + #, python-format + msgid "Invalid history sub-command, use: %s." +-msgstr "" ++msgstr "Ogiltigt underkommando till history, använd: %s." -- -+# This is a tweak on YumAvailablePackage() and is a base class for packages -+# which are actual rpms. - class YumHeaderPackage(YumAvailablePackage): - """Package object built from an rpm header""" - def __init__(self, repo, hdr): -@@ -1162,7 +1233,7 @@ class YumHeaderPackage(YumAvailablePackage): - for tag in tag2prco: - name = hdr[getattr(rpm, 'RPMTAG_%sNAME' % tag)] - name = map(misc.share_data, name) -- if name is None: -+ if not name: # empty or none or whatever, doesn't matter - continue + #: ../yumcommands.py:1345 + msgid "Check for problems in the rpmdb" +-msgstr "" ++msgstr "Kontrollera om det finns problem i rpmdb:n" - lst = hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)] -@@ -1221,7 +1292,7 @@ class YumHeaderPackage(YumAvailablePackage): - for (fn, mode, flag) in filetuple: - #garbage checks - if mode is None or mode == '': -- if not self.files.has_key('file'): -+ if 'file' not in self.files: - self.files['file'] = [] - self.files['file'].append(fn) - continue -@@ -1341,6 +1412,7 @@ _RPMVERIFY_RDEV = (1 << 7) + #: ../yummain.py:102 + msgid "" +@@ -1757,7 +1752,7 @@ msgstr " Du kan försöka använda --skip-broken för att gå runt problemet" - _installed_repo = FakeRepository('installed') - _installed_repo.cost = 0 -+# This is a tweak on YumHeaderPackage() for installed rpm packages. - class YumInstalledPackage(YumHeaderPackage): - """super class for dealing with packages in the rpmdb""" - def __init__(self, hdr, yumdb=None): -@@ -1604,6 +1676,7 @@ class YumInstalledPackage(YumHeaderPackage): - return results - - -+# This is a tweak on YumHeaderPackage() for rpm packages which are on disk. - class YumLocalPackage(YumHeaderPackage): - """Class to handle an arbitrary package from a file path - this inherits most things from YumInstalledPackage because -@@ -1613,8 +1686,10 @@ class YumLocalPackage(YumHeaderPackage): + #: ../yummain.py:175 ../yummain.py:208 + msgid " You could try running: rpm -Va --nofiles --nodigest" +-msgstr "" ++msgstr " Du kan försöka köra: rpm -Va --nofiles --nodigest" - def __init__(self, ts=None, filename=None): - if ts is None: -- raise Errors.MiscError, \ -- 'No Transaction Set Instance for YumLocalPackage instance creation' -+ # This shouldn't be used "normally" within yum, but is very useful -+ # for small scripts and debugging/etc. -+ ts = rpmUtils.transaction.initReadOnlyTransaction() -+ - if filename is None: - raise Errors.MiscError, \ - 'No Filename specified for YumLocalPackage instance creation' -@@ -1747,6 +1822,8 @@ class YumLocalPackage(YumHeaderPackage): - return msg + #: ../yummain.py:188 + msgid "" +@@ -1831,9 +1826,9 @@ msgid "%s requires: %s" + msgstr "%s behöver: %s" + #: ../yum/depsolve.py:319 +-#, fuzzy, python-format ++#, python-format + msgid "%s requires %s" +-msgstr "%s behöver: %s" ++msgstr "%s behöver %s" -+# This is a tweak on YumLocalPackage() to download rpm packages to disk, and -+# then use them directly. - class YumUrlPackage(YumLocalPackage): - """Class to handle an arbitrary package from a URL - this inherits most things from YumLocalPackage, but will download a -diff --git a/yum/pgpmsg.py b/yum/pgpmsg.py -index f8dccdb..9cf8217 100644 ---- a/yum/pgpmsg.py -+++ b/yum/pgpmsg.py -@@ -18,6 +18,11 @@ import struct, time, cStringIO, base64, types - # We use this so that we can work on python-2.4 and python-2.6, and thus. - # use import md5/import sha on the older one and import hashlib on the newer. - # Stupid deprecation warnings. -+ -+# pylint: disable-msg=W0108 -+# Ignore :W0108: *Lambda may not be necessary* -+ -+ - try: - import hashlib - except ImportError: -@@ -302,7 +307,7 @@ REVOKE_KEY_CLASS_SENS = 0x40 # sensitive - PGP_FEATURE_1_MOD_DETECT = 0x01 # Modification detection + #: ../yum/depsolve.py:346 + msgid "Needed Require has already been looked up, cheating" +@@ -1978,9 +1973,9 @@ msgid "common sourcerpm %s and %s" + msgstr "samma käll-rpm %s och %s" - pgp_feature_to_str = { -- PGP_FEATURE_1_MOD_DETECT : 'Modification Detectiobn' -+ PGP_FEATURE_1_MOD_DETECT : 'Modification Detection' - } + #: ../yum/depsolve.py:1241 +-#, fuzzy, python-format ++#, python-format + msgid "base package %s is installed for %s" +-msgstr "TSINFO: Noterar %s som en installation av %s" ++msgstr "baspaket %s är installerat för %s" - def get_whole_number(msg, idx, numlen) : -@@ -399,7 +404,7 @@ def map_to_str(m, vals) : - if type(vals) != types.ListType and type(vals) != types.TupleType : - vals = list((vals,)) - for i in vals : -- if m.has_key(i) : -+ if i in m : - slist.append(m[i]) - else : - slist.append('unknown(' + str(i) + ')') -@@ -781,11 +786,9 @@ class signature(pgp_packet) : - if sp[0] == SIG_SUB_TYPE_SGNR_USER_ID : # signer's user id - return 'signer id: ' + sp[1] - if sp[0] == SIG_SUB_TYPE_REVOKE_REASON : # reason for revocation -- reas = '' -- if revoke_reason_to_str.has_key(sp[1]) : -- reas = revoke_reason_to_str[sp[1]] -+ reas = revoke_reason_to_str.get(sp[1], '') - return 'reason for revocation: %s, %s' % (reas, sp[2]) -- if sp[0] == SIG_SUB_TYPE_FEATURES : # featues -+ if sp[0] == SIG_SUB_TYPE_FEATURES : # features - features = [] - if len(sp) > 1 : - val = sp[1] -@@ -1073,7 +1076,7 @@ be scanned to make sure they are valid for a pgp certificate.""" - if pkt_idx >= len(pkts) : - raise ValueError('subkey at index %d was not followed by a signature' % (pkt_idx-1)) - if pkts[pkt_idx].pkt_typ != CTB_PKT_SIG or pkts[pkt_idx].sig_type != SIG_TYPE_SUBKEY_BIND : -- raise ValueError('signature %d doesn\'t bind subkey to key, type is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_typ))) -+ raise ValueError('signature %d doesn\'t bind subkey to key, type is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_typ))) - subkey.append(pkts[pkt_idx]) + #: ../yum/depsolve.py:1247 + #, python-format +@@ -2065,19 +2060,18 @@ msgid "No Groups Available in any repository" + msgstr "Inga grupper tillgängliga i något förråd" - pkt_idx = pkt_idx + 1 -@@ -1214,7 +1217,7 @@ a PGP "certificate" includes a public key, user id(s), and signature. - continue - - # are we at the checksum line? -- if l[0] == '=' : -+ if l and l[0] == '=' : - # get the checksum number - csum = base64.decodestring(l[1:5]) - i = 0 -diff --git a/yum/pkgtag_db.py b/yum/pkgtag_db.py -index d2836e4..016dd41 100644 ---- a/yum/pkgtag_db.py -+++ b/yum/pkgtag_db.py -@@ -17,7 +17,7 @@ + #: ../yum/__init__.py:730 +-#, fuzzy + msgid "Getting pkgtags metadata" +-msgstr "Hämtar gruppmetadata" ++msgstr "Hämtar pakettaggsmetadata" - # parse sqlite tag database - # return pkgnames and tag that was matched --from sqlutils import sqlite, executeSQL, sql_esc, sql_esc_glob -+from sqlutils import sqlite, executeSQL, sql_esc - from Errors import PkgTagsError - import sqlutils - import sys -@@ -82,7 +82,7 @@ class PackageTagDB(object): - """Search by package name/glob. - Return dict of dict[packagename] = [tag1, tag2, tag3, tag4, ...]""" - res = {} -- (name, esc) = sql_esc(tag) -+ (name, esc) = sql_esc(name) - query = "SELECT name, tag, score FROM packagetags where name like ?%s " % esc - name = '%' + name + '%' - rows = self._sql_exec(query, (name,)) -diff --git a/yum/repoMDObject.py b/yum/repoMDObject.py -index 0021d94..7a4593e 100755 ---- a/yum/repoMDObject.py -+++ b/yum/repoMDObject.py -@@ -23,7 +23,7 @@ from Errors import RepoMDError + #: ../yum/__init__.py:740 +-#, fuzzy, python-format ++#, python-format + msgid "Adding tags from repository: %s" +-msgstr "Lägger till gruppfil från förrådet: %s" ++msgstr "Lägger till taggar från förrådet: %s" - import sys - import types --from misc import AutoFileChecksums -+from misc import AutoFileChecksums, to_xml + #: ../yum/__init__.py:749 +-#, fuzzy, python-format ++#, python-format + msgid "Failed to add Pkg Tags for repository: %s - %s" +-msgstr "Kunde inte lägga till gruppfil för förrådet: %s - %s" ++msgstr "Kunde inte lägga till pakettaggar för förrådet: %s - %s" - def ns_cleanup(qn): - if qn.find('}') == -1: return qn -@@ -31,8 +31,10 @@ def ns_cleanup(qn): + #: ../yum/__init__.py:827 + msgid "Importing additional filelist information" +-- +1.7.0.1 + + +From e20d1b713d2261419705b01b28c5b5d24af01276 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 19 May 2010 15:02:35 -0400 +Subject: [PATCH 138] Make "blah in ipkg.yumdb_info" be quicker, and fail in more useful ways + +--- + yum/rpmsack.py | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index ef3343a..a0c65c8 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -1538,6 +1538,12 @@ class RPMDBAdditionalDataPackage(object): + else: + object.__delattr__(self, attr) - class RepoData: - """represents anything beneath a tag""" -- def __init__(self, elem): -- self.type = elem.attrib.get('type') -+ def __init__(self, elem=None): -+ self.type = None -+ if elem: -+ self.type = elem.attrib.get('type') - self.location = (None, None) - self.checksum = (None,None) # type,value - self.openchecksum = (None,None) # type,value -@@ -40,8 +42,9 @@ class RepoData: - self.dbversion = None - self.size = None - self.opensize = None -- -- self.parse(elem) ++ def __contains__(self, attr): ++ # This is faster than __iter__ and it makes things fail in a much more ++ # obvious way in weird FS corruption cases like: BZ 593436 ++ x = self.get(attr) ++ return x is not None + -+ if elem: -+ self.parse(elem) + def __iter__(self, show_hidden=False): + for item in self._read_cached_data: + yield item +-- +1.7.0.1 + + +From e313f5cdfae483bf70180955b534664e8de66328 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?G=C3=B6ran=20Uddeborg?= +Date: Fri, 21 May 2010 22:31:50 +0000 +Subject: [PATCH 139] l10n: Updates to Swedish (sv) translation + +New status: 569 messages complete with 0 fuzzies and 0 untranslated. + +Transmitted-via: Transifex (www.transifex.net). +--- + po/sv.po | 95 +++++++++++++++++++++----------------------------------------- + 1 files changed, 32 insertions(+), 63 deletions(-) + +diff --git a/po/sv.po b/po/sv.po +index f9302de..48b836b 100644 +--- a/po/sv.po ++++ b/po/sv.po +@@ -3,14 +3,14 @@ + # This file is distributed under the same license as the yum package. + # Göran Uddeborg , 2009-2010. + # +-# $Id: yum-HEAD.patch,v 1.59 2010/06/11 19:50:20 james Exp $ ++# $Id: yum-HEAD.patch,v 1.59 2010/06/11 19:50:20 james Exp $ + # + msgid "" + msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" + "POT-Creation-Date: 2010-02-11 10:54-0500\n" +-"PO-Revision-Date: 2010-05-19 22:57+0200\n" ++"PO-Revision-Date: 2010-05-22 00:30+0200\n" + "Last-Translator: Göran Uddeborg \n" + "Language-Team: Swedish \n" + "MIME-Version: 1.0\n" +@@ -1149,28 +1149,27 @@ msgid "--> Unresolved Dependency: %s" + msgstr "--> Ej upplöst beroende: %s" - def parse(self, elem): - -@@ -70,11 +73,47 @@ class RepoData: - self.size = child.text - elif child_name == 'open-size': - self.opensize = child.text -+ -+ def dump_xml(self): -+ msg = "" -+ top = """\n""" % to_xml(self.type, attrib=True) -+ msg += top -+ -+ for (data, xmlname) in [('checksum', 'checksum'),('openchecksum', 'open-checksum')]: -+ if hasattr(self, data): -+ val = getattr(self, data) -+ if val[0]: -+ d_xml = """ <%s type="%s">%s\n""" % (xmlname, -+ to_xml(val[0], attrib=True), -+ to_xml(val[1]), xmlname) -+ msg += d_xml -+ -+ if hasattr(self, 'location'): -+ val = getattr(self, 'location') -+ if val[1]: -+ loc = """ \n""" % to_xml(val[1], attrib=True) -+ if val[0]: -+ loc = """ \n""" % ( -+ to_xml(val[0], attrib=True), to_xml(val[1], attrib=True)) -+ msg += loc -+ -+ for (data,xmlname) in [('timestamp', 'timestamp'), -+ ('dbversion', 'database_version'), -+ ('size','size'), ('opensize', 'open-size')]: -+ val = getattr(self, data) -+ if val: -+ d_xml = """ <%s>%s\n""" % (xmlname, to_xml(val), -+ xmlname) -+ msg += d_xml -+ -+ bottom = """\n""" -+ msg += bottom -+ return msg - - class RepoMD: - """represents the repomd xml file""" - -- def __init__(self, repoid, srcfile): -+ def __init__(self, repoid, srcfile=None): - """takes a repoid and a filename for the repomd.xml""" - - self.timestamp = 0 -@@ -83,8 +122,12 @@ class RepoMD: - self.checksums = {} - self.length = 0 - self.revision = None -- self.tags = {'content' : set(), 'distro' : {}} -- -+ self.tags = {'content' : set(), 'distro' : {}, 'repo': set()} -+ -+ if srcfile: -+ self.parse(srcfile) -+ -+ def parse(self, srcfile): - if type(srcfile) in types.StringTypes: - # srcfile is a filename string - try: -@@ -168,6 +211,41 @@ class RepoMD: - print ' open checksum: %s - %s' % thisdata.openchecksum - print ' dbversion : %s' % thisdata.dbversion - print '' -+ def dump_xml(self): -+ msg = "" -+ -+ top = """ -+\n""" -+ msg += top -+ if self.revision: -+ rev = """ %s\n""" % to_xml(self.revision) -+ msg += rev -+ -+ if self.tags['content'] or self.tags['distro'] or self.tags['repo']: -+ tags = """ \n""" -+ for item in self.tags['content']: -+ tag = """ %s\n""" % (to_xml(item)) -+ tags += tag -+ for item in self.tags['repo']: -+ tag = """ %s\n""" % (to_xml(item)) -+ tags += tag -+ for (cpeid, item) in self.tags['distro'].items(): -+ itemlist = list(item) # frellingsets. -+ if cpeid: -+ tag = """ %s\n""" % ( -+ to_xml(cpeid, attrib=True), to_xml(itemlist[0])) -+ else: -+ tag = """ %s\n""" % (to_xml(itemlist[0])) -+ tags += tag -+ tags += """ \n""" -+ msg += tags -+ -+ for md in self.repoData.values(): -+ msg += md.dump_xml() -+ -+ msg += """\n""" -+ -+ return msg + #: ../output.py:1634 +-#, fuzzy, python-format ++#, python-format + msgid "Package: %s" +-msgstr "paket: %s" ++msgstr "Paket: %s" - def main(): + #: ../output.py:1636 +-#, fuzzy, python-format ++#, python-format + msgid "" + "\n" + " Requires: %s" +-msgstr "%s behöver: %s" ++msgstr "\n Behöver: %s" -diff --git a/yum/repos.py b/yum/repos.py -index cd477ba..7e9c417 100644 ---- a/yum/repos.py -+++ b/yum/repos.py -@@ -103,7 +103,7 @@ class RepoStorage: - self._cache_enabled_repos = None + #: ../output.py:1649 ../output.py:1660 +-#, fuzzy, python-format ++#, python-format + msgid "" + "\n" + " %s: %s (%s)" +-msgstr " %s från %s" ++msgstr "\n %s: %s (%s)" - def delete(self, repoid): -- if self.repos.has_key(repoid): -+ if repoid in self.repos: - thisrepo = self.repos[repoid] - thisrepo.close() - del self.repos[repoid] -diff --git a/yum/rpmsack.py b/yum/rpmsack.py -index 8289cd2..c0b53ba 100644 ---- a/yum/rpmsack.py -+++ b/yum/rpmsack.py -@@ -114,6 +114,23 @@ class RPMDBProblemDuplicate(RPMDBProblem): - return _("%s is a duplicate with %s") % (self.pkg, self.duplicate) + #: ../output.py:1657 +-#, fuzzy + msgid "Available" +-msgstr "Tillgängliga:" ++msgstr "Tillgängliga" + #: ../output.py:1665 ../output.py:1670 + #, python-format +@@ -1195,7 +1194,6 @@ msgid "Sleeping" + msgstr "Sover" -+class RPMDBProblemObsoleted(RPMDBProblem): -+ def __init__(self, pkg, **kwargs): -+ RPMDBProblem.__init__(self, pkg, "obsoleted", **kwargs) -+ -+ def __str__(self): -+ return _("%s is obsoleted by %s") % (self.pkg, self.obsoleter) -+ -+ -+class RPMDBProblemProvides(RPMDBProblem): -+ def __init__(self, pkg, **kwargs): -+ RPMDBProblem.__init__(self, pkg, "provides", **kwargs) -+ -+ def __str__(self): -+ return _("%s provides %s but it cannot be found") % (self.pkg, -+ self.provide) -+ -+ - class RPMDBPackageSack(PackageSackBase): - ''' - Represent rpmdb as a packagesack -@@ -142,16 +159,23 @@ class RPMDBPackageSack(PackageSackBase): - self.root = root - self._idx2pkg = {} - self._name2pkg = {} -+ self._pkgnames_loaded = set() - self._tup2pkg = {} - self._completely_loaded = False -+ self._pkgname_fails = set() -+ self._pkgmatch_fails = set() -+ self._provmatch_fails = set() - self._simple_pkgtup_list = [] - self._get_pro_cache = {} - self._get_req_cache = {} - self._loaded_gpg_keys = False - if cachedir is None: -- cachedir = misc.getCacheDir() -+ cachedir = persistdir + "/rpmdb-indexes" - self.setCacheDir(cachedir) -- self._persistdir = root + '/' + persistdir -+ if not os.path.normpath(persistdir).startswith(self.root): -+ self._persistdir = root + '/' + persistdir -+ else: -+ self._persistdir = persistdir - self._have_cached_rpmdbv_data = None - self._cached_conflicts_data = None - # Store the result of what happens, if a transaction completes. -@@ -161,6 +185,7 @@ class RPMDBPackageSack(PackageSackBase): - self.auto_close = False # this forces a self.ts.close() after - # most operations so it doesn't leave - # any lingering locks. -+ self._cached_rpmdb_mtime = None + #: ../utils.py:95 +-#, fuzzy + msgid "Uninterruptible" + msgstr "Oavbrytbar" - self._cache = { - 'provides' : { }, -@@ -187,8 +212,12 @@ class RPMDBPackageSack(PackageSackBase): - def dropCachedData(self): - self._idx2pkg = {} - self._name2pkg = {} -+ self._pkgnames_loaded = set() - self._tup2pkg = {} - self._completely_loaded = False -+ self._pkgmatch_fails = set() -+ self._pkgname_fails = set() -+ self._provmatch_fails = set() - self._simple_pkgtup_list = [] - self._get_pro_cache = {} - self._get_req_cache = {} -@@ -204,11 +233,16 @@ class RPMDBPackageSack(PackageSackBase): - } - self._have_cached_rpmdbv_data = None - self._cached_conflicts_data = None -+ self.transactionReset() # Should do nothing, but meh... -+ self._cached_rpmdb_mtime = None +@@ -1236,14 +1234,14 @@ msgid " State : %s, pid: %d" + msgstr " Status : %s, pid: %d" - def setCacheDir(self, cachedir): - """ Sets the internal cachedir value for the rpmdb, to be the -- "installed" directory from this parent. """ -- self._cachedir = self.root + '/' + cachedir + "/installed/" -+ "rpmdb-indexes" directory in the persisent yum storage. """ -+ if not os.path.normpath(cachedir).startswith(self.root): -+ self._cachedir = self.root + '/' + cachedir -+ else: -+ self._cachedir = '/' + cachedir + #: ../utils.py:199 +-#, fuzzy, python-format ++#, python-format + msgid "PluginExit Error: %s" +-msgstr "Konfigurationsfel: %s" ++msgstr "Insticksmodulsavslutsfel: %s" - def readOnlyTS(self): - if not self.ts: -@@ -241,14 +275,12 @@ class RPMDBPackageSack(PackageSackBase): - if hdr['name'] == 'gpg-pubkey': - continue - pkg = self._makePackageObject(hdr, mi.instance()) -- if not result.has_key(pkg.pkgid): -- result[pkg.pkgid] = pkg -+ result.setdefault(pkg.pkgid, pkg) - del mi + #: ../utils.py:202 +-#, fuzzy, python-format ++#, python-format + msgid "Yum Error: %s" +-msgstr "Fel: %s" ++msgstr "Yum-fel: %s" - fileresults = self.searchFiles(name) - for pkg in fileresults: -- if not result.has_key(pkg.pkgid): -- result[pkg.pkgid] = pkg -+ result.setdefault(pkg.pkgid, pkg) - - if self.auto_close: - self.ts.close() -@@ -266,8 +298,7 @@ class RPMDBPackageSack(PackageSackBase): - if hdr['name'] == 'gpg-pubkey': - continue - pkg = self._makePackageObject(hdr, mi.instance()) -- if not result.has_key(pkg.pkgid): -- result[pkg.pkgid] = pkg -+ result.setdefault(pkg.pkgid, pkg) - del mi + #: ../utils.py:235 ../yummain.py:42 + msgid "" +@@ -2116,17 +2114,15 @@ msgstr " %s från %s" - result = result.values() -@@ -299,8 +330,8 @@ class RPMDBPackageSack(PackageSackBase): - if not glob: - if po.checkPrco(prcotype, (n, f, (e,v,r))): - result[po.pkgid] = po -- else: -- result[po.pkgid] = po -+ else: -+ result[po.pkgid] = po - del mi + #: ../yum/__init__.py:1121 + msgid "Warning: RPMDB altered outside of yum." +-msgstr "" ++msgstr "Varning: RPMDB ändrad utanför yum." + #: ../yum/__init__.py:1126 +-#, fuzzy + msgid "missing requires" +-msgstr "%s behöver: %s" ++msgstr "saknade behov" -@@ -319,7 +350,12 @@ class RPMDBPackageSack(PackageSackBase): - return result + #: ../yum/__init__.py:1127 +-#, fuzzy + msgid "installed conflict" +-msgstr "installeras" ++msgstr "installerade konflikter" - def searchProvides(self, name): -- return self.searchPrco(name, 'provides') -+ if name in self._provmatch_fails: -+ return [] -+ ret = self.searchPrco(name, 'provides') -+ if not ret: -+ self._provmatch_fails.add(name) -+ return ret + #: ../yum/__init__.py:1180 + msgid "" +@@ -2170,13 +2166,12 @@ msgstr "Existerande lås %s: en annan kopia kör som pid %s." + #: ../yum/__init__.py:1425 + #, python-format + msgid "Could not create lock at %s: %s " +-msgstr "" ++msgstr "Kunde inte skapa lås av %s: %s " - def searchRequires(self, name): - return self.searchPrco(name, 'requires') -@@ -369,6 +405,7 @@ class RPMDBPackageSack(PackageSackBase): - for pat in patterns: - if not pat: - continue -+ - qpat = pat[0] - if qpat in ('?', '*'): - qpat = None -@@ -381,6 +418,7 @@ class RPMDBPackageSack(PackageSackBase): - return ret - @staticmethod - def _match_repattern(repatterns, hdr, ignore_case): -+ """ This is basically parsePackages() but for rpm hdr objects. """ - if repatterns is None: - return True + #: ../yum/__init__.py:1470 +-#, fuzzy + msgid "" + "Package does not match intended download. Suggestion: run yum clean metadata" +-msgstr "Paketet matchar inte avsedd det avsett att laddas ner" ++msgstr "Paketet matchar inte den avsedda hämtningen. Förslag: kör yum clean metadata" -@@ -417,6 +455,39 @@ class RPMDBPackageSack(PackageSackBase): - """Returns a list of packages. Note that the packages are - always filtered to those matching the patterns/case. repoid is - ignored, and is just here for compatibility with non-rpmdb sacks. """ -+ -+ # See if we can load the "patterns" via. dbMatch('name', ...) because -+ # that's basically instant and walking the entire rpmdb isn't. -+ if not self._completely_loaded and patterns and not ignore_case: -+ for pat in patterns: -+ if '?' in pat or '*' in pat: -+ break -+ else: -+ ret = [] -+ for pat in patterns: -+ # We aren't wasting anything here, because the next bit -+ # will pick up any loads :) -+ pkgs = self.searchNames([pat]) -+ if not pkgs: -+ break -+ ret.extend(pkgs) -+ else: -+ return ret -+ -+ ret = [] -+ if patterns and not ignore_case: -+ tpats = [] -+ for pat in patterns: -+ if pat in self._pkgmatch_fails: -+ continue -+ if pat in self._pkgnames_loaded: -+ ret.extend(self._name2pkg[pat]) -+ continue -+ tpats.append(pat) -+ patterns = tpats -+ if not patterns: -+ return ret -+ - if not self._completely_loaded: - rpats = self._compile_patterns(patterns, ignore_case) - for hdr, idx in self._all_packages(): -@@ -430,7 +501,15 @@ class RPMDBPackageSack(PackageSackBase): - pkgobjlist = [pkg for pkg in pkgobjlist if pkg.name != 'gpg-pubkey'] - if patterns: - pkgobjlist = parsePackages(pkgobjlist, patterns, not ignore_case) -- pkgobjlist = pkgobjlist[0] + pkgobjlist[1] -+ self._pkgmatch_fails.update(pkgobjlist[2]) -+ if ret: -+ pkgobjlist = pkgobjlist[0] + pkgobjlist[1] + ret -+ else: -+ pkgobjlist = pkgobjlist[0] + pkgobjlist[1] -+ for pkg in pkgobjlist: -+ for pat in patterns: -+ if pkg.name == pat: -+ self._pkgnames_loaded.add(pkg.name) - return pkgobjlist + #: ../yum/__init__.py:1486 + msgid "Could not perform checksum" +@@ -2339,9 +2334,9 @@ msgid "Package tuple %s could not be found in packagesack" + msgstr "Pakettupel %s fanns inte i paketsäcken" - def _uncached_returnConflictPackages(self): -@@ -460,6 +539,27 @@ class RPMDBPackageSack(PackageSackBase): - rpmdbv = self.simpleVersion(main_only=True)[0] - self._write_conflicts_new(pkgs, rpmdbv) + #: ../yum/__init__.py:2558 +-#, fuzzy, python-format ++#, python-format + msgid "Package tuple %s could not be found in rpmdb" +-msgstr "Pakettupel %s fanns inte i paketsäcken" ++msgstr "Pakettupel %s fanns inte i rpmdb" -+ def _deal_with_bad_rpmdbcache(self, caller): -+ """ This shouldn't be called, but people are hitting weird stuff so -+ we want to deal with it so it doesn't stay broken "forever". """ -+ misc.unlink_f(self._cachedir + "/version") -+ misc.unlink_f(self._cachedir + '/conflicts') -+ misc.unlink_f(self._cachedir + '/file-requires') -+ misc.unlink_f(self._cachedir + '/yumdb-package-checksums') -+ # We have a couple of options here, we can: -+ # -+ # . Ignore it and continue - least invasive, least likely to get any -+ # bugs fixed. -+ # -+ # . Ignore it and continue, when not in debug mode - Helps users doing -+ # weird things (and we won't know), but normal bugs will be seen by -+ # anyone not running directly from a package. -+ # -+ # . Always throw - but at least it shouldn't happen again. -+ # -+ if __debug__: -+ raise Errors.PackageSackError, 'Rpmdb checksum is invalid: %s' % caller + #: ../yum/__init__.py:2614 ../yum/__init__.py:2664 + msgid "Invalid version flag" +@@ -2516,14 +2511,14 @@ msgid "No Match for available package: %s" + msgstr "Ingen matchning för tillgängliga paket: %s" + + #: ../yum/__init__.py:3738 +-#, fuzzy, python-format ++#, python-format + msgid "Only Upgrade available on package: %s" +-msgstr "Endast uppdatering tillgängliga för paket: %s" ++msgstr "Endast uppgradering tillgängliga för paket: %s" + + #: ../yum/__init__.py:3808 ../yum/__init__.py:3845 +-#, fuzzy, python-format ++#, python-format + msgid "Failed to downgrade: %s" +-msgstr "Paket att nedgradera" ++msgstr "Misslyckades nedgradera: %s" + + #: ../yum/__init__.py:3877 + #, python-format +@@ -2535,9 +2530,9 @@ msgid "GPG key retrieval failed: " + msgstr "Hämtandet av GPG-nyckeln misslyckades: " + + #: ../yum/__init__.py:3903 +-#, fuzzy, python-format ++#, python-format + msgid "Invalid GPG Key from %s: %s" +-msgstr "Hämtar GPG-nyckel från %s" ++msgstr "Ogiltig GPG-nyckel från %s: %s" + + #: ../yum/__init__.py:3912 + #, python-format +@@ -2615,9 +2610,9 @@ msgid "Test Transaction Errors: " + msgstr "Transaktionstestfel: " + + #: ../yum/__init__.py:4334 +-#, fuzzy, python-format ++#, python-format + msgid "Could not set cachedir: %s" +-msgstr "Kunde inte utföra kontrollsummering" ++msgstr "Kunde inte sätta cache-katalog: %s" + + #. Mostly copied from YumOutput._outKeyValFill() + #: ../yum/plugins.py:202 +@@ -2681,17 +2676,16 @@ msgstr "registrering av kommandon stöds inte" + + #: ../yum/rpmsack.py:102 + msgid "has missing requires of" +-msgstr "" ++msgstr "har ett saknat beroende på" + + #: ../yum/rpmsack.py:105 +-#, fuzzy + msgid "has installed conflicts" +-msgstr "ange installationsrot" ++msgstr "har installerad konflikt" + + #: ../yum/rpmsack.py:114 +-#, fuzzy, python-format ++#, python-format + msgid "%s is a duplicate with %s" +-msgstr "Noterar %s som en uppdatering av %s" ++msgstr "%s är en dubblett med %s" + + #: ../yum/rpmtrans.py:79 + msgid "Repackaging" +@@ -2726,28 +2720,3 @@ msgstr "Trasigt huvud %s" + #, python-format + msgid "Error opening rpm %s - error %s" + msgstr "Fel när rpm %s öppnades - fel %s" +- +-#~ msgid "Finished Transaction Test" +-#~ msgstr "Avslutade transaktionstest" +- +-#~ msgid "" +-#~ " You could try running: package-cleanup --problems\n" +-#~ " package-cleanup --dupes\n" +-#~ " rpm -Va --nofiles --nodigest" +-#~ msgstr "" +-#~ " Du kan försöka köra: package-cleanup --problems\n" +-#~ " package-cleanup --dupes\n" +-#~ " rpm -Va --nofiles --nodigest" +- +-#~ msgid "Unresolvable requirement %s for %s" +-#~ msgstr "Ej upplösbart behov %s för %s" +- +-#~ msgid "Missing Dependency: %s is needed by package %s" +-#~ msgstr "Saknat beroende: %s behövs av paketet %s" +- +-#~ msgid "" +-#~ "getInstalledPackageObject() will go away, use self.rpmdb.searchPkgTuple" +-#~ "().\n" +-#~ msgstr "" +-#~ "getInstalledPackageObject() kommer att försvinna, använd self.rpmdb." +-#~ "searchPkgTuple().\n" +-- +1.7.0.1 + + +From 718c84edfcd7c9b46007388f1f4435e51b3d8ba8 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 20 May 2010 16:31:09 -0400 +Subject: [PATCH 140] Fix adding pkgExcluders after a package has been loaded. versionlock, at least + +--- + yum/sqlitesack.py | 9 +++++++++ + 1 files changed, 9 insertions(+), 0 deletions(-) + +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 84607c6..92b98ce 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -710,9 +710,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + if excluderid is not None: + self._pkgExcludeIds[excluderid] = len(self._pkgExcluder) + ++ self._exclude_whitelist = set() ++ self._pkgobjlist_dirty = True + - def _read_conflicts(self): - if not self.__cache_rpmdb__: - return None -@@ -492,6 +592,7 @@ class RPMDBPackageSack(PackageSackBase): - if fo.readline() != '': # Should be EOF - return None - except ValueError: -+ self._deal_with_bad_rpmdbcache("conflicts") + def _packageByKey(self, repo, pkgKey, exclude=True): + """ Lookup a pkg by it's pkgKey, if we don't have it load it """ + # Speed hack, so we don't load the pkg. if the pkgKey is dead. ++ assert exclude + if exclude and self._pkgKeyExcluded(repo, pkgKey): return None - self._cached_conflicts_data = ret -@@ -605,6 +706,7 @@ class RPMDBPackageSack(PackageSackBase): - if fo.readline() != '': # Should be EOF - return None, None - except ValueError: -+ self._deal_with_bad_rpmdbcache("file requires") - return None, None - - return iFR, iFP -@@ -742,11 +844,16 @@ class RPMDBPackageSack(PackageSackBase): - if fo.readline() != '': # Should be EOF - return - except ValueError: -+ self._deal_with_bad_rpmdbcache("pkg checksums") - return +@@ -733,10 +737,14 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + self._pkgtup2pkgs.setdefault(po.pkgtup, []).append(po) + pkgkeys = self._pkgname2pkgkeys[repo].setdefault(data['name'], []) + pkgkeys.append(pkgKey) ++ elif exclude and self._pkgExcluded(self._key2pkg[repo][pkgKey]): ++ self._delPackageRK(repo, pkgKey) ++ return None + return self._key2pkg[repo][pkgKey] + + def _packageByKeyData(self, repo, pkgKey, data, exclude=True): + """ Like _packageByKey() but we already have the data for .pc() """ ++ assert exclude + if exclude and self._pkgExcludedRKD(repo, pkgKey, data): + return None + if repo not in self._key2pkg: +@@ -1622,6 +1630,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - for pkgtup in checksum_data: - (n, a, e, v, r) = pkgtup -- pkg = self.searchNevra(n, e, v, r, a)[0] -+ pkg = self.searchNevra(n, e, v, r, a) -+ if not pkg: -+ self._deal_with_bad_rpmdbcache("pkg checksums") -+ continue -+ pkg = pkg[0] - (T, D) = checksum_data[pkgtup] - if ('checksum_type' in pkg.yumdb_info._read_cached_data or - 'checksum_data' in pkg.yumdb_info._read_cached_data): -@@ -806,6 +913,19 @@ class RPMDBPackageSack(PackageSackBase): - if not self.__cache_rpmdb__: - return + for (repo, x) in self._yieldSQLDataList(repoid, patterns, fields, + ignore_case): ++ # Can't use: _sql_pkgKey2po because we change repos. + po = self._packageByKeyData(repo, x['pkgKey'], x) + if po is None: + continue +-- +1.7.0.1 + + +From c3d3cc73ef8145d840b0b3d82f8dc3a5618bb582 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 21 May 2010 11:42:07 -0400 +Subject: [PATCH 141] Dump False and 0 as their values, and not the empty string. + +--- + yum/config.py | 2 +- + yum/yumRepo.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/yum/config.py b/yum/config.py +index 3610b91..949751a 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -752,7 +752,7 @@ class YumConf(StartupConf): + if isinstance(getattr(self, attr), types.MethodType): + continue + res = getattr(self, attr) +- if not res: ++ if not res and type(res) not in (type(False), type(0)): + res = '' + if type(res) == types.ListType: + res = ',\n '.join(res) +diff --git a/yum/yumRepo.py b/yum/yumRepo.py +index 7c3a4d7..3a695d8 100644 +--- a/yum/yumRepo.py ++++ b/yum/yumRepo.py +@@ -385,7 +385,7 @@ class YumRepository(Repository, config.RepoConf): + if isinstance(getattr(self, attr), types.MethodType): + continue + res = getattr(self, attr) +- if not res: ++ if not res and type(res) not in (type(False), type(0)): + res = '' + if type(res) == types.ListType: + res = ',\n '.join(res) +-- +1.7.0.1 + + +From de891005978c2923c8bd7c5c8a5decc421bd0e4a Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 21 May 2010 12:40:41 -0400 +Subject: [PATCH 142] Add --setopt to YumUtilBase commands. + +--- + utils.py | 13 +++++++++++++ + 1 files changed, 13 insertions(+), 0 deletions(-) + +diff --git a/utils.py b/utils.py +index 0445b88..1bb4569 100644 +--- a/utils.py ++++ b/utils.py +@@ -166,6 +166,14 @@ class YumUtilBase(YumBaseCli): + def doUtilConfigSetup(self,args = sys.argv[1:],pluginsTypes=(plugins.TYPE_CORE,)): + # Parse only command line options that affect basic yum setup + opts = self._parser.firstParse(args) ++ ++ # go through all the setopts and set the global ones ++ self._parseSetOpts(opts.setopts) ++ ++ if self.main_setopts: ++ for opt in self.main_setopts.items: ++ setattr(opts, opt, getattr(self.main_setopts, opt)) ++ + # Just print out the version if that's what the user wanted + if opts.version: + self._printUtilVersion() +@@ -193,6 +201,11 @@ class YumUtilBase(YumBaseCli): + pc.enabled_plugins = self._parser._splitArg(opts.enableplugins) + self.conf -+ if self._cached_rpmdb_mtime is None: -+ return # We haven't loaded any packages!!! ++ # now set all the non-first-start opts from main from our setopts ++ if self.main_setopts: ++ for opt in self.main_setopts.items: ++ setattr(self.conf, opt, getattr(self.main_setopts, opt)) + -+ rpmdbfname = self.root + "/var/lib/rpm/Packages" -+ if not os.path.exists(rpmdbfname): -+ return # haha + except Errors.ConfigError, e: + self.logger.critical(_('Config Error: %s'), e) + sys.exit(1) +-- +1.7.0.1 + + +From d75aed77b1bb5c866d564b99116d84561cb09ee1 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 21 May 2010 10:37:48 -0400 +Subject: [PATCH 143] Fix blank line at end of all scriptlet output. + +--- + yum/history.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/history.py b/yum/history.py +index d5a167e..bfb0b45 100644 +--- a/yum/history.py ++++ b/yum/history.py +@@ -507,7 +507,7 @@ class YumHistory: + cur = self._get_cursor() + if cur is None: + return # Should never happen, due to above +- for error in msg.split('\n'): ++ for error in msg.splitlines(): + error = to_unicode(error) + executeSQL(cur, + """INSERT INTO trans_script_stdout +-- +1.7.0.1 + + +From fa9a82967408b0789564a6be9cc19ea09e0e98f0 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 27 May 2010 12:01:05 -0400 +Subject: [PATCH 144] - cleanup decompress some + - keep stub bunzipFile + - add lzma support, if available + +--- + yum/misc.py | 76 +++++++++++++++++++++++++++++++++++++++++++--------------- + 1 files changed, 56 insertions(+), 20 deletions(-) + +diff --git a/yum/misc.py b/yum/misc.py +index ebce8e1..92e9127 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -19,6 +19,13 @@ import pwd + import fnmatch + import bz2 + import gzip ++_available_compression = ['gz', 'bz2'] ++try: ++ import lzma ++ _available_compression.append('xz') ++except ImportError: ++ lzma = None + -+ _cached_rpmdb_mtime = os.path.getmtime(rpmdbfname) -+ if self._cached_rpmdb_mtime != _cached_rpmdb_mtime: -+ # Something altered the rpmdb since we loaded our first package, -+ # so don't save the rpmdb version as who knows what happened. -+ return + from rpmUtils.miscutils import stringToVersion, flagToString + from stat import * + try: +@@ -675,10 +682,22 @@ def refineSearchPattern(arg): + restring = re.escape(arg) + + return restring + - rpmdbvfname = self._cachedir + "/version" - if not os.access(self._cachedir, os.W_OK): - if os.path.exists(self._cachedir): -@@ -953,6 +1073,9 @@ class RPMDBPackageSack(PackageSackBase): ++ ++def _decompress_chunked(source, dest, ztype): ++ ++ if ztype not in _available_compression: ++ msg = "%s compression not available" % ztype ++ raise Errors.MiscError, msg ++ ++ if ztype == 'bz2': ++ s_fn = bz2.BZ2File(source, 'r') ++ elif ztype == 'xz': ++ s_fn = lzma.LZMAFile(source, 'r') ++ elif ztype == 'gz': ++ s_fn = gzip.GzipFile(source, 'r') ++ + +-def bunzipFile(source,dest): +- """ Extract the bzipped contents of source to dest. """ +- s_fn = bz2.BZ2File(source, 'r') + destination = open(dest, 'w') - def _search(self, name=None, epoch=None, ver=None, rel=None, arch=None): - '''List of matching packages, to zero or more of NEVRA.''' -+ if name is not None and name in self._pkgname_fails: -+ return [] + while True: +@@ -697,7 +716,11 @@ def bunzipFile(source,dest): + + destination.close() + s_fn.close() +- ++ ++def bunzipFile(source,dest): ++ """ Extract the bzipped contents of source to dest. """ ++ _decompress_chunked(source, dest, ztype='bz2') ++ + def get_running_kernel_pkgtup(ts): + """This takes the output of uname and figures out the pkgtup of the running + kernel (name, arch, epoch, version, release).""" +@@ -982,29 +1005,42 @@ def get_uuid(savepath): + + return myid + +-def decompress(filename): ++def decompress(filename, dest=None): + """take a filename and decompress it into the same relative location. + if the file is not compressed just return the file""" +- out = filename ++ ++ out = dest ++ if not dest: ++ out = filename ++ + if filename.endswith('.gz'): +- out = filename.replace('.gz', '') +- decom = gzip.open(filename) +- fo = open(out, 'w') +- fo.write(decom.read()) +- fo.flush() +- fo.close() +- decom.close() +- elif filename.endswith('.bz') or filename.endswith('.bz2'): +- if filename.endswith('.bz'): +- out = filename.replace('.bz','') +- else: +- out = filename.replace('.bz2', '') +- bunzipFile(filename, out) ++ ztype='gz' ++ if not dest: ++ out = filename.replace('.gz', '') + +- #add magical lzma/xz trick here ++ elif filename.endswith('.bz') or filename.endswith('.bz2'): ++ ztype='bz2' ++ if not dest: ++ if filename.endswith('.bz'): ++ out = filename.replace('.bz','') ++ else: ++ out = filename.replace('.bz2', '') ++ ++ elif filename.endswith('.xz'): ++ ztype='xz' ++ if not dest: ++ out = filename.replace('.xz', '') ++ ++ else: ++ out = filename # returning the same file since it is not compressed ++ ztype = None + ++ if ztype: ++ _decompress_chunked(filename, out, ztype) ++ + return out + ++ + def read_in_items_from_dot_dir(thisglob, line_as_list=True): + """takes a glob of a dir (like /etc/foo.d/*.foo) + returns a list of all the lines in all the files matching +-- +1.7.0.1 + + +From 0612a88cd98ff59eab52a816099c0abaf78d9764 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 27 May 2010 13:16:06 -0400 +Subject: [PATCH 145] - go through all of our code and change our decompressors to use misc.decompress() + - this should mean we can access metadata compressed using any supported compression library + provided it is NAMED accordingly + - add fn_only option to misc.decompress() so we can get a returned name w/o actually + having the file - useful for finding a decompressed file if we only have the compressed one + +--- + yum/__init__.py | 8 ++++---- + yum/misc.py | 4 ++-- + yum/update_md.py | 10 ++++++---- + yum/yumRepo.py | 27 +++++++++++++-------------- + 4 files changed, 25 insertions(+), 24 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 8a2fbf4..1c398fd 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -30,7 +30,7 @@ import fnmatch + import logging + import logging.config + import operator +-import gzip + - pkgtup = (name, arch, epoch, ver, rel) - if pkgtup in self._tup2pkg: - return [self._tup2pkg[pkgtup]] -@@ -960,9 +1083,11 @@ class RPMDBPackageSack(PackageSackBase): - loc = locals() - ret = [] -- if self._completely_loaded: -+ if self._completely_loaded or name in self._pkgnames_loaded: - if name is not None: - pkgs = self._name2pkg.get(name, []) -+ if not pkgs: -+ self._pkgname_fails.add(name) - else: - pkgs = self.returnPkgs() - for po in pkgs: -@@ -982,10 +1107,16 @@ class RPMDBPackageSack(PackageSackBase): - mi = ts.dbMatch() - self._completely_loaded = True + import yum.i18n + _ = yum.i18n._ +@@ -716,9 +716,9 @@ class YumBase(depsolve.Depsolve): + self.verbose_logger.log(logginglevels.DEBUG_4, + _('Adding group file from repository: %s'), repo) + groupfile = repo.getGroups() +- # open it up as a file object so iterparse can cope with our gz file +- if groupfile is not None and groupfile.endswith('.gz'): +- groupfile = gzip.open(groupfile) ++ # open it up as a file object so iterparse can cope with our compressed file ++ if groupfile: ++ groupfile = misc.decompress(groupfile) + + try: + self._comps.add(groupfile) +diff --git a/yum/misc.py b/yum/misc.py +index 92e9127..7793807 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -1005,7 +1005,7 @@ def get_uuid(savepath): + + return myid + +-def decompress(filename, dest=None): ++def decompress(filename, dest=None, fn_only=False): + """take a filename and decompress it into the same relative location. + if the file is not compressed just return the file""" + +@@ -1035,7 +1035,7 @@ def decompress(filename, dest=None): + out = filename # returning the same file since it is not compressed + ztype = None + +- if ztype: ++ if ztype and not fn_only: + _decompress_chunked(filename, out, ztype) + + return out +diff --git a/yum/update_md.py b/yum/update_md.py +index 90c5582..cf8136a 100644 +--- a/yum/update_md.py ++++ b/yum/update_md.py +@@ -22,12 +22,11 @@ Update metadata (updateinfo.xml) parsing. + """ -+ done = False - for hdr in mi: - if hdr['name'] == 'gpg-pubkey': - continue - po = self._makePackageObject(hdr, mi.instance()) -+ # We create POs out of all matching names, even if we don't return -+ # them. -+ self._pkgnames_loaded.add(po.name) -+ done = True -+ - for tag in ('arch', 'rel', 'ver', 'epoch'): - if loc[tag] is not None and loc[tag] != getattr(po, tag): - break -@@ -995,6 +1126,9 @@ class RPMDBPackageSack(PackageSackBase): - if self.auto_close: - self.ts.close() + import sys +-import gzip -+ if not done and name is not None: -+ self._pkgname_fails.add(name) -+ - return ret + from yum.i18n import utf8_text_wrap, to_utf8 + from yum.yumRepo import YumRepository + from yum.packages import FakeRepository +-from yum.misc import to_xml ++from yum.misc import to_xml, decompress + import Errors - def _makePackageObject(self, hdr, index): -@@ -1004,6 +1138,10 @@ class RPMDBPackageSack(PackageSackBase): - self._idx2pkg[index] = po - self._name2pkg.setdefault(po.name, []).append(po) - self._tup2pkg[po.pkgtup] = po -+ if self.__cache_rpmdb__ and self._cached_rpmdb_mtime is None: -+ rpmdbfname = self.root + "/var/lib/rpm/Packages" -+ self._cached_rpmdb_mtime = os.path.getmtime(rpmdbfname) + import rpmUtils.miscutils +@@ -382,14 +381,17 @@ class UpdateMetadata(object): + if not obj: + raise UpdateNoticeException + if type(obj) in (type(''), type(u'')): +- infile = obj.endswith('.gz') and gzip.open(obj) or open(obj, 'rt') ++ unfile = decompress(obj) ++ infile = open(unfile, 'rt') + - return po - - def _hdr2pkgTuple(self, hdr): -@@ -1249,6 +1387,30 @@ class RPMDBPackageSack(PackageSackBase): - problems.append(RPMDBProblemDuplicate(pkg, duplicate=last)) - return problems + elif isinstance(obj, YumRepository): + if obj.id not in self._repos: + self._repos.append(obj.id) + md = obj.retrieveMD(mdtype) + if not md: + raise UpdateNoticeException() +- infile = gzip.open(md) ++ unfile = decompress(md) ++ infile = open(unfile, 'rt') + elif isinstance(obj, FakeRepository): + raise Errors.RepoMDError, "No updateinfo for local pkg" + else: # obj is a file object +diff --git a/yum/yumRepo.py b/yum/yumRepo.py +index 3a695d8..ac6c7c0 100644 +--- a/yum/yumRepo.py ++++ b/yum/yumRepo.py +@@ -19,7 +19,6 @@ import time + import types + import urlparse + urlparse.uses_fragment.append("media") +-import gzip -+ def check_obsoleted(self): -+ """ Checks for any packages which are obsoleted by other packages. """ -+ obsoleters = [] -+ problems = [] -+ for pkg in sorted(self.returnPackages()): -+ if not pkg.obsoletes: -+ continue -+ obsoleters.append(pkg) -+ for pkg in sorted(self.returnPackages()): -+ for obspo in pkg.obsoletedBy(obsoleters): -+ problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo)) -+ return problems -+ -+ def check_provides(self): -+ """ For each package, check that a provides search for it's name (and -+ everything it provides) finds it. """ -+ problems = [] -+ for pkg in sorted(self.returnPackages()): -+ for provtup in pkg.provides: -+ name, flags, version = provtup -+ if pkg not in self.getProvides(name, flags, version): -+ problems.append(RPMDBProblemProvides(pkg, provide=provtup)) -+ break -+ return problems + import Errors + from urlgrabber.grabber import URLGrabber +@@ -163,7 +162,7 @@ class YumPackageSack(packageSack.PackageSack): - def _sanitize(path): - return path.replace('/', '').replace('~', '') -@@ -1380,7 +1542,7 @@ class RPMDBAdditionalDataPackage(object): - try: - os.unlink(fn) - except (IOError, OSError): -- raise AttributeError, "Cannot delete attribute %s on " % (attr, self) -+ raise AttributeError, "Cannot delete attribute %s on %s " % (attr, self) - - def __getattr__(self, attr): - return self._read(attr) -@@ -1397,6 +1559,12 @@ class RPMDBAdditionalDataPackage(object): - else: - object.__delattr__(self, attr) + if self._check_db_version(repo, mydbtype): + # see if we have the uncompressed db and check it's checksum vs the openchecksum +- # if not download the bz2 file ++ # if not download the compressed file + # decompress it + # unlink it -+ def __contains__(self, attr): -+ # This is faster than __iter__ and it makes things fail in a much more -+ # obvious way in weird FS corruption cases like: BZ 593436 -+ x = self.get(attr) -+ return x is not None -+ - def __iter__(self, show_hidden=False): - for item in self._read_cached_data: - yield item -diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py -index 1d6c764..92b98ce 100644 ---- a/yum/sqlitesack.py -+++ b/yum/sqlitesack.py -@@ -259,9 +259,7 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): - if varname.startswith('__') and varname.endswith('__'): - raise AttributeError, varname - -- dbname = varname -- if db2simplemap.has_key(varname): -- dbname = db2simplemap[varname] -+ dbname = db2simplemap.get(varname, varname) - try: - r = self._sql_MD('primary', - "SELECT %s FROM packages WHERE pkgId = ?" % dbname, -@@ -353,6 +351,8 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): - return self._changelog - - def returnFileEntries(self, ftype='file', primary_only=False): -+ """return list of files based on type, you can pass primary_only=True -+ to limit to those files in the primary repodata""" - if primary_only and not self._loadedfiles: - sql = "SELECT name as fname FROM files WHERE pkgKey = ? and type = ?" - cur = self._sql_MD('primary', sql, (self.pkgKey, ftype)) -@@ -361,7 +361,14 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): - self._loadFiles() - return RpmBase.returnFileEntries(self,ftype,primary_only) - -- def returnFileTypes(self): -+ def returnFileTypes(self, primary_only=False): -+ """return list of types of files in the package, you can pass -+ primary_only=True to limit to those files in the primary repodata""" -+ if primary_only and not self._loadedfiles: -+ sql = "SELECT DISTINCT type as ftype FROM files WHERE pkgKey = ?" -+ cur = self._sql_MD('primary', sql, (self.pkgKey,)) -+ return map(lambda x: x['ftype'], cur) -+ - self._loadFiles() - return RpmBase.returnFileTypes(self) +@@ -171,9 +170,8 @@ class YumPackageSack(packageSack.PackageSack): + if not db_un_fn: + db_fn = repo._retrieveMD(mydbtype) + if db_fn: +- db_un_fn = db_fn.replace('.bz2', '') + if not repo.cache: +- misc.bunzipFile(db_fn, db_un_fn) ++ db_un_fn = misc.decompress(db_fn) + misc.unlink_f(db_fn) + db_un_fn = self._check_uncompressed_db(repo, mydbtype) -@@ -381,6 +388,8 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase): - cur = self._sql_MD('primary', sql, (self.pkgKey,)) - self.prco[prcotype] = [ ] - for ob in cur: -+ if not ob['name']: -+ continue - prco_set = (_share_data(ob['name']), _share_data(ob['flags']), - (_share_data(ob['epoch']), - _share_data(ob['version']), -@@ -428,6 +437,8 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - self._pkgname2pkgkeys = {} - self._pkgtup2pkgs = {} - self._pkgnames_loaded = set() -+ self._pkgmatch_fails = set() -+ self._provmatch_fails = set() - self._arch_allowed = None - self._pkgExcluder = [] - self._pkgExcludeIds = {} -@@ -491,6 +502,8 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - self._key2pkg = {} - self._pkgname2pkgkeys = {} - self._pkgnames_loaded = set() -+ self._pkgmatch_fails = set() -+ self._provmatch_fails = set() - self._pkgtup2pkgs = {} - self._search_cache = { - 'provides' : { }, -@@ -543,7 +556,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - # Because we don't want to remove a package from the database we just - # add it to the exclude list - def delPackage(self, obj): -- if not self.excludes.has_key(obj.repo): -+ if obj.repo not in self.excludes: - self.excludes[obj.repo] = {} - self.excludes[obj.repo][obj.pkgId] = 1 - if (obj.repo, obj.pkgKey) in self._exclude_whitelist: -@@ -697,9 +710,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - if excluderid is not None: - self._pkgExcludeIds[excluderid] = len(self._pkgExcluder) +@@ -199,8 +197,8 @@ class YumPackageSack(packageSack.PackageSack): + mydbdata = repo.repoXML.getData(mdtype) + (r_base, remote) = mydbdata.location + fname = os.path.basename(remote) +- bz2_fn = repo.cachedir + '/' + fname +- db_un_fn = bz2_fn.replace('.bz2', '') ++ compressed_fn = repo.cachedir + '/' + fname ++ db_un_fn = misc.decompress(compressed_fn, fn_only=True) -+ self._exclude_whitelist = set() -+ self._pkgobjlist_dirty = True -+ - def _packageByKey(self, repo, pkgKey, exclude=True): - """ Lookup a pkg by it's pkgKey, if we don't have it load it """ - # Speed hack, so we don't load the pkg. if the pkgKey is dead. -+ assert exclude - if exclude and self._pkgKeyExcluded(repo, pkgKey): - return None + result = None -@@ -720,10 +737,14 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - self._pkgtup2pkgs.setdefault(po.pkgtup, []).append(po) - pkgkeys = self._pkgname2pkgkeys[repo].setdefault(data['name'], []) - pkgkeys.append(pkgKey) -+ elif exclude and self._pkgExcluded(self._key2pkg[repo][pkgKey]): -+ self._delPackageRK(repo, pkgKey) -+ return None - return self._key2pkg[repo][pkgKey] - - def _packageByKeyData(self, repo, pkgKey, data, exclude=True): - """ Like _packageByKey() but we already have the data for .pc() """ -+ assert exclude - if exclude and self._pkgExcludedRKD(repo, pkgKey, data): - return None - if repo not in self._key2pkg: -@@ -767,13 +788,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - return ret +@@ -1089,7 +1087,7 @@ class YumRepository(Repository, config.RepoConf): + local = self.cachedir + '/' + os.path.basename(remote) - def addDict(self, repo, datatype, dataobj, callback=None): -- if self.added.has_key(repo): -+ if repo in self.added: - if datatype in self.added[repo]: - return - else: - self.added[repo] = [] + if compressed: # DB file, we need the uncompressed version +- local = local.replace('.bz2', '') ++ local = misc.decompress(local, fn_only=True) + return local -- if not self.excludes.has_key(repo): -+ if repo not in self.excludes: - self.excludes[repo] = {} + def _groupCheckDataMDNewer(self): +@@ -1244,7 +1242,7 @@ class YumRepository(Repository, config.RepoConf): + compressed = False + local = self._get_mdtype_fname(data, False) + if not os.path.exists(local): +- local = local.replace('.bz2', '') ++ local = misc.decompress(local, fn_only=True) + compressed = True + # If we can, make a copy of the system-wide-cache version of this file, + # note that we often don't get here. So we also do this in +@@ -1351,10 +1349,9 @@ class YumRepository(Repository, config.RepoConf): - if dataobj is None: -@@ -838,6 +859,32 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - return misc.unique(results) - - @catchSqliteException -+ def _have_fastReturnFileEntries(self): -+ """ Return true if pkg.returnFileEntries(primary_only=True) is fast. -+ basically does "CREATE INDEX pkgfiles ON files (pkgKey);" exist. """ -+ -+ for (rep,cache) in self.primarydb.items(): -+ if rep in self._all_excludes: -+ continue -+ cur = cache.cursor() -+ executeSQL(cur, "PRAGMA index_info(pkgfiles)") -+ # If we get anything, we're fine. There might be a better way of -+ # saying "anything" but this works. -+ for ob in cur: -+ break -+ else: -+ return False -+ -+ return True -+ -+ def have_fastReturnFileEntries(self): -+ """ Is calling pkg.returnFileEntries(primary_only=True) faster than -+ using searchFiles(). """ -+ if not hasattr(self, '_cached_fRFE'): -+ self._cached_fRFE = self._have_fastReturnFileEntries() -+ return self._cached_fRFE -+ -+ @catchSqliteException - def searchFiles(self, name, strict=False): - """search primary if file will be in there, if not, search filelists, use globs, if possible""" - -@@ -1194,7 +1241,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - return result + for (ndata, nmdtype) in downloading_with_size + downloading_no_size: + local = self._get_mdtype_fname(ndata, False) +- if nmdtype.endswith("_db"): # Uncompress any .sqlite.bz2 files ++ if nmdtype.endswith("_db"): # Uncompress any compressed files + dl_local = local +- local = local.replace('.bz2', '') +- misc.bunzipFile(dl_local, local) ++ local = misc.decompress(dl_local) + misc.unlink_f(dl_local) + self._oldRepoMDData['new_MD_files'].append(local) - if not misc.re_primary_filename(name): -- # if its not in the primary.xml files -+ # If it is not in the primary.xml files - # search the files.xml file info - for pkg in self.searchFiles(name, strict=True): - result[pkg] = [(name, None, None)] -@@ -1228,6 +1275,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - user_names = set(names) - names = [] - for pkgname in user_names: -+ if pkgname in self._pkgmatch_fails: -+ continue -+ - if loaded_all_names or pkgname in self._pkgnames_loaded: - returnList.extend(self._packagesByName(pkgname)) - else: -@@ -1312,7 +1362,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - # If it is a filename, search the primary.xml file info - results.extend(self._search_primary_files(n)) +@@ -1516,6 +1513,8 @@ class YumRepository(Repository, config.RepoConf): + """ Internal function, use .retrieveMD() from outside yum. """ + # Note that this can raise Errors.RepoMDError if mdtype doesn't exist + # for this repo. ++ # FIXME - maybe retrieveMD should call decompress() after we've checked ++ # the checksum by default? since we're never acting on compressed MD + thisdata = self.repoXML.getData(mdtype) -- # if its in the primary.xml files then skip the other check -+ # If it is in the primary.xml files then skip the other check - if misc.re_primary_filename(n) and not glob: - return misc.unique(results) + (r_base, remote) = thisdata.location +@@ -1768,9 +1767,9 @@ class YumRepository(Repository, config.RepoConf): -@@ -1369,7 +1419,12 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + grpfile = self.getGroups() - def searchProvides(self, name): - """return list of packages providing name (any evr and flag)""" -- return self.searchPrco(name, "provides") -+ if name in self._provmatch_fails: -+ return [] -+ ret = self.searchPrco(name, "provides") -+ if not ret: -+ self._provmatch_fails.add(name) -+ return ret - - def searchRequires(self, name): - """return list of packages requiring name (any evr and flag)""" -@@ -1502,7 +1557,8 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - 'sql_envra', 'sql_nevra'] - need_full = False - for pat in patterns: -- if misc.re_full_search_needed(pat): -+ if (misc.re_full_search_needed(pat) and -+ (ignore_case or pat not in self._pkgnames_loaded)): - need_full = True +- # open it up as a file object so iterparse can cope with our gz file +- if grpfile is not None and grpfile.endswith('.gz'): +- grpfile = gzip.open(grpfile) ++ # open it up as a file object so iterparse can cope with our compressed file ++ if grpfile is not None: ++ grpfile = misc.decompress(grpfile) + try: + c = comps.Comps() + c.add(grpfile) +-- +1.7.0.1 + + +From 0389ee67abc568fe33eb2e1bc163ea64c3c6d849 Mon Sep 17 00:00:00 2001 +From: Ville-Pekka Vainio +Date: Thu, 27 May 2010 18:24:31 +0000 +Subject: [PATCH 146] l10n: Updates to Finnish (fi) translation + +New status: 569 messages complete with 0 fuzzies and 0 untranslated. + +Transmitted-via: Transifex (www.transifex.net). +--- + po/fi.po | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/po/fi.po b/po/fi.po +index 4240973..71c926d 100644 +--- a/po/fi.po ++++ b/po/fi.po +@@ -7,7 +7,7 @@ msgstr "" + "Project-Id-Version: yum\n" + "Report-Msgid-Bugs-To: \n" + "POT-Creation-Date: 2010-02-11 10:54-0500\n" +-"PO-Revision-Date: 2010-03-24 14:36+0200\n" ++"PO-Revision-Date: 2010-05-27 21:23+0300\n" + "Last-Translator: Ville-Pekka Vainio \n" + "Language-Team: Finnish \n" + "MIME-Version: 1.0\n" +@@ -250,7 +250,7 @@ msgstr "Vanhennettavat paketit" + #: ../cli.py:717 + #, python-format + msgid " (from %s)" +-msgstr " (versiosta %s)" ++msgstr " (asennuslähteestä %s)" + + #: ../cli.py:719 + #, python-format +-- +1.7.0.1 + + +From a810a19804630b62620a9a943847fde34839e54d Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Tue, 1 Jun 2010 13:13:01 -0400 +Subject: [PATCH 147] in python 3k (and in the new rpm-python bindings) rpm is returning flags as LONGS not INTS - so this code breaks w/o + this fix. + +most importantly it breaks mock +--- + rpmUtils/miscutils.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py +index 8e46541..b1631ae 100644 +--- a/rpmUtils/miscutils.py ++++ b/rpmUtils/miscutils.py +@@ -351,7 +351,7 @@ def formatRequire (name, version, flags): + ''' + s = name + +- if flags and type(flags) == type(0): # Flag must be set and a int ++ if flags and (type(flags) == type(0) or type(flags) == type(0L)): # Flag must be set and a int (or a long, now) + if flags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER | + rpm.RPMSENSE_EQUAL): + s = s + " " +-- +1.7.0.1 + + +From e5d248748d5e42906cbc8bbbb4befc75210522ef Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Tue, 1 Jun 2010 15:13:32 -0400 +Subject: [PATCH 148] add exit_on_lock option for rh bug https://bugzilla.redhat.com/show_bug.cgi?id=598527 + +if the lock is held, exit with value and output +updated utils.py for this as well. + +settable on the cli with --setopt=... +--- + utils.py | 9 ++++++--- + yum/config.py | 3 ++- + yummain.py | 10 +++++++--- + 3 files changed, 15 insertions(+), 7 deletions(-) + +diff --git a/utils.py b/utils.py +index 1bb4569..b5b38bd 100644 +--- a/utils.py ++++ b/utils.py +@@ -154,9 +154,12 @@ class YumUtilBase(YumBaseCli): + if "%s" %(e.msg,) != lockerr: + lockerr = "%s" %(e.msg,) + self.logger.critical(lockerr) +- self.logger.critical("Another app is currently holding the yum lock; waiting for it to exit...") +- show_lock_owner(e.pid, self.logger) +- time.sleep(2) ++ if not self.conf.exit_on_lock: ++ self.logger.critical("Another app is currently holding the yum lock; waiting for it to exit...") ++ show_lock_owner(e.pid, self.logger) ++ time.sleep(2) ++ else: ++ raise Errors.YumBaseError, _("Another app is currently holding the yum lock; exiting as configured by exit_on_lock") + else: break + +diff --git a/yum/config.py b/yum/config.py +index 949751a..11347a6 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -735,7 +735,8 @@ class YumConf(StartupConf): -@@ -1536,12 +1592,18 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - pat_sqls = [] - pat_data = [] - for (pattern, rest) in patterns: -+ if not ignore_case and pattern in self._pkgmatch_fails: -+ continue -+ - for field in fields: - if ignore_case: - pat_sqls.append("%s LIKE ?%s" % (field, rest)) - else: - pat_sqls.append("%s %s ?" % (field, rest)) - pat_data.append(pattern) -+ if patterns and not pat_sqls: -+ return -+ - if pat_sqls: - qsql = _FULL_PARSE_QUERY_BEG + " OR ".join(pat_sqls) - else: -@@ -1568,6 +1630,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + protected_packages = ListOption("yum, glob:/etc/yum/protected.d/*.conf", + parse_default=True) +- ++ exit_on_lock = BoolOption(False) ++ + _reposlist = [] - for (repo, x) in self._yieldSQLDataList(repoid, patterns, fields, - ignore_case): -+ # Can't use: _sql_pkgKey2po because we change repos. - po = self._packageByKeyData(repo, x['pkgKey'], x) - if po is None: - continue -@@ -1578,6 +1641,17 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): - if not need_full and repoid is None: - # Mark all the processed pkgnames as fully loaded - self._pkgnames_loaded.update([po.name for po in returnList]) -+ if need_full: -+ for (pat, rest) in patterns: -+ if rest not in ('=', ''): # Wildcards: 'glob' or ' ESCAPE "!"' -+ continue -+ for pkg in returnList: -+ if pkg.name == pat: -+ self._pkgnames_loaded.add(pkg.name) -+ break -+ if not returnList: -+ for (pat, rest) in patterns: -+ self._pkgmatch_fails.add(pat) + def dump(self): +diff --git a/yummain.py b/yummain.py +index 305e0c7..95c7462 100755 +--- a/yummain.py ++++ b/yummain.py +@@ -99,9 +99,13 @@ def main(args): + if "%s" %(e.msg,) != lockerr: + lockerr = "%s" %(e.msg,) + logger.critical(lockerr) +- logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit...")) +- show_lock_owner(e.pid, logger) +- time.sleep(2) ++ if not base.conf.exit_on_lock: ++ logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit...")) ++ show_lock_owner(e.pid, logger) ++ time.sleep(2) ++ else: ++ logger.critical(_("Another app is currently holding the yum lock; exiting as configured by exit_on_lock")) ++ return 1 + else: + break - return returnList - -diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py -index e7b60de..d574b80 100644 ---- a/yum/transactioninfo.py -+++ b/yum/transactioninfo.py -@@ -39,7 +39,7 @@ class GetProvReqOnlyPackageSack(PackageSack): - self._need_index_files = need_files +-- +1.7.0.1 + + +From f3913c06458b67ce29c746a81c1bff95b68409b2 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 25 May 2010 17:12:19 -0400 +Subject: [PATCH 149] Deal with RHEL-5 loginuid damage + +--- + output.py | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/output.py b/output.py +index 7a3cfb0..de04b83 100755 +--- a/output.py ++++ b/output.py +@@ -1252,8 +1252,9 @@ to exit. + return count, "".join(list(actions)) - def __addPackageToIndex_primary_files(self, obj): -- for ftype in obj.returnFileTypes(): -+ for ftype in obj.returnFileTypes(primary_only=True): - for file in obj.returnFileEntries(ftype, primary_only=True): - self._addToDictAsList(self.filenames, file, obj) - def __addPackageToIndex_files(self, obj): -@@ -89,9 +89,7 @@ class TransactionData: - self.pkgSack = None - self.pkgSackPackages = 0 - self.localSack = PackageSack() -- # FIXME: This is turned off atm. ... it'll be turned on when -- # the new yum-metadata-parser with the "pkgfiles" index is std. -- self._inSack = None # GetProvReqOnlyPackageSack() -+ self._inSack = GetProvReqOnlyPackageSack() + def _pwd_ui_username(self, uid, limit=None): +- # loginuid is set to -1 on init. +- if uid is None or uid == 0xFFFFFFFF: ++ # loginuid is set to -1 (0xFFFF_FFFF) on init, in newer kernels. ++ # loginuid is set to INT_MAX (0x7FFF_FFFF) on init, in older kernels. ++ if uid is None or uid in (0xFFFFFFFF, 0x7FFFFFFF): + loginid = _("") + name = _("System") + " " + loginid + if limit is not None and len(name) > limit: +-- +1.7.0.1 + + +From 17068d8e299ab477d8c6a5bc566e5f62d7b34759 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 1 Jun 2010 12:06:10 -0400 +Subject: [PATCH 150] Fix pkgs. that are excluded after being put in yb.up ... BZ#597853 + +--- + yum/__init__.py | 35 ++++++++++++++++++++++++----------- + 1 files changed, 24 insertions(+), 11 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 1c398fd..aa522f8 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -2674,7 +2674,7 @@ class YumBase(depsolve.Depsolve): + for pkg in self.tsInfo.conditionals.get(txmbr.name, []): + self.tsInfo.remove(pkg.pkgtup) + +- def getPackageObject(self, pkgtup): ++ def getPackageObject(self, pkgtup, allow_missing=False): + """retrieves a packageObject from a pkgtuple - if we need + to pick and choose which one is best we better call out + to some method from here to pick the best pkgobj if there are +@@ -2689,6 +2689,8 @@ class YumBase(depsolve.Depsolve): + pkgs = self.pkgSack.searchPkgTuple(pkgtup) - # lists of txmbrs in their states - just placeholders - self.instgroups = [] -@@ -132,7 +130,7 @@ class TransactionData: - if pkgtup is None: - for members in self.pkgdict.itervalues(): - returnlist.extend(members) -- elif self.pkgdict.has_key(pkgtup): -+ elif pkgtup in self.pkgdict: - returnlist.extend(self.pkgdict[pkgtup]) - return returnlist + if len(pkgs) == 0: ++ if allow_missing: # This can happen due to excludes after .up has ++ return None # happened. + raise Errors.DepError, _('Package tuple %s could not be found in packagesack') % str(pkgtup) -@@ -195,6 +193,39 @@ class TransactionData: + if len(pkgs) > 1: # boy it'd be nice to do something smarter here FIXME +@@ -2929,9 +2931,11 @@ class YumBase(depsolve.Depsolve): + ret = _sort_arch_i(self.arch.bestarch, a1, a2) + return ret + obsoleting.sort(_sort_arch) +- obsoleting = obsoleting[0] +- obsoleting_pkg = self.getPackageObject(obsoleting) +- return obsoleting_pkg ++ for pkgtup in obsoleting: ++ pkg = self.getPackageObject(pkgtup, allow_missing=True) ++ if pkg is not None: ++ return pkg ++ return None + return None - return result + def _test_loop(self, node, next_func): +@@ -3325,7 +3329,10 @@ class YumBase(depsolve.Depsolve): + obsoletes = [] -+ def deselect(self, pattern): -+ """ Remove these packages from the transaction. This is more user -+ orientated than .remove(). Used from kickstart/install -blah. """ -+ -+ # We don't have a returnPackages() here, so just try the "simple" -+ # specifications. Pretty much 100% hit rate on kickstart. -+ txmbrs = self.matchNaevr(pattern) -+ if not txmbrs: -+ na = pattern.rsplit('.', 2) -+ if len(na) == 2: -+ txmbrs = self.matchNaevr(na[0], na[1]) + for (obsoleting, installed) in obsoletes: +- obsoleting_pkg = self.getPackageObject(obsoleting) ++ obsoleting_pkg = self.getPackageObject(obsoleting, ++ allow_missing=True) ++ if obsoleting_pkg is None: ++ continue + topkg = self._test_loop(obsoleting_pkg, self._pkg2obspkg) + if topkg is not None: + obsoleting_pkg = topkg +@@ -3341,7 +3348,10 @@ class YumBase(depsolve.Depsolve): + self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % + old) + else: +- tx_return.extend(self.update(po=self.getPackageObject(new))) ++ new = self.getPackageObject(new, allow_missing=True) ++ if new is None: ++ continue ++ tx_return.extend(self.update(po=new)) + + return tx_return + +@@ -3438,10 +3448,11 @@ class YumBase(depsolve.Depsolve): + # It's a minor UI problem for RHEL, but might as well dtrt. + obs_pkgs = [] + for pkgtup in obs_tups: +- opkgs = self.pkgSack.searchPkgTuple(pkgtup) +- if not opkgs: # Could have been be excluded after +- continue # obsoleted_dict was setup. +- obs_pkgs.append(opkgs[0]) ++ obsoleting_pkg = self.getPackageObject(pkgtup, ++ allow_missing=True) ++ if obsoleting_pkg is None: ++ continue ++ obs_pkgs.append(obsoleting_pkg) + for obsoleting_pkg in packagesNewestByName(obs_pkgs): + tx_return.extend(self.install(po=obsoleting_pkg)) + for available_pkg in availpkgs: +@@ -3459,7 +3470,9 @@ class YumBase(depsolve.Depsolve): + + for installed_pkg in instpkgs: + for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []): +- po = self.getPackageObject(updating) ++ po = self.getPackageObject(updating, allow_missing=True) ++ if po is None: ++ continue + if self.tsInfo.isObsoleted(installed_pkg.pkgtup): + self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % + installed_pkg.pkgtup) +-- +1.7.0.1 + + +From 5025fa3b4c31ac2c9defa9a8945c263f485445cc Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 1 Jun 2010 15:12:40 -0400 +Subject: [PATCH 151] Pick already installed packages as "best" with provide install + +--- + yum/depsolve.py | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 60b4e2f..8c260a7 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -1168,6 +1168,10 @@ class Depsolve(object): + # something else in the transaction. :( + # there are many ways I hate this - this is but one + ipkgresults[pkg] = 5 ++ elif newest.verEQ(pkg): ++ # We get here from bestPackagesFromList(), give a giant ++ # bump to stuff that is already installed. ++ ipkgresults[pkg] = 1000 + else: + # just b/c they're not installed pkgs doesn't mean they should + # be ignored entirely. Just not preferred +-- +1.7.0.1 + + +From b5709f8db89fe478a9b168aa3e0f3009fe7f7e05 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 1 Jun 2010 16:54:54 -0400 +Subject: [PATCH 152] Opt. for rpmdb.returnPackages(patterns=...). Drops about 30% from remove time. + +--- + yum/rpmsack.py | 17 +++++++++++++++++ + 1 files changed, 17 insertions(+), 0 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index a0c65c8..42f63cf 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -453,6 +453,23 @@ class RPMDBPackageSack(PackageSackBase): + """Returns a list of packages. Note that the packages are + always filtered to those matching the patterns/case. repoid is + ignored, and is just here for compatibility with non-rpmdb sacks. """ + -+ if not txmbrs: -+ if self.pkgSack is None: -+ pkgs = [] ++ # See if we can load the "patterns" via. dbMatch('name', ...) because ++ # that's basically instant and walking the entire rpmdb isn't. ++ if not self._completely_loaded and patterns and not ignore_case: ++ for pat in patterns: ++ if '?' in pat or '*' in pat: ++ break + else: -+ pkgs = self.pkgSack.returnPackages(patterns=[pattern]) -+ if not pkgs: -+ pkgs = self.rpmdb.returnPackages(patterns=[pattern]) -+ -+ for pkg in pkgs: -+ txmbrs.extend(self.getMembers(pkg.pkgtup)) -+ # Now we need to do conditional group packages, so they don't -+ # get added later on. This is hacky :( -+ for req, cpkgs in self.conditionals.iteritems(): -+ if pkg in cpkgs: -+ cpkgs.remove(pkg) -+ self.conditionals[req] = cpkgs -+ -+ for txmbr in txmbrs: -+ self.remove(txmbr.pkgtup) -+ return txmbrs ++ ret = [] ++ for pat in patterns: ++ pkgs = self.searchNames([pat]) ++ if not pkgs: ++ break ++ ret.extend(pkgs) ++ else: ++ return ret + - def _isLocalPackage(self, txmember): - # Is this the right criteria? - # FIXME: This is kinda weird, we really want all local pkgs to be in a -@@ -239,9 +270,13 @@ class TransactionData: - elif isinstance(txmember.po, YumAvailablePackageSqlite): - self.pkgSackPackages += 1 - if self._inSack is not None and txmember.output_state in TS_INSTALL_STATES: -- self._inSack.addPackage(txmember.po) -+ if not txmember.po.have_fastReturnFileEntries(): -+ # In theory we could keep this on if a "small" repo. fails -+ self._inSack = None -+ else: -+ self._inSack.addPackage(txmember.po) - -- if self.conditionals.has_key(txmember.name): -+ if txmember.name in self.conditionals: - for pkg in self.conditionals[txmember.name]: - if self.rpmdb.contains(po=pkg): - continue -@@ -273,7 +308,7 @@ class TransactionData: - - def exists(self, pkgtup): - """tells if the pkg is in the class""" -- if self.pkgdict.has_key(pkgtup): -+ if pkgtup in self.pkgdict: - if len(self.pkgdict[pkgtup]) != 0: - return 1 - -@@ -368,7 +403,6 @@ class TransactionData: - self.downgraded.sort() - self.failed.sort() - -- - def addInstall(self, po): - """adds a package as an install but in mode 'u' to the ts - takes a packages object and returns a TransactionMember Object""" -diff --git a/yum/update_md.py b/yum/update_md.py -index 54d4cd7..cf8136a 100644 ---- a/yum/update_md.py -+++ b/yum/update_md.py -@@ -22,12 +22,11 @@ Update metadata (updateinfo.xml) parsing. - """ + ret = [] + if patterns and not ignore_case: + tpats = [] +-- +1.7.0.1 + + +From 17f7ebdd2c0a7df34c31fd3dd5e87a988a46e38e Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 1 Jun 2010 17:02:21 -0400 +Subject: [PATCH 153] Fix "remove name-version", really minor API bug before last patch + +--- + yum/rpmsack.py | 10 +++++++--- + 1 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 42f63cf..c0b53ba 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -162,6 +162,7 @@ class RPMDBPackageSack(PackageSackBase): + self._pkgnames_loaded = set() + self._tup2pkg = {} + self._completely_loaded = False ++ self._pkgname_fails = set() + self._pkgmatch_fails = set() + self._provmatch_fails = set() + self._simple_pkgtup_list = [] +@@ -215,6 +216,7 @@ class RPMDBPackageSack(PackageSackBase): + self._tup2pkg = {} + self._completely_loaded = False + self._pkgmatch_fails = set() ++ self._pkgname_fails = set() + self._provmatch_fails = set() + self._simple_pkgtup_list = [] + self._get_pro_cache = {} +@@ -463,6 +465,8 @@ class RPMDBPackageSack(PackageSackBase): + else: + ret = [] + for pat in patterns: ++ # We aren't wasting anything here, because the next bit ++ # will pick up any loads :) + pkgs = self.searchNames([pat]) + if not pkgs: + break +@@ -1069,7 +1073,7 @@ class RPMDBPackageSack(PackageSackBase): - import sys --import gzip + def _search(self, name=None, epoch=None, ver=None, rel=None, arch=None): + '''List of matching packages, to zero or more of NEVRA.''' +- if name is not None and name in self._pkgmatch_fails: ++ if name is not None and name in self._pkgname_fails: + return [] - from yum.i18n import utf8_text_wrap, to_utf8 - from yum.yumRepo import YumRepository - from yum.packages import FakeRepository --from yum.misc import to_xml -+from yum.misc import to_xml, decompress - import Errors + pkgtup = (name, arch, epoch, ver, rel) +@@ -1083,7 +1087,7 @@ class RPMDBPackageSack(PackageSackBase): + if name is not None: + pkgs = self._name2pkg.get(name, []) + if not pkgs: +- self._pkgmatch_fails.add(name) ++ self._pkgname_fails.add(name) + else: + pkgs = self.returnPkgs() + for po in pkgs: +@@ -1123,7 +1127,7 @@ class RPMDBPackageSack(PackageSackBase): + self.ts.close() - import rpmUtils.miscutils -@@ -73,10 +72,10 @@ class UpdateNotice(object): + if not done and name is not None: +- self._pkgmatch_fails.add(name) ++ self._pkgname_fails.add(name) - def __getitem__(self, item): - """ Allows scriptable metadata access (ie: un['update_id']). """ -- return self._md.has_key(item) and self._md[item] or None -+ return self._md.get(item) or None + return ret - def __setitem__(self, item, val): -- self._md[item] = val -+ self._md[item] = val +-- +1.7.0.1 + + +From 3ea64d27cf5b767123152a8aa8d1e6527dfb2750 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 2 Jun 2010 12:42:05 -0400 +Subject: [PATCH 154] Add prerepoconf, and use it to automagically setup .repos on access. + This means we don't even need to read the config. files for repos. or + set them up when we aren't using them. + + This is roughly 20% for "yum remove" etc. + + This should be really safe because I left in all the old code, so if +some output.py API user does: + +yb.repos +yb.setupProgressCallbacks() + +...we don't complain. Dito. yb.setCacheDir() which is much more likely. + + Patches are required, to repoquery, for repoquery --installed to +benefit but they seem like sane updates to using the new APIs (ie. +not calling doSackSetup() explicitly). +--- + output.py | 36 +++++++++++++++++++++++++++--------- + yum/__init__.py | 47 ++++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 69 insertions(+), 14 deletions(-) + +diff --git a/output.py b/output.py +index de04b83..be4d1e8 100755 +--- a/output.py ++++ b/output.py +@@ -1141,19 +1141,31 @@ Downgrade %5.5s Package(s) + # progress bars - this is hacky - I'm open to other options + # One of these is a download + if self.conf.debuglevel < 2 or not sys.stdout.isatty(): +- self.repos.setProgressBar(None) +- self.repos.callback = None ++ progressbar = None ++ callback = None + else: +- self.repos.setProgressBar(YumTextMeter(fo=sys.stdout)) +- self.repos.callback = CacheProgressCallback() ++ progressbar = YumTextMeter(fo=sys.stdout) ++ callback = CacheProgressCallback() + + # setup our failure report for failover + freport = (self.failureReport,(),{}) +- self.repos.setFailureCallback(freport) ++ failure_callback = freport + + # setup callback for CTRL-C's +- self.repos.setInterruptCallback(self.interrupt_callback) +- ++ interrupt_callback = self.interrupt_callback ++ if hasattr(self, 'prerepoconf'): ++ self.prerepoconf.progressbar = progressbar ++ self.prerepoconf.callback = callback ++ self.prerepoconf.failure_callback = failure_callback ++ self.prerepoconf.interrupt_callback = interrupt_callback ++ else: ++ # Just in case some API user decides to do self.repos before ++ # calling us. ++ self.repos.setProgressBar(progressbar) ++ self.repos.callback = callback ++ self.repos.setFailureCallback(failure_callback) ++ self.repos.setInterruptCallback(interrupt_callback) ++ + # setup our depsolve progress callback + dscb = DepSolveProgressCallBack(weakref(self)) + self.dsCallback = dscb +@@ -1163,8 +1175,14 @@ Downgrade %5.5s Package(s) + self.setupProgressCallbacks() + + def setupKeyImportCallbacks(self): +- self.repos.confirm_func = self._cli_confirm_gpg_key_import +- self.repos.gpg_import_func = self.getKeyForRepo ++ confirm_func = self._cli_confirm_gpg_key_import ++ gpg_import_func = self.getKeyForRepo ++ if hasattr(self, 'prerepoconf'): ++ self.prerepoconf.confirm_func = confirm_func ++ self.prerepoconf.gpg_import_func = gpg_import_func ++ else: ++ self.repos.confirm_func = confirm_func ++ self.repos.gpg_import_func = gpg_import_func - def __str__(self): - head = """ -@@ -328,20 +327,22 @@ class UpdateMetadata(object): - """ - if type(nvr) in (type([]), type(())): - nvr = '-'.join(nvr) -- return self._cache.has_key(nvr) and self._cache[nvr] or None -+ return self._cache.get(nvr) or None + def interrupt_callback(self, cbobj): + '''Handle CTRL-C's during downloads +diff --git a/yum/__init__.py b/yum/__init__.py +index aa522f8..eaeb275 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -108,6 +108,23 @@ class _YumPreBaseConf: + self.releasever = None + self.uuid = None - # The problem with the above "get_notice" is that not everyone updates - # daily. So if you are at pkg-1, pkg-2 has a security notice, and pkg-3 - # has a BZ fix notice. All you can see is the BZ notice for the new "pkg-3" - # with the above. - # So now instead you lookup based on the _installed_ pkg.pkgtup, and get -- # two notices, in order: [(pkg-3, notice), (pkg-2, notice)] -+ # two notices, in order: [(pkgtup-3, notice), (pkgtup-2, notice)] - # the reason for the sorting order is that the first match will give you - # the minimum pkg you need to move to. - def get_applicable_notices(self, pkgtup): - """ - Retrieve any update notices which are newer than a - given std. pkgtup (name, arch, epoch, version, release) tuple. -+ Returns: list of (pkgtup, notice) that are newer than the given pkgtup, -+ in the order of newest pkgtups first. - """ - oldpkgtup = pkgtup - name = oldpkgtup[0] -@@ -380,14 +381,17 @@ class UpdateMetadata(object): - if not obj: - raise UpdateNoticeException - if type(obj) in (type(''), type(u'')): -- infile = obj.endswith('.gz') and gzip.open(obj) or open(obj, 'rt') -+ unfile = decompress(obj) -+ infile = open(unfile, 'rt') + - elif isinstance(obj, YumRepository): - if obj.id not in self._repos: - self._repos.append(obj.id) - md = obj.retrieveMD(mdtype) - if not md: - raise UpdateNoticeException() -- infile = gzip.open(md) -+ unfile = decompress(md) -+ infile = open(unfile, 'rt') - elif isinstance(obj, FakeRepository): - raise Errors.RepoMDError, "No updateinfo for local pkg" - else: # obj is a file object -diff --git a/yum/yumRepo.py b/yum/yumRepo.py -index 8d7617e..ac6c7c0 100644 ---- a/yum/yumRepo.py -+++ b/yum/yumRepo.py -@@ -19,7 +19,6 @@ import time - import types - import urlparse - urlparse.uses_fragment.append("media") --import gzip - - import Errors - from urlgrabber.grabber import URLGrabber -@@ -78,7 +77,7 @@ class YumPackageSack(packageSack.PackageSack): - self.added = {} ++class _YumPreRepoConf: ++ """This is the configuration interface for the repos configuration. ++ So if you want to change callbacks etc. you tweak it here, and when ++ yb.repos does it's thing ... it happens. """ ++ ++ def __init__(self): ++ self.progressbar = None ++ self.callback = None ++ self.failure_callback = None ++ self.interrupt_callback = None ++ self.confirm_func = None ++ self.gpg_import_func = None ++ self.cachedir = None ++ self.cache = None ++ ++ + class _YumCostExclude: + """ This excludes packages that are in repos. of lower cost than the passed + repo. """ +@@ -163,6 +180,7 @@ class YumBase(depsolve.Depsolve): + self.mediagrabber = None + self.arch = ArchStorage() + self.preconf = _YumPreBaseConf() ++ self.prerepoconf = _YumPreRepoConf() + + self.run_with_package_names = set() + +@@ -306,12 +324,9 @@ class YumBase(depsolve.Depsolve): + # this (core now only uses YumBase.conf.yumvar). + self.yumvar = self.conf.yumvar + +- self.getReposFromConfig() +- + # who are we: + self.conf.uid = os.geteuid() + +- + self.doFileLogSetup(self.conf.uid, self.conf.logfile) + self.verbose_logger.debug('Config time: %0.3f' % (time.time() - conf_st)) + self.plugins.run('init') +@@ -518,7 +533,26 @@ class YumBase(depsolve.Depsolve): + + def _getRepos(self, thisrepo=None, doSetup = False): + """ For each enabled repository set up the basics of the repository. """ +- self.conf # touch the config class first ++ if hasattr(self, 'prerepoconf'): ++ self.conf # touch the config class first ++ ++ self.getReposFromConfig() ++ ++ # Recursion ++ prerepoconf = self.prerepoconf ++ del self.prerepoconf ++ ++ self.repos.setProgressBar(prerepoconf.progressbar) ++ self.repos.callback = prerepoconf.callback ++ self.repos.setFailureCallback(prerepoconf.failure_callback) ++ self.repos.setInterruptCallback(prerepoconf.interrupt_callback) ++ self.repos.confirm_func = prerepoconf.confirm_func ++ self.repos.gpg_import_func = prerepoconf.gpg_import_func ++ if prerepoconf.cachedir is not None: ++ self.repos.setCacheDir(prerepoconf.cachedir) ++ if prerepoconf.cache is not None: ++ self.repos.setCache(prerepoconf.cache) ++ + + if doSetup: + repo_st = time.time() +@@ -4562,7 +4596,10 @@ class YumBase(depsolve.Depsolve): + return False # Tried, but failed, to get a "user" cachedir - def addDict(self, repo, datatype, dataobj, callback=None): -- if self.added.has_key(repo): -+ if repo in self.added: - if datatype in self.added[repo]: - return + cachedir += varReplace(suffix, self.conf.yumvar) +- self.repos.setCacheDir(cachedir) ++ if hasattr(self, 'prerepoconf'): ++ self.prerepoconf.cachedir = cachedir ++ else: ++ self.repos.setCacheDir(cachedir) + self.conf.cachedir = cachedir + return True # We got a new cache dir -@@ -94,14 +93,14 @@ class YumPackageSack(packageSack.PackageSack): - self._addToDictAsList(self.pkgsByID, pkgid, po) - self.addPackage(po) +-- +1.7.0.1 + + +From 94985cc4750c73d4c09f53bf999a38d541837770 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 2 Jun 2010 13:46:03 -0400 +Subject: [PATCH 155] Lazily load cElementTree, saves about 10% of "import yum" time. + +--- + yum/comps.py | 6 +----- + yum/metalink.py | 6 +----- + yum/misc.py | 20 ++++++++++++++++++++ + yum/repoMDObject.py | 6 +----- + yum/update_md.py | 8 +------- + 5 files changed, 24 insertions(+), 22 deletions(-) + +diff --git a/yum/comps.py b/yum/comps.py +index bf070fa..5ccfba2 100755 +--- a/yum/comps.py ++++ b/yum/comps.py +@@ -16,11 +16,6 @@ + import types + import sys + from constants import * +-try: +- from xml.etree import cElementTree +-except ImportError: +- import cElementTree +-iterparse = cElementTree.iterparse + from Errors import CompsException + #FIXME - compsexception isn't caught ANYWHERE so it's pointless to raise it + # switch all compsexceptions to grouperrors after api break +@@ -28,6 +23,7 @@ import fnmatch + import re + from yum.i18n import to_unicode + from misc import get_my_lang_code ++from yum.misc import cElementTree_iterparse as iterparse -- if not self.added.has_key(repo): -+ if repo not in self.added: - self.added[repo] = [] - self.added[repo].append('metadata') - # indexes will need to be rebuilt - self.indexesBuilt = 0 + lang_attr = '{http://www.w3.org/XML/1998/namespace}lang' - elif datatype in ['filelists', 'otherdata']: -- if self.added.has_key(repo): -+ if repo in self.added: - if 'metadata' not in self.added[repo]: - raise Errors.RepoError, '%s md for %s imported before primary' \ - % (datatype, repo.id) -@@ -110,7 +109,7 @@ class YumPackageSack(packageSack.PackageSack): - current += 1 - if callback: callback.progressbar(current, total, repo) - pkgdict = dataobj[pkgid] -- if self.pkgsByID.has_key(pkgid): -+ if pkgid in self.pkgsByID: - for po in self.pkgsByID[pkgid]: - po.importFromDict(pkgdict) +diff --git a/yum/metalink.py b/yum/metalink.py +index 24da633..20f0ea5 100755 +--- a/yum/metalink.py ++++ b/yum/metalink.py +@@ -26,11 +26,7 @@ from urlgrabber.progress import format_number -@@ -134,7 +133,7 @@ class YumPackageSack(packageSack.PackageSack): - callback=callback, - ) - for item in data: -- if self.added.has_key(repo): -+ if repo in self.added: - if item in self.added[repo]: - continue + import Errors -@@ -163,7 +162,7 @@ class YumPackageSack(packageSack.PackageSack): +-try: +- from xml.etree import cElementTree +-except ImportError: +- import cElementTree +-xmlparse = cElementTree.parse ++from yum.misc import cElementTree_xmlparse as xmlparse - if self._check_db_version(repo, mydbtype): - # see if we have the uncompressed db and check it's checksum vs the openchecksum -- # if not download the bz2 file -+ # if not download the compressed file - # decompress it - # unlink it + class MetaLinkRepoErrorParseFail(Errors.RepoError): + """ An exception thrown for an unparsable MetaLinkRepoMD file. """ +diff --git a/yum/misc.py b/yum/misc.py +index 7793807..b565ab1 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -1064,4 +1064,24 @@ def read_in_items_from_dot_dir(thisglob, line_as_list=True): + results.append(line) + return results + ++__cached_cElementTree = None ++def _cElementTree_import(): ++ """ Importing xElementTree all the time, when we often don't need it, is a ++ huge timesink. This makes python -c 'import yum' suck. So we hide it ++ behind this function. And have accessors. """ ++ global __cached_cElementTree ++ if __cached_cElementTree is None: ++ try: ++ from xml.etree import cElementTree ++ except ImportError: ++ import cElementTree ++ __cached_cElementTree = cElementTree ++ ++def cElementTree_iterparse(filename): ++ """ Lazily load/run: cElementTree.iterparse """ ++ _cElementTree_import() ++ return __cached_cElementTree.iterparse(filename) + ++def cElementTree_xmlparse(filename): ++ """ Lazily load/run: cElementTree.xmlparse """ ++ return __cached_cElementTree.parse(filename) +diff --git a/yum/repoMDObject.py b/yum/repoMDObject.py +index 7a4593e..afc7947 100755 +--- a/yum/repoMDObject.py ++++ b/yum/repoMDObject.py +@@ -14,11 +14,7 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # Copyright 2006 Duke University + +-try: +- from xml.etree import cElementTree +-except ImportError: +- import cElementTree +-iterparse = cElementTree.iterparse ++from yum.misc import cElementTree_iterparse as iterparse + from Errors import RepoMDError -@@ -171,9 +170,8 @@ class YumPackageSack(packageSack.PackageSack): - if not db_un_fn: - db_fn = repo._retrieveMD(mydbtype) - if db_fn: -- db_un_fn = db_fn.replace('.bz2', '') - if not repo.cache: -- misc.bunzipFile(db_fn, db_un_fn) -+ db_un_fn = misc.decompress(db_fn) - misc.unlink_f(db_fn) - db_un_fn = self._check_uncompressed_db(repo, mydbtype) + import sys +diff --git a/yum/update_md.py b/yum/update_md.py +index cf8136a..9e492ba 100644 +--- a/yum/update_md.py ++++ b/yum/update_md.py +@@ -27,17 +27,11 @@ from yum.i18n import utf8_text_wrap, to_utf8 + from yum.yumRepo import YumRepository + from yum.packages import FakeRepository + from yum.misc import to_xml, decompress ++from yum.misc import cElementTree_iterparse as iterparse + import Errors -@@ -199,8 +197,8 @@ class YumPackageSack(packageSack.PackageSack): - mydbdata = repo.repoXML.getData(mdtype) - (r_base, remote) = mydbdata.location - fname = os.path.basename(remote) -- bz2_fn = repo.cachedir + '/' + fname -- db_un_fn = bz2_fn.replace('.bz2', '') -+ compressed_fn = repo.cachedir + '/' + fname -+ db_un_fn = misc.decompress(compressed_fn, fn_only=True) + import rpmUtils.miscutils - result = None +-try: +- from xml.etree import cElementTree +-except ImportError: +- import cElementTree +-iterparse = cElementTree.iterparse +- +- + class UpdateNoticeException(Exception): + """ An exception thrown for bad UpdateNotice data. """ + pass +-- +1.7.0.1 + + +From fcca40d0a7b930dedb6e9b89faf880ff3eeb31f9 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 2 Jun 2010 14:47:57 -0400 +Subject: [PATCH 156] Don't re-import saxutils for each call to to_xml(). + +--- + yum/misc.py | 11 ++++++++--- + 1 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/yum/misc.py b/yum/misc.py +index b565ab1..09e4dd6 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -870,15 +870,20 @@ def _ugly_utf8_string_hack(item): + newitem = newitem + char + return newitem + ++__cached_saxutils = None + def to_xml(item, attrib=False): +- import xml.sax.saxutils ++ global __cached_saxutils ++ if __cached_saxutils is None: ++ import xml.sax.saxutils ++ __cached_saxutils = xml.sax.saxutils ++ + item = _ugly_utf8_string_hack(item) + item = to_utf8(item) + item = item.rstrip() + if attrib: +- item = xml.sax.saxutils.escape(item, entities={'"':"""}) ++ item = __cached_saxutils.escape(item, entities={'"':"""}) + else: +- item = xml.sax.saxutils.escape(item) ++ item = __cached_saxutils.escape(item) + return item + + def unlink_f(filename): +-- +1.7.0.1 + + +From 4b09b1cd7308f1a6df8f6279549efc23faa84f67 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 3 Jun 2010 10:39:36 -0400 +Subject: [PATCH 157] Fix typo in cElementTree_xmlparse + +--- + yum/misc.py | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +diff --git a/yum/misc.py b/yum/misc.py +index 09e4dd6..8e9a20c 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -1088,5 +1088,6 @@ def cElementTree_iterparse(filename): + return __cached_cElementTree.iterparse(filename) + + def cElementTree_xmlparse(filename): +- """ Lazily load/run: cElementTree.xmlparse """ ++ """ Lazily load/run: cElementTree.parse """ ++ _cElementTree_import() + return __cached_cElementTree.parse(filename) +-- +1.7.0.1 + + +From 7aa6510b3eddc293c0ca6c88247cfae2dbeb6d51 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 3 Jun 2010 11:43:22 -0400 +Subject: [PATCH 158] Don't bother looking for *, ? ... just wait for searchNames() to fail + +--- + yum/rpmsack.py | 18 +++++++----------- + 1 files changed, 7 insertions(+), 11 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index c0b53ba..627514b 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -459,20 +459,16 @@ class RPMDBPackageSack(PackageSackBase): + # See if we can load the "patterns" via. dbMatch('name', ...) because + # that's basically instant and walking the entire rpmdb isn't. + if not self._completely_loaded and patterns and not ignore_case: ++ ret = [] + for pat in patterns: +- if '?' in pat or '*' in pat: ++ # We aren't wasting anything here, because the next bit ++ # will pick up any loads :) ++ pkgs = self.searchNames([pat]) ++ if not pkgs: + break ++ ret.extend(pkgs) + else: +- ret = [] +- for pat in patterns: +- # We aren't wasting anything here, because the next bit +- # will pick up any loads :) +- pkgs = self.searchNames([pat]) +- if not pkgs: +- break +- ret.extend(pkgs) +- else: +- return ret ++ return ret -@@ -385,7 +383,7 @@ class YumRepository(Repository, config.RepoConf): - if isinstance(getattr(self, attr), types.MethodType): + ret = [] + if patterns and not ignore_case: +-- +1.7.0.1 + + +From e72347d0a3fb991f71a09d18f60ff49d7f33d51f Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 3 Jun 2010 11:44:13 -0400 +Subject: [PATCH 159] Don't fail for returnPackages(patterns=['[g]eany']) etc. + +--- + yum/rpmsack.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index 627514b..fd7cc1f 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -407,7 +407,7 @@ class RPMDBPackageSack(PackageSackBase): continue - res = getattr(self, attr) -- if not res: -+ if not res and type(res) not in (type(False), type(0)): - res = '' - if type(res) == types.ListType: - res = ',\n '.join(res) -@@ -1082,16 +1080,14 @@ class YumRepository(Repository, config.RepoConf): - self._check_db_version(mdtype + '_db', repoXML=repoXML)): - mdtype += '_db' - -- if repoXML.repoData.has_key(mdtype): -- return (mdtype, repoXML.getData(mdtype)) -- return (mdtype, None) -+ return (mdtype, repoXML.repoData.get(mdtype)) - - def _get_mdtype_fname(self, data, compressed=False): - (r_base, remote) = data.location - local = self.cachedir + '/' + os.path.basename(remote) - - if compressed: # DB file, we need the uncompressed version -- local = local.replace('.bz2', '') -+ local = misc.decompress(local, fn_only=True) - return local - def _groupCheckDataMDNewer(self): -@@ -1246,7 +1242,7 @@ class YumRepository(Repository, config.RepoConf): - compressed = False - local = self._get_mdtype_fname(data, False) - if not os.path.exists(local): -- local = local.replace('.bz2', '') -+ local = misc.decompress(local, fn_only=True) - compressed = True - # If we can, make a copy of the system-wide-cache version of this file, - # note that we often don't get here. So we also do this in -@@ -1353,10 +1349,9 @@ class YumRepository(Repository, config.RepoConf): + qpat = pat[0] +- if qpat in ('?', '*'): ++ if qpat in ('?', '*', '['): + qpat = None + if ignore_case: + if qpat is not None: +-- +1.7.0.1 + + +From 860d3b16843b826c6a4a42f1e4bc52c2879ef659 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Thu, 3 Jun 2010 12:30:08 -0400 +Subject: [PATCH 160] raise miscerror if the transaction-all file is garbage. + +--- + yum/misc.py | 6 +++++- + 1 files changed, 5 insertions(+), 1 deletions(-) + +diff --git a/yum/misc.py b/yum/misc.py +index 09e4dd6..086fd89 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -804,7 +804,11 @@ def find_ts_remaining(timestamp, yumlibpath='/var/lib/yum'): + item = item.replace('\n', '') + if item == '': + continue +- (action, pkgspec) = item.split() ++ try: ++ (action, pkgspec) = item.split() ++ except ValueError, e: ++ msg = "Transaction journal file %s is corrupt." % (tsallpath) ++ raise Errors.MiscError, msg + to_complete_items.append((action, pkgspec)) + + return to_complete_items +-- +1.7.0.1 + + +From 8359e3b259bc792accd59189e67a7d3335dcc9b2 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Fri, 4 Jun 2010 11:01:33 -0400 +Subject: [PATCH 161] make sure we add our '\n's in the right place to keep the xml output 'pretty' + +closes rh bug: https://bugzilla.redhat.com/show_bug.cgi?id=600201 +--- + yum/packages.py | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index 4687cd3..aedabe6 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -1039,7 +1039,10 @@ class YumAvailablePackage(PackageObject, RpmBase): + msg += self._dump_pco('conflicts') + msg += self._dump_pco('obsoletes') + msg += self._dump_files(True) +- msg += """\n """ ++ if msg[-1] != '\n': ++ msg += """\n""" ++ msg += """ """ ++ + return msg - for (ndata, nmdtype) in downloading_with_size + downloading_no_size: - local = self._get_mdtype_fname(ndata, False) -- if nmdtype.endswith("_db"): # Uncompress any .sqlite.bz2 files -+ if nmdtype.endswith("_db"): # Uncompress any compressed files - dl_local = local -- local = local.replace('.bz2', '') -- misc.bunzipFile(dl_local, local) -+ local = misc.decompress(dl_local) - misc.unlink_f(dl_local) - self._oldRepoMDData['new_MD_files'].append(local) + def _dump_pco(self, pcotype): +@@ -1065,7 +1068,7 @@ class YumAvailablePackage(PackageObject, RpmBase): + return msg + + def _dump_files(self, primary=False): +- msg ="" ++ msg ="\n" + if not primary: + files = self.returnFileEntries('file') + dirs = self.returnFileEntries('dir') +-- +1.7.0.1 + + +From 362533435e38d395ff0a61440b7e02acd5bfd68a Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 4 Jun 2010 11:31:52 -0400 +Subject: [PATCH 162] Speedup large list output, like "yum list installed" + +--- + output.py | 25 ++++++++++++++++--------- + 1 files changed, 16 insertions(+), 9 deletions(-) + +diff --git a/output.py b/output.py +index be4d1e8..0f6395c 100755 +--- a/output.py ++++ b/output.py +@@ -452,8 +452,10 @@ class YumOutput: + (hibeg, hiend) = self._highlight(highlight) + return (val, width, hibeg, hiend) + +- def fmtColumns(self, columns, msg=u'', end=u''): +- """ Return a string for columns of data, which can overflow.""" ++ def fmtColumns(self, columns, msg=u'', end=u'', text_width=utf8_width): ++ """ Return a string for columns of data, which can overflow. ++ text_width parameter finds the width of columns, this defaults to ++ utf8 but can be changed to len() if you know it'll be fine. """ + + total_width = len(msg) + data = [] +@@ -466,11 +468,16 @@ class YumOutput: + continue -@@ -1518,15 +1513,17 @@ class YumRepository(Repository, config.RepoConf): - """ Internal function, use .retrieveMD() from outside yum. """ - # Note that this can raise Errors.RepoMDError if mdtype doesn't exist - # for this repo. -+ # FIXME - maybe retrieveMD should call decompress() after we've checked -+ # the checksum by default? since we're never acting on compressed MD - thisdata = self.repoXML.getData(mdtype) + (align, width) = self._fmt_column_align_width(width) +- if utf8_width(val) <= width: +- msg += u"%s " +- val = utf8_width_fill(val, width, left=(align == u'-'), +- prefix=hibeg, suffix=hiend) +- data.append(val) ++ val_width = text_width(val) ++ if val_width <= width: ++ # Don't use utf8_width_fill() because it sucks performance ++ # wise for 1,000s of rows. Also allows us to use len(), when ++ # we can. ++ msg += u"%s%s%s%s " ++ if (align == u'-'): ++ data.extend([hibeg, val, " " * (width - val_width), hiend]) ++ else: ++ data.extend([hibeg, " " * (width - val_width), val, hiend]) + else: + msg += u"%s%s%s\n" + " " * (total_width + width + 1) + data.extend([hibeg, val, hiend]) +@@ -495,7 +502,7 @@ class YumOutput: + hi_cols = [highlight, 'normal', 'normal'] + rid = pkg.ui_from_repo + columns = zip((na, ver, rid), columns, hi_cols) +- print self.fmtColumns(columns) ++ print self.fmtColumns(columns, text_width=len) + + def simpleEnvraList(self, pkg, ui_overflow=False, + indent='', highlight=False, columns=None): +@@ -508,7 +515,7 @@ class YumOutput: + hi_cols = [highlight, 'normal', 'normal'] + rid = pkg.ui_from_repo + columns = zip((envra, rid), columns, hi_cols) +- print self.fmtColumns(columns) ++ print self.fmtColumns(columns, text_width=len) + + def fmtKeyValFill(self, key, val): + """ Return a key value pair in the common two column output format. """ +-- +1.7.0.1 + + +From 36a771181558ba647d6b99c71706c1134d61c162 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 4 Jun 2010 11:35:50 -0400 +Subject: [PATCH 163] Always try searchNames() in rpm, because .dbMatch('name') is so damn fast. + +--- + yum/rpmsack.py | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +diff --git a/yum/rpmsack.py b/yum/rpmsack.py +index fd7cc1f..f59abf9 100644 +--- a/yum/rpmsack.py ++++ b/yum/rpmsack.py +@@ -458,7 +458,9 @@ class RPMDBPackageSack(PackageSackBase): + + # See if we can load the "patterns" via. dbMatch('name', ...) because + # that's basically instant and walking the entire rpmdb isn't. +- if not self._completely_loaded and patterns and not ignore_case: ++ # We assume that if we get "Yum" and _something_ matches, that we have ++ # _all_ the matches. IOW there can be either Yum or yum, but not BOTH. ++ if not self._completely_loaded and patterns: + ret = [] + for pat in patterns: + # We aren't wasting anything here, because the next bit +-- +1.7.0.1 + + +From 560dd59471c8508d8f8d7465d6ebf7e135139a6f Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 4 Jun 2010 16:43:33 -0400 +Subject: [PATCH 164] Catch+rethrow ValueError as well as KeyError, accessing rpm hdr attribs. + +--- + yum/packages.py | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index 4687cd3..a696922 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -1269,6 +1269,10 @@ class YumHeaderPackage(YumAvailablePackage): + # Note above, API break to fix this ... this at least is a nicer + # msg. so we know what we accessed that is bad. + raise KeyError, "%s has no attribute %s" % (self, thing) ++ except ValueError: ++ # Note above, API break to fix this ... this at least is a nicer ++ # msg. so we know what we accessed that is bad. ++ raise ValueError, "%s has no attribute %s" % (self, thing) + + def doepoch(self): + tmpepoch = self.hdr['epoch'] +-- +1.7.0.1 + + +From 089c9b097bfaa83eb7e6113476fd1ccab1589794 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Mon, 7 Jun 2010 10:34:02 -0400 +Subject: [PATCH 165] add 'localupdate' as a completeable command + +--- + etc/yum.bash | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/etc/yum.bash b/etc/yum.bash +index 0fcba24..3e6e243 100644 +--- a/etc/yum.bash ++++ b/etc/yum.bash +@@ -81,7 +81,7 @@ _yum() + local prev=$3 + local cmds=( check check-update clean deplist downgrade groupinfo + groupinstall grouplist groupremove help history info install list +- localinstall makecache provides reinstall remove repolist resolvedep ++ localinstall localupdate makecache provides reinstall remove repolist resolvedep + search shell update upgrade version distro-sync ) - (r_base, remote) = thisdata.location - fname = os.path.basename(remote) - local = self.cachedir + '/' + fname + local i c cmd +-- +1.7.0.1 + + +From 7f86261c17f634bef29bb0d74e3131d435497f87 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 7 Jun 2010 15:01:29 -0400 +Subject: [PATCH 166] Remove giant comment of old code + +--- + yum/sqlitesack.py | 47 ----------------------------------------------- + 1 files changed, 0 insertions(+), 47 deletions(-) + +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 92b98ce..9accbb1 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -1369,53 +1369,6 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + # If it is a filename, search the files.xml file info + results.extend(self.searchFiles(n)) + return misc.unique(results) +- +- +- #~ #FIXME - comment this all out below here +- #~ for (rep,cache) in self.filelistsdb.items(): +- #~ cur = cache.cursor() +- #~ (dirname,filename) = os.path.split(name) +- #~ # FIXME: why doesn't this work??? +- #~ if 0: # name.find('%') == -1: # no %'s in the thing safe to LIKE +- #~ executeSQL(cur, "select packages.pkgId as pkgId,\ +- #~ filelist.dirname as dirname,\ +- #~ filelist.filetypes as filetypes,\ +- #~ filelist.filenames as filenames \ +- #~ from packages,filelist where \ +- #~ (filelist.dirname LIKE ? \ +- #~ OR (filelist.dirname LIKE ? AND\ +- #~ filelist.filenames LIKE ?))\ +- #~ AND (filelist.pkgKey = packages.pkgKey)", (name,dirname,filename)) +- #~ else: +- #~ executeSQL(cur, "select packages.pkgId as pkgId,\ +- #~ filelist.dirname as dirname,\ +- #~ filelist.filetypes as filetypes,\ +- #~ filelist.filenames as filenames \ +- #~ from filelist,packages where dirname = ? AND filelist.pkgKey = packages.pkgKey" , (dirname,)) +- +- #~ matching_ids = [] +- #~ for res in cur: +- #~ if self._excluded(rep, res['pkgId']): +- #~ continue +- +- #~ #FIXME - optimize the look up here by checking for single-entry filenames +- #~ quicklookup = {} +- #~ for fn in decodefilenamelist(res['filenames']): +- #~ quicklookup[fn] = 1 +- +- #~ # If it matches the dirname, that doesnt mean it matches +- #~ # the filename, check if it does +- #~ if filename and filename not in quicklookup: +- #~ continue +- +- #~ matching_ids.append(str(res['pkgId'])) +- +- +- #~ pkgs = self._getListofPackageDetails(matching_ids) +- #~ for pkg in pkgs: +- #~ results.append(self.pc(rep,pkg)) +- +- #~ return results -- if self.retrieved.has_key(mdtype): -- if self.retrieved[mdtype]: # got it, move along -- return local -+ if self.retrieved.get(mdtype): -+ # got it, move along -+ return local + def searchProvides(self, name): + """return list of packages providing name (any evr and flag)""" +-- +1.7.0.1 + + +From 23ae8058062325c84557edac28eb13494063e915 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 7 Jun 2010 15:09:48 -0400 +Subject: [PATCH 167] Split each install/update/remove/reinstall/downgrade to their own test+print + +--- + output.py | 27 +++++++++++++++++---------- + 1 files changed, 17 insertions(+), 10 deletions(-) + +diff --git a/output.py b/output.py +index 0f6395c..a89643f 100755 +--- a/output.py ++++ b/output.py +@@ -1057,22 +1057,29 @@ Transaction Summary + out.append(summary) + num_in = len(self.tsInfo.installed + self.tsInfo.depinstalled) + num_up = len(self.tsInfo.updated + self.tsInfo.depupdated) +- summary = _("""\ +-Install %5.5s Package(s) +-Upgrade %5.5s Package(s) +-""") % (num_in, num_up,) +- if num_in or num_up: # Always do this? +- out.append(summary) + num_rm = len(self.tsInfo.removed + self.tsInfo.depremoved) + num_re = len(self.tsInfo.reinstalled) + num_dg = len(self.tsInfo.downgraded) +- summary = _("""\ ++ if num_in: ++ out.append(_("""\ ++Install %5.5s Package(s) ++""") % num_in) ++ if num_up: ++ out.append(_("""\ ++Upgrade %5.5s Package(s) ++""") % num_up) ++ if num_rm: ++ out.append(_("""\ + Remove %5.5s Package(s) ++""") % num_rm) ++ if num_re: ++ out.append(_("""\ + Reinstall %5.5s Package(s) ++""") % num_re) ++ if num_dg: ++ out.append(_("""\ + Downgrade %5.5s Package(s) +-""") % (num_rm, num_re, num_dg) +- if num_rm or num_re or num_dg: +- out.append(summary) ++""") % num_dg) + + return ''.join(out) + +-- +1.7.0.1 + + +From 792737c8caf880c1fa13a1c61f48ed90be72352e Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 7 Jun 2010 15:59:47 -0400 +Subject: [PATCH 168] Don't do chain removals on downgrades, just fail, BZ 592726. + +--- + yum/depsolve.py | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 8c260a7..13d5d31 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -808,6 +808,14 @@ class Depsolve(object): + + missing_in_pkg = False + for po, dep in thisneeds: ++ if txmbr.downgraded_by: # Don't try to chain remove downgrades ++ msg = self._err_missing_requires(po, dep) ++ self.verbose_logger.log(logginglevels.DEBUG_2, msg) ++ errors.append(msg) ++ self.po_with_problems.add((po,self._working_po,errors[-1])) ++ missing_in_pkg = 1 ++ continue ++ + (checkdep, missing, errormsgs) = self._processReq(po, dep) + CheckDeps |= checkdep + errors += errormsgs +-- +1.7.0.1 + + +From 7306e639394f61f8bd766aa49f5524e7ea9a8923 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Mon, 7 Jun 2010 16:03:14 -0400 +Subject: [PATCH 169] Add a downgrade state, for users (changes what dsCallback.pkgAdded() gets). + +--- + output.py | 3 ++- + yum/depsolve.py | 17 +++++++++++++---- + 2 files changed, 15 insertions(+), 5 deletions(-) + +diff --git a/output.py b/output.py +index a89643f..060eaab 100755 +--- a/output.py ++++ b/output.py +@@ -1705,7 +1705,8 @@ class DepSolveProgressCallBack: + modedict = { 'i': _('installed'), + 'u': _('updated'), + 'o': _('obsoleted'), +- 'e': _('erased')} ++ 'e': _('erased'), ++ 'd': _('downgraded')} + (n, a, e, v, r) = pkgtup + modeterm = modedict[mode] + self.verbose_logger.log(logginglevels.INFO_2, +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 13d5d31..fe34a9c 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -225,14 +225,20 @@ class Depsolve(object): + self.ts.addInstall(hdr, (hdr, rpmfile), txmbr.ts_state) + self.verbose_logger.log(logginglevels.DEBUG_1, + _('Adding Package %s in mode %s'), txmbr.po, txmbr.ts_state) +- if self.dsCallback: +- self.dsCallback.pkgAdded(txmbr.pkgtup, txmbr.ts_state) ++ if self.dsCallback: ++ ts_state = txmbr.ts_state ++ if ts_state == 'u' and txmbr.downgrades: ++ ts_state = 'd' ++ self.dsCallback.pkgAdded(txmbr.pkgtup, ts_state) + + elif txmbr.ts_state in ['e']: + if (txmbr.pkgtup, txmbr.ts_state) in ts_elem: + continue + self.ts.addErase(txmbr.po.idx) +- if self.dsCallback: self.dsCallback.pkgAdded(txmbr.pkgtup, 'e') ++ if self.dsCallback: ++ if txmbr.downgraded_by: ++ continue ++ self.dsCallback.pkgAdded(txmbr.pkgtup, 'e') + self.verbose_logger.log(logginglevels.DEBUG_1, + _('Removing Package %s'), txmbr.po) + +@@ -786,7 +792,10 @@ class Depsolve(object): + for txmbr in self.tsInfo.getUnresolvedMembers(): + + if self.dsCallback and txmbr.ts_state: +- self.dsCallback.pkgAdded(txmbr.pkgtup, txmbr.ts_state) ++ ts_state = txmbr.ts_state ++ if txmbr.downgrades: ++ ts_state = 'd' ++ self.dsCallback.pkgAdded(txmbr.pkgtup, ts_state) + self.verbose_logger.log(logginglevels.DEBUG_2, + _("Checking deps for %s") %(txmbr,)) + +-- +1.7.0.1 + + +From 86ff685d20eab9ed40231f77ef0457e93f77e0e8 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Tue, 8 Jun 2010 11:18:59 -0400 +Subject: [PATCH 170] Deal with local pkgs that only obsolete something installed, BZ 600969. + +--- + yum/__init__.py | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index eaeb275..70294ba 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -3490,8 +3490,8 @@ class YumBase(depsolve.Depsolve): + for obsoleting_pkg in packagesNewestByName(obs_pkgs): + tx_return.extend(self.install(po=obsoleting_pkg)) + for available_pkg in availpkgs: +- for obsoleted in self.up.obsoleting_dict.get(available_pkg.pkgtup, []): +- obsoleted_pkg = self.getInstalledPackageObject(obsoleted) ++ for obsoleted_pkg in self._find_obsoletees(available_pkg): ++ obsoleted = obsoleted_pkg.pkgtup + txmbr = self.tsInfo.addObsoleting(available_pkg, obsoleted_pkg) + if requiringPo: + txmbr.setAsDep(requiringPo) +@@ -3736,7 +3736,9 @@ class YumBase(depsolve.Depsolve): + # be fixed later but a fair bit of that is a pebkac and should be + # said as "don't do that". potential 'fixme' + for txmbr in tx_return: +- if txmbr.po.obsoletes: ++ # We don't want to do this twice, so only bother if the txmbr ++ # doesn't already obsolete anything. ++ if txmbr.po.obsoletes and not txmbr.obsoletes: + for obs_pkg in self._find_obsoletees(txmbr.po): + self.tsInfo.addObsoleted(obs_pkg, txmbr.po) + txmbr.obsoletes.append(obs_pkg) +-- +1.7.0.1 + + +From e86de7f34475cffa4445244ef0cd6bfc8bf6cfb6 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 9 Jun 2010 12:44:48 -0400 +Subject: [PATCH 171] Explain that we use history internally, and so what turning it off does + +--- + docs/yum.conf.5 | 11 +++++++++++ + 1 files changed, 11 insertions(+), 0 deletions(-) + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index 5f1a5c7..37ab23e 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -305,6 +305,17 @@ lot of information about what has happened before, and display it to the user + with the history info/list/summary commands. yum also provides the + history undo/redo commands. Defaults to True. + ++Note that if history is recorded, yum uses that information to see if any ++modifications to the rpmdb have been done outside of yum. These are always bad, ++from yum's point of view, and so yum will issue a warning and automatically ++run some of "yum check" to try and find some of the worst problems altering ++the rpmdb might have caused. ++.IP ++This means that turning this option off will stop yum from being able to ++detect when the rpmdb has changed and thus. it will never warn you or ++automatically run "yum check". The problems will likely still be there, and ++yumdb etc. will still be wrong but yum will not warn you about it. ++ + .IP + \fBhistory_record_packages \fR + This is a list of package names that should be recorded as having helped the +-- +1.7.0.1 + + +From 344300ab4588a20ad0624c2d6610f1a313358661 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Wed, 9 Jun 2010 12:56:44 -0400 +Subject: [PATCH 172] Add *verifytrans plugin hooks, so yumdb can be altered from plugins. BZ 602354. + +--- + yum/__init__.py | 2 ++ + yum/plugins.py | 2 ++ + 2 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 70294ba..fa26e62 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1381,6 +1381,7 @@ class YumBase(depsolve.Depsolve): + # and the install reason - if self.cache == 1: - if os.path.exists(local): -@@ -1552,9 +1549,17 @@ class YumRepository(Repository, config.RepoConf): - try: - checkfunc = (self.checkMD, (mdtype,), {}) - text = "%s/%s" % (self.id, mdtype) -+ if thisdata.size is None: -+ reget = None -+ else: -+ reget = 'simple' -+ if os.path.exists(local): -+ if os.stat(local).st_size >= int(thisdata.size): -+ misc.unlink_f(local) - local = self._getFile(relative=remote, - local=local, - copy_local=1, -+ reget=reget, - checkfunc=checkfunc, - text=text, - cache=self.http_caching == 'all', -@@ -1762,9 +1767,9 @@ class YumRepository(Repository, config.RepoConf): + self.rpmdb.dropCachedData() ++ self.plugins.run('preverifytrans') + for txmbr in self.tsInfo: + if txmbr.output_state in TS_INSTALL_STATES: + if not self.rpmdb.contains(po=txmbr.po): +@@ -1433,6 +1434,7 @@ class YumBase(depsolve.Depsolve): + else: + self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po) - grpfile = self.getGroups() ++ self.plugins.run('postverifytrans') + if self.conf.history_record: + ret = -1 + if resultobject is not None: +diff --git a/yum/plugins.py b/yum/plugins.py +index 9968614..c8ed4ab 100644 +--- a/yum/plugins.py ++++ b/yum/plugins.py +@@ -89,6 +89,8 @@ SLOT_TO_CONDUIT = { + 'clean': 'PluginConduit', + 'pretrans': 'MainPluginConduit', + 'posttrans': 'MainPluginConduit', ++ 'preverifytrans': 'MainPluginConduit', ++ 'postverifytrans': 'MainPluginConduit', + 'exclude': 'MainPluginConduit', + 'preresolve': 'DepsolvePluginConduit', + 'postresolve': 'DepsolvePluginConduit', +-- +1.7.0.1 + + +From 4f71bfd15ce8d51ba1ef815fe4518faeff014898 Mon Sep 17 00:00:00 2001 +From: Paolo Abeni +Date: Thu, 10 Jun 2010 10:35:23 -0400 +Subject: [PATCH 173] Remove assignment of Depsolve aka. YumBase to packages.base + +--- + yum/depsolve.py | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index fe34a9c..322c412 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -66,7 +66,6 @@ class Depsolve(object): + """ -- # open it up as a file object so iterparse can cope with our gz file -- if grpfile is not None and grpfile.endswith('.gz'): -- grpfile = gzip.open(grpfile) -+ # open it up as a file object so iterparse can cope with our compressed file -+ if grpfile is not None: -+ grpfile = misc.decompress(grpfile) - try: - c = comps.Comps() - c.add(grpfile) -diff --git a/yumcommands.py b/yumcommands.py -index 35bd97c..dcf72db 100644 ---- a/yumcommands.py -+++ b/yumcommands.py -@@ -205,6 +205,28 @@ class UpdateCommand(YumCommand): - except yum.Errors.YumBaseError, e: - return 1, [str(e)] + def __init__(self): +- packages.base = self + self._ts = None + self._tsInfo = None + self.dsCallback = None +-- +1.7.0.1 + + +From 86723b4adfc221193815843a0b2125acd9bbf488 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 10 Jun 2010 15:02:37 -0400 +Subject: [PATCH 174] Tell the dsCallback() when ts_state==u that it's really an install, when it is. + +--- + yum/depsolve.py | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 322c412..740520f 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -794,6 +794,8 @@ class Depsolve(object): + ts_state = txmbr.ts_state + if txmbr.downgrades: + ts_state = 'd' ++ if ts_state == 'u' and not txmbr.updates: ++ ts_state = 'i' + self.dsCallback.pkgAdded(txmbr.pkgtup, ts_state) + self.verbose_logger.log(logginglevels.DEBUG_2, + _("Checking deps for %s") %(txmbr,)) +-- +1.7.0.1 + + +From d811095362ca48da0c7d59b1582f8495ff07932c Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 10 Jun 2010 15:14:01 -0400 +Subject: [PATCH 175] Make the callback ts_state var name less confusing :) + +--- + yum/depsolve.py | 18 +++++++++--------- + 1 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 740520f..c197b7f 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -225,10 +225,10 @@ class Depsolve(object): + self.verbose_logger.log(logginglevels.DEBUG_1, + _('Adding Package %s in mode %s'), txmbr.po, txmbr.ts_state) + if self.dsCallback: +- ts_state = txmbr.ts_state +- if ts_state == 'u' and txmbr.downgrades: +- ts_state = 'd' +- self.dsCallback.pkgAdded(txmbr.pkgtup, ts_state) ++ dscb_ts_state = txmbr.ts_state ++ if dscb_ts_state == 'u' and txmbr.downgrades: ++ dscb_ts_state = 'd' ++ self.dsCallback.pkgAdded(txmbr.pkgtup, dscb_ts_state) + + elif txmbr.ts_state in ['e']: + if (txmbr.pkgtup, txmbr.ts_state) in ts_elem: +@@ -791,12 +791,12 @@ class Depsolve(object): + for txmbr in self.tsInfo.getUnresolvedMembers(): + + if self.dsCallback and txmbr.ts_state: +- ts_state = txmbr.ts_state ++ dscb_ts_state = txmbr.ts_state + if txmbr.downgrades: +- ts_state = 'd' +- if ts_state == 'u' and not txmbr.updates: +- ts_state = 'i' +- self.dsCallback.pkgAdded(txmbr.pkgtup, ts_state) ++ dscb_ts_state = 'd' ++ if dscb_ts_state == 'u' and not txmbr.updates: ++ dscb_ts_state = 'i' ++ self.dsCallback.pkgAdded(txmbr.pkgtup, dscb_ts_state) + self.verbose_logger.log(logginglevels.DEBUG_2, + _("Checking deps for %s") %(txmbr,)) + +-- +1.7.0.1 + + +From 55d5b5bf45e296a911a7a09a11760aae71ea4be3 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 10 Jun 2010 16:36:59 -0400 +Subject: [PATCH 176] Add caching getloginuid, so we can use it outside of history + +--- + yum/misc.py | 12 +++++++++++- + 1 files changed, 11 insertions(+), 1 deletions(-) + +diff --git a/yum/misc.py b/yum/misc.py +index 921b95c..35b8056 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -899,7 +899,7 @@ def unlink_f(filename): + if e.errno != errno.ENOENT: + raise + +-def getloginuid(): ++def _getloginuid(): + """ Get the audit-uid/login-uid, if available. None is returned if there + was a problem. Note that no caching is done here. """ + # We might normally call audit.audit_getloginuid(), except that requires +@@ -914,6 +914,16 @@ def getloginuid(): + except ValueError: + return None -+class DistroSyncCommand(YumCommand): -+ def getNames(self): -+ return ['distribution-synchronization', 'distro-sync'] -+ -+ def getUsage(self): -+ return _("[PACKAGE...]") ++_cached_getloginuid = None ++def getloginuid(): ++ """ Get the audit-uid/login-uid, if available. None is returned if there ++ was a problem. The value is cached, so you don't have to save it. """ ++ global _cached_getloginuid ++ if _cached_getloginuid is None: ++ _cached_getloginuid = _getloginuid() ++ return _cached_getloginuid + -+ def getSummary(self): -+ return _("Synchronize installed packages to the latest available versions") + -+ def doCheck(self, base, basecmd, extcmds): -+ checkRootUID(base) -+ checkGPGKey(base) + # ---------- i18n ---------- + import locale + import sys +-- +1.7.0.1 + + +From d57bdd6ba7f3f47cb88733615ad6a89344423964 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 10 Jun 2010 16:37:39 -0400 +Subject: [PATCH 177] Save loginuids of installed_by and changed_by to the yumdb + +--- + yum/__init__.py | 24 +++++++++++++++++++++++- + 1 files changed, 23 insertions(+), 1 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index fa26e62..8e58124 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1419,7 +1419,29 @@ class YumBase(depsolve.Depsolve): + po.yumdb_info.from_repo_revision = str(md.revision) + if md: + po.yumdb_info.from_repo_timestamp = str(md.timestamp) +- + -+ def doCommand(self, base, basecmd, extcmds): -+ self.doneCommand(base, _("Setting up Distribution Synchronization Process")) -+ try: -+ base.conf.obsoletes = 1 -+ return base.distroSyncPkgs(extcmds) -+ except yum.Errors.YumBaseError, e: -+ return 1, [str(e)] ++ loginuid = misc.getloginuid() ++ if loginuid is None: ++ continue ++ loginuid = str(loginuid) ++ if (txmbr.updates or txmbr.downgrades or ++ (hasattr(txmbr, 'reinstall') and txmbr.reinstall)): ++ if txmbr.updates: ++ opo = txmbr.updates[0] ++ elif txmbr.downgrades: ++ opo = txmbr.downgrades[0] ++ else: ++ opo = po ++ if 'installed_by' in opo.yumdb_info: ++ po.yumdb_info.installed_by = opo.yumdb_info.installed_by ++ po.yumdb_info.changed_by = loginuid ++ else: ++ po.yumdb_info.installed_by = loginuid + - def _add_pkg_simple_list_lens(data, pkg, indent=''): - """ Get the length of each pkg's column. Add that to data. - This "knows" about simpleList and printVer. """ -@@ -1207,7 +1229,7 @@ class VersionCommand(YumCommand): - lastdbv = base.history.last() - if lastdbv is not None: - lastdbv = lastdbv.end_rpmdbversion -- if lastdbv is None or data[0] != lastdbv: -+ if lastdbv is not None and data[0] != lastdbv: - base._rpmdb_warn_checks(warn=lastdbv is not None) - if vcmd not in ('group-installed', 'group-all'): - cols.append(("%s %s/%s" % (_("Installed:"), rel, ba), -@@ -1215,6 +1237,9 @@ class VersionCommand(YumCommand): - _append_repos(cols, data[1]) - if groups: - for grp in sorted(data[2]): -+ if (vcmd.startswith("group-") and -+ len(extcmds) > 1 and grp not in extcmds[1:]): -+ continue - cols.append(("%s %s" % (_("Group-Installed:"), grp), - str(data[2][grp]))) - _append_repos(cols, data[3][grp]) -@@ -1230,6 +1255,9 @@ class VersionCommand(YumCommand): - _append_repos(cols, data[1]) - if groups: - for grp in sorted(data[2]): -+ if (vcmd.startswith("group-") and -+ len(extcmds) > 1 and grp not in extcmds[1:]): -+ continue - cols.append(("%s %s" % (_("Group-Available:"), grp), - str(data[2][grp]))) - if verbose: -@@ -1347,13 +1375,14 @@ class CheckRpmdbCommand(YumCommand): - def doCommand(self, base, basecmd, extcmds): - chkcmd = 'all' - if extcmds: -- chkcmd = extcmds[0] -+ chkcmd = extcmds - - def _out(x): - print x - - rc = 0 -- if base._rpmdb_warn_checks(_out, False, chkcmd): -+ if base._rpmdb_warn_checks(out=_out, warn=False, chkcmd=chkcmd, -+ header=lambda x: None): - rc = 1 - return rc, ['%s %s' % (basecmd, chkcmd)] - -diff --git a/yummain.py b/yummain.py -index 305e0c7..95c7462 100755 ---- a/yummain.py -+++ b/yummain.py -@@ -99,9 +99,13 @@ def main(args): - if "%s" %(e.msg,) != lockerr: - lockerr = "%s" %(e.msg,) - logger.critical(lockerr) -- logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit...")) -- show_lock_owner(e.pid, logger) -- time.sleep(2) -+ if not base.conf.exit_on_lock: -+ logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit...")) -+ show_lock_owner(e.pid, logger) -+ time.sleep(2) -+ else: -+ logger.critical(_("Another app is currently holding the yum lock; exiting as configured by exit_on_lock")) -+ return 1 - else: - break ++ # Remove old ones after installing new ones, so we can copy values. ++ for txmbr in self.tsInfo: ++ if txmbr.output_state in TS_INSTALL_STATES: ++ pass + elif txmbr.output_state in TS_REMOVE_STATES: + if self.rpmdb.contains(po=txmbr.po): + if not self.tsInfo.getMembersWithState(pkgtup=txmbr.pkgtup, +-- +1.7.0.1 + + +From 4b78fffbd9017b9606bfc476f4f30769813fcc90 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 10 Jun 2010 16:46:17 -0400 +Subject: [PATCH 178] Make .reinstall a real txmbr attribute + +--- + yum/__init__.py | 3 +-- + yum/transactioninfo.py | 14 +++++++++++--- + 2 files changed, 12 insertions(+), 5 deletions(-) + +diff --git a/yum/__init__.py b/yum/__init__.py +index 8e58124..1d7637f 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1424,8 +1424,7 @@ class YumBase(depsolve.Depsolve): + if loginuid is None: + continue + loginuid = str(loginuid) +- if (txmbr.updates or txmbr.downgrades or +- (hasattr(txmbr, 'reinstall') and txmbr.reinstall)): ++ if txmbr.updates or txmbr.downgrades or txmbr.reinstall: + if txmbr.updates: + opo = txmbr.updates[0] + elif txmbr.downgrades: +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index d574b80..b8e4564 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -349,8 +349,7 @@ class TransactionData: + self.updated.append(txmbr) + + elif txmbr.output_state in (TS_INSTALL, TS_TRUEINSTALL): +- if include_reinstall and self.rpmdb.contains(po=txmbr.po): +- txmbr.reinstall = True ++ if include_reinstall and txmbr.reinstall: + self.reinstalled.append(txmbr) + continue +@@ -416,6 +415,10 @@ class TransactionData: + txmbr.po.state = TS_INSTALL + txmbr.ts_state = 'u' + txmbr.reason = 'user' ++ ++ if self.rpmdb.contains(po=txmbr.po): ++ txmbr.reinstall = True ++ + self.add(txmbr) + return txmbr + +@@ -506,6 +509,10 @@ class TransactionData: + txmbr.ts_state = 'u' + txmbr.relatedto.append((oldpo, 'obsoletes')) + txmbr.obsoletes.append(oldpo) ++ ++ if self.rpmdb.contains(po=txmbr.po): ++ txmbr.reinstall = True ++ + self.add(txmbr) + return txmbr + +@@ -607,7 +614,7 @@ class TransactionData: + for txmbr in self.getMembersWithState(None, TS_INSTALL_STATES): + # reinstalls have to use their "new" checksum data, in case it's + # different. +- if hasattr(txmbr, 'reinstall') and txmbr.reinstall: ++ if txmbr.reinstall: + _reinstalled_pkgtups[txmbr.po.pkgtup] = txmbr.po + pkgs.append(txmbr.po) + +@@ -720,6 +727,7 @@ class TransactionMember: + self.updated_by = [] + self.downgrades = [] + self.downgraded_by = [] ++ self.reinstall = False + self.groups = [] # groups it's in + self._poattr = ['pkgtup', 'repoid', 'name', 'arch', 'epoch', 'version', + 'release'] +-- +1.7.0.1 + + +From 385390f028af11de7af7fec336014b1c83709710 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Thu, 10 Jun 2010 16:47:23 -0400 +Subject: [PATCH 179] Add a dsCallback "r" state for reinstalled, as we are doing downgrade + +--- + output.py | 1 + + yum/depsolve.py | 2 ++ + 2 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/output.py b/output.py +index 060eaab..05a4e83 100755 +--- a/output.py ++++ b/output.py +@@ -1706,6 +1706,7 @@ class DepSolveProgressCallBack: + 'u': _('updated'), + 'o': _('obsoleted'), + 'e': _('erased'), ++ 'r': _('reinstalled'), + 'd': _('downgraded')} + (n, a, e, v, r) = pkgtup + modeterm = modedict[mode] +diff --git a/yum/depsolve.py b/yum/depsolve.py +index c197b7f..b661191 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -794,6 +794,8 @@ class Depsolve(object): + dscb_ts_state = txmbr.ts_state + if txmbr.downgrades: + dscb_ts_state = 'd' ++ if dscb_ts_state == 'u' and txmbr.reinstall: ++ dscb_ts_state = 'r' + if dscb_ts_state == 'u' and not txmbr.updates: + dscb_ts_state = 'i' + self.dsCallback.pkgAdded(txmbr.pkgtup, dscb_ts_state) +-- +1.7.0.1 + + +From a336b5c283acf275310fc0e5b53e5299dcf044ce Mon Sep 17 00:00:00 2001 +From: Toshio Kuratomi +Date: Thu, 10 Jun 2010 17:09:36 -0400 +Subject: [PATCH 180] Fix for UnicodeWarning when comparing provides, BZ 570819. + +--- + yum/sqlitesack.py | 14 ++++++++++---- + 1 files changed, 10 insertions(+), 4 deletions(-) + +diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py +index 9accbb1..820f003 100644 +--- a/yum/sqlitesack.py ++++ b/yum/sqlitesack.py +@@ -1324,8 +1324,14 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + (n,f,(e,v,r)) = misc.string_to_prco_tuple(name) + except Errors.MiscError, e: + raise Errors.PackageSackError, to_unicode(e) +- +- n = to_unicode(n) ++ ++ # The _b means this is a byte string ++ # The _u means this is a unicode string ++ # A bare n is used when, it's unicode but hasn't been evaluated ++ # whether that's actually the right thing to do ++ n_b = n ++ n_u = to_unicode(n) ++ n = n_u + + glob = True + querytype = 'glob' +@@ -1346,9 +1352,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack): + # file dep add all matches to the results + results.append(po) + continue +- ++ + if not glob: +- if po.checkPrco(prcotype, (n, f, (e,v,r))): ++ if po.checkPrco(prcotype, (n_b, f, (e,v,r))): + results.append(po) + else: + # if it is a glob we can't really get any closer to checking it +-- +1.7.0.1 + + +From 6adb022fd54b7232c7d4410313c029f8a3a87313 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 11 Jun 2010 00:57:47 -0400 +Subject: [PATCH 181] Fix typo info=>list + +--- + output.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/output.py b/output.py +index 05a4e83..4e8fbe9 100755 +--- a/output.py ++++ b/output.py +@@ -1333,7 +1333,7 @@ to exit. + + tids, printall = self._history_list_transactions(extcmds) + if tids is None: +- return 1, ['Failed history info'] ++ return 1, ['Failed history list'] + + fmt = "%s | %s | %s | %s | %s" + print fmt % (utf8_width_fill(_("ID"), 6, 6), +-- +1.7.0.1 + + +From 43deeed3f0755d36c30c41c08fd8703d5ffbdcbb Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 11 Jun 2010 01:18:02 -0400 +Subject: [PATCH 182] Add installed_by and changed_by to info -v + +--- + output.py | 46 ++++++++++++++++++++++++++++++---------------- + 1 files changed, 30 insertions(+), 16 deletions(-) + +diff --git a/output.py b/output.py +index 4e8fbe9..4a1e10e 100755 +--- a/output.py ++++ b/output.py +@@ -558,27 +558,41 @@ class YumOutput: + + def infoOutput(self, pkg, highlight=False): + (hibeg, hiend) = self._highlight(highlight) +- print _("Name : %s%s%s") % (hibeg, to_unicode(pkg.name), hiend) +- print _("Arch : %s") % to_unicode(pkg.arch) ++ print _("Name : %s%s%s") % (hibeg, to_unicode(pkg.name), hiend) ++ print _("Arch : %s") % to_unicode(pkg.arch) + if pkg.epoch != "0": +- print _("Epoch : %s") % to_unicode(pkg.epoch) +- print _("Version : %s") % to_unicode(pkg.version) +- print _("Release : %s") % to_unicode(pkg.release) +- print _("Size : %s") % self.format_number(float(pkg.size)) +- print _("Repo : %s") % to_unicode(pkg.repoid) ++ print _("Epoch : %s") % to_unicode(pkg.epoch) ++ print _("Version : %s") % to_unicode(pkg.version) ++ print _("Release : %s") % to_unicode(pkg.release) ++ print _("Size : %s") % self.format_number(float(pkg.size)) ++ print _("Repo : %s") % to_unicode(pkg.repoid) + if pkg.repoid == 'installed' and 'from_repo' in pkg.yumdb_info: +- print _("From repo : %s") % to_unicode(pkg.yumdb_info.from_repo) ++ print _("From repo : %s") % to_unicode(pkg.yumdb_info.from_repo) + if self.verbose_logger.isEnabledFor(logginglevels.DEBUG_3): +- print _("Committer : %s") % to_unicode(pkg.committer) +- print _("Committime : %s") % time.ctime(pkg.committime) +- print _("Buildtime : %s") % time.ctime(pkg.buildtime) ++ print _("Committer : %s") % to_unicode(pkg.committer) ++ print _("Committime : %s") % time.ctime(pkg.committime) ++ print _("Buildtime : %s") % time.ctime(pkg.buildtime) + if hasattr(pkg, 'installtime'): +- print _("Installtime: %s") % time.ctime(pkg.installtime) +- print self.fmtKeyValFill(_("Summary : "), self._enc(pkg.summary)) ++ print _("Install time: %s") % time.ctime(pkg.installtime) ++ uid = None ++ if 'installed_by' in pkg.yumdb_info: ++ try: ++ uid = int(pkg.yumdb_info.installed_by) ++ except ValueError: # In case int() fails ++ uid = None ++ print _("Installed by: %s") % self._pwd_ui_username(uid) ++ uid = None ++ if 'changed_by' in pkg.yumdb_info: ++ try: ++ uid = int(pkg.yumdb_info.changed_by) ++ except ValueError: # In case int() fails ++ uid = None ++ print _("Changed by : %s") % self._pwd_ui_username(uid) ++ print self.fmtKeyValFill(_("Summary : "), self._enc(pkg.summary)) + if pkg.url: +- print _("URL : %s") % to_unicode(pkg.url) +- print self.fmtKeyValFill(_("License : "), to_unicode(pkg.license)) +- print self.fmtKeyValFill(_("Description: "), self._enc(pkg.description)) ++ print _("URL : %s") % to_unicode(pkg.url) ++ print self.fmtKeyValFill(_("License : "), to_unicode(pkg.license)) ++ print self.fmtKeyValFill(_("Description : "),self._enc(pkg.description)) + print "" + + def updatesObsoletesList(self, uotup, changetype, columns=None): +-- +1.7.0.1 + + +From c087a15375776974bb7825dfb8558759755af569 Mon Sep 17 00:00:00 2001 +From: Seth Vidal +Date: Fri, 11 Jun 2010 10:42:29 -0400 +Subject: [PATCH 183] - optionally collapse libc.so.6 requires into highest requires (default sort order) + +our libc.so.6 requires are fairly redundant - 6 requires per pkg requiring glibc, on avg. +The highest versioned libc.so.6 requirement is good enough so remove the others. + +This cuts out about 17-20% of our requires +--- + yum/packages.py | 11 +++++++++++ + 1 files changed, 11 insertions(+), 0 deletions(-) + +diff --git a/yum/packages.py b/yum/packages.py +index 6c32106..98d4d38 100644 +--- a/yum/packages.py ++++ b/yum/packages.py +@@ -1098,6 +1098,17 @@ class YumAvailablePackage(PackageObject, RpmBase): + msg = "" + + if mylist: msg = "\n \n" ++ if hasattr(self, '_collapse_libc_requires') and self._collapse_libc_requires: ++ libc_requires = filter(lambda x: x[0].startswith('libc.so.6'), mylist) ++ if libc_requires: ++ best = sorted(libc_requires)[-1] ++ newlist = [] ++ for i in mylist: ++ if i[0].startswith('libc.so.6') and i != best: ++ continue ++ newlist.append(i) ++ mylist = newlist ++ + for (name, flags, (e,v,r),pre) in mylist: + if name.startswith('rpmlib('): + continue +-- +1.7.0.1 + + +From 0c4d027b73753e94c7928676a54bbe2135940409 Mon Sep 17 00:00:00 2001 +From: James Antill +Date: Fri, 11 Jun 2010 10:44:35 -0400 +Subject: [PATCH 184] Don't return None when transaction is empty in resolveDeps, BZ 603002 + +--- + yum/depsolve.py | 7 +++---- + 1 files changed, 3 insertions(+), 4 deletions(-) + +diff --git a/yum/depsolve.py b/yum/depsolve.py +index b661191..3e95626 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -776,10 +776,9 @@ class Depsolve(object): + self.verbose_logger.log(logginglevels.DEBUG_4," --> %s" % err) + return (1, errors) + +- if len(self.tsInfo) > 0: +- if not len(self.tsInfo): +- return (0, [_('Success - empty transaction')]) +- return (2, [_('Success - deps resolved')]) ++ if not len(self.tsInfo): ++ return (0, [_('Success - empty transaction')]) ++ return (2, [_('Success - deps resolved')]) + + def _resolveRequires(self, errors): + any_missing = False +-- +1.7.0.1 + diff --git a/yum.spec b/yum.spec index 2e80724..ba97f94 100644 --- a/yum.spec +++ b/yum.spec @@ -3,7 +3,7 @@ Summary: RPM installer/updater Name: yum Version: 3.2.27 -Release: 14%{?dist} +Release: 15%{?dist} License: GPLv2+ Group: System Environment/Base Source0: http://yum.baseurl.org/download/3.2/%{name}-%{version}.tar.gz @@ -132,6 +132,16 @@ rm -rf $RPM_BUILD_ROOT %dir /usr/lib/yum-plugins %changelog +* Fri Jun 11 2010 James Antill - 3.2.27-15 +- Latest head. +- Add filtering requires code for createrepo. +- Add installed_by/changed_by yumdb values. +- Tweak output for install/reinstall/downgrade callbacks. +- Add plugin hooks for pre/post verifytrans. +- Deal with local pkgs. which only obsolete. +- No chain removals on downgrade. +- Bunch of speedups for "list installed blah", and "remove blah". + * Wed Jun 2 2010 Seth Vidal - 3.2.27-14 - merge in latest yum head: - change decompressors to support lzma, if python module is available