Blob Blame History Raw
From cc5d13a39dcefbc401255d224c8700f4f907f285 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Mon, 22 Mar 2010 19:31:43 +0200
Subject: [PATCH 01/53] 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
 
 def logLevelFromErrorLevel(error_level):
     """ Convert an old-style error logging level to the new style. """
-- 
1.6.6.1


From 11dfde5e065e21c5bdb25a087501b90afe0b0dab Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Tue, 23 Mar 2010 10:09:20 -0400
Subject: [PATCH 02/53] 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):
 
         # 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))
 
         # 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.6.6.1


From c6f4d336bd6be5cdb575c94628da2eb7bcb900f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Mon, 22 Mar 2010 19:56:44 +0200
Subject: [PATCH 03/53] 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.6.6.1


From 40a53f0d3a8dd8ad4fb4802890e4f30b0214f3f9 Mon Sep 17 00:00:00 2001
From: Ville-Pekka Vainio <vpivaini@cs.helsinki.fi>
Date: Wed, 24 Mar 2010 12:37:03 +0000
Subject: [PATCH 04/53] 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 <vpivaini@cs.helsinki.fi>\n"
 "Language-Team: Finnish <laatu@lokalisointi.org>\n"
 "MIME-Version: 1.0\n"
@@ -156,15 +156,15 @@ msgstr "Ladataan paketteja:"
 msgid "Error Downloading Packages:\n"
 msgstr "Virhe pakettien latauksessa:\n"
 
-#: ../cli.py:426 ../yum/__init__.py:4194
+#: ../cli.py:426 ../yum/__init__.py:4195
 msgid "Running rpm_check_debug"
 msgstr "Suoritetaan rpm_check_debug"
 
-#: ../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ä:"
 
-#: ../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ä:"
 
@@ -339,7 +339,7 @@ msgstr "Saatavilla olevat ryhmät:"
 msgid "Done"
 msgstr "Valmis"
 
-#: ../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"
 
-#: ../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"
 
 #: ../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"
 
 #: ../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"
 
-#: ../yum/__init__.py:1485
+#: ../yum/__init__.py:1486
 msgid "Could not perform checksum"
 msgstr "Ei voitu laskea tarkistussummaa"
 
-#: ../yum/__init__.py:1488
+#: ../yum/__init__.py:1489
 msgid "Package does not match checksum"
 msgstr "Paketti ei vastaa tarkistussummaa"
 
-#: ../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
 #, python-format
 msgid "No Package found for %s"
 msgstr "Riippuvuudelle %s ei löytynyt pakettia"
 
-#: ../yum/__init__.py:2854
+#: ../yum/__init__.py:2855
 msgid "Package Object was not a package object instance"
 msgstr "Pakettiolio ei ollutkaan pakettiolioinstanssi"
 
-#: ../yum/__init__.py:2858
+#: ../yum/__init__.py:2859
 msgid "Nothing specified to install"
 msgstr "Mitään ei määritelty asennettavaksi"
 
-#: ../yum/__init__.py:2874 ../yum/__init__.py:3651
+#: ../yum/__init__.py:2875 ../yum/__init__.py:3652
 #, python-format
 msgid "Checking for virtual provide or file-provide for %s"
 msgstr "Etsitään virtuaalista tai tiedostotarjoajaa argumentille %s"
 
-#: ../yum/__init__.py:2880 ../yum/__init__.py:3196 ../yum/__init__.py:3364
-#: ../yum/__init__.py:3657
+#: ../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 "Mikään ei vastaa argumenttia: %s"
 
-#: ../yum/__init__.py:2956
+#: ../yum/__init__.py:2957
 #, python-format
 msgid "Package %s installed and not available"
 msgstr "Paketti %s on asennettu, mutta ei saatavilla"
 
-#: ../yum/__init__.py:2959
+#: ../yum/__init__.py:2960
 msgid "No package(s) available to install"
 msgstr "Yhtään pakettia ei ole saatavilla asennettavaksi"
 
-#: ../yum/__init__.py:2971
+#: ../yum/__init__.py:2972
 #, python-format
 msgid "Package: %s  - already in transaction set"
 msgstr "Paketti: %s – on jo transaktiojoukossa"
 
-#: ../yum/__init__.py:2997
+#: ../yum/__init__.py:2998
 #, python-format
 msgid "Package %s is obsoleted by %s which is already installed"
 msgstr "Paketin %s vanhentaa paketti %s, joka on jo asennettuna"
 
-#: ../yum/__init__.py:3000
+#: ../yum/__init__.py:3001
 #, python-format
 msgid "Package %s is obsoleted by %s, trying to install %s instead"
 msgstr "Paketin %s vanhentaa paketti %s, yritetään paketti %s sen sijaan"
 
-#: ../yum/__init__.py:3008
+#: ../yum/__init__.py:3009
 #, python-format
 msgid "Package %s already installed and latest version"
 msgstr "Paketti %s on jo asennettuna ja uusin versio"
 
-#: ../yum/__init__.py:3022
+#: ../yum/__init__.py:3023
 #, python-format
 msgid "Package matching %s already installed. Checking for update."
 msgstr ""
 "Pakettia %s vastaava paketti on jo asennettuna. Tarkistetaan päivitykset."
 
 #. update everything (the easy case)
-#: ../yum/__init__.py:3125
+#: ../yum/__init__.py:3126
 msgid "Updating Everything"
 msgstr "Päivitetään kaikki"
 
-#: ../yum/__init__.py:3146 ../yum/__init__.py:3261 ../yum/__init__.py:3288
-#: ../yum/__init__.py:3314
+#: ../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 "Vanhennettua pakettia ei päivitetä: %s.%s %s:%s-%s"
 
-#: ../yum/__init__.py:3181 ../yum/__init__.py:3361
+#: ../yum/__init__.py:3182 ../yum/__init__.py:3362
 #, python-format
 msgid "%s"
 msgstr "%s"
 
-#: ../yum/__init__.py:3252
+#: ../yum/__init__.py:3253
 #, python-format
 msgid "Package is already obsoleted: %s.%s %s:%s-%s"
 msgstr "Paketti on jo vanhennettu: %s.%s %s:%s-%s"
 
-#: ../yum/__init__.py:3283
+#: ../yum/__init__.py:3284
 #, python-format
 msgid "Not Updating Package that is obsoleted: %s"
 msgstr "Ei päivitetä vanhennettua pakettia: %s"
 
-#: ../yum/__init__.py:3292 ../yum/__init__.py:3318
+#: ../yum/__init__.py:3293 ../yum/__init__.py:3319
 #, python-format
 msgid "Not Updating Package that is already updated: %s.%s %s:%s-%s"
 msgstr "Jo päivitettyä pakettia ei enää päivitetä: %s.%s %s:%s-%s"
 
-#: ../yum/__init__.py:3377
+#: ../yum/__init__.py:3378
 msgid "No package matched to remove"
 msgstr "Yhtään poistopyyntöä vastaavaa pakettia ei ole"
 
-#: ../yum/__init__.py:3411
+#: ../yum/__init__.py:3412
 #, python-format
 msgid "Cannot open: %s. Skipping."
 msgstr "Ei voida avata pakettia: %s. Ohitetaan."
 
-#: ../yum/__init__.py:3414 ../yum/__init__.py:3513 ../yum/__init__.py:3597
+#: ../yum/__init__.py:3415 ../yum/__init__.py:3514 ../yum/__init__.py:3598
 #, python-format
 msgid "Examining %s: %s"
 msgstr "Tutkitaan %s: %s"
 
-#: ../yum/__init__.py:3422 ../yum/__init__.py:3516 ../yum/__init__.py:3600
+#: ../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 ""
 "Pakettia %s ei voida lisätä transaktioon. Arkkitehtuuri ei ole yhteensopiva: "
 "%s"
 
-#: ../yum/__init__.py:3430
+#: ../yum/__init__.py:3431
 #, python-format
 msgid ""
 "Package %s not installed, cannot update it. Run yum install to install it "
@@ -2478,109 +2481,109 @@ msgstr ""
 "Pakettia %s ei ole asennettu, sitä ei voida päivittää. Suorita yum install -"
 "komento paketin asentamiseksi."
 
-#: ../yum/__init__.py:3459 ../yum/__init__.py:3521 ../yum/__init__.py:3605
+#: ../yum/__init__.py:3460 ../yum/__init__.py:3522 ../yum/__init__.py:3606
 #, python-format
 msgid "Excluding %s"
 msgstr "Ohitetaan paketti %s"
 
-#: ../yum/__init__.py:3464
+#: ../yum/__init__.py:3465
 #, python-format
 msgid "Marking %s to be installed"
 msgstr "Merkitään paketti %s asennettavaksi"
 
-#: ../yum/__init__.py:3470
+#: ../yum/__init__.py:3471
 #, python-format
 msgid "Marking %s as an update to %s"
 msgstr "Merkitään paketti %s päivitykseksi paketille %s"
 
-#: ../yum/__init__.py:3477
+#: ../yum/__init__.py:3478
 #, python-format
 msgid "%s: does not update installed package."
 msgstr "%s: ei päivitä asennettua pakettia"
 
-#: ../yum/__init__.py:3510 ../yum/__init__.py:3594
+#: ../yum/__init__.py:3511 ../yum/__init__.py:3595
 #, python-format
 msgid "Cannot open file: %s. Skipping."
 msgstr "Ei voida avata tiedostoa: %s. Ohitetaan."
 
-#: ../yum/__init__.py:3540
+#: ../yum/__init__.py:3541
 msgid "Problem in reinstall: no package matched to remove"
 msgstr "Ongelma uudelleenasennuksessa: poistopyyntöä vastaavaa pakettia ei ole"
 
-#: ../yum/__init__.py:3553 ../yum/__init__.py:3685
+#: ../yum/__init__.py:3554 ../yum/__init__.py:3686
 #, python-format
 msgid "Package %s is allowed multiple installs, skipping"
 msgstr "Paketille %s sallitaan useita asennuksia, ohitetaan."
 
-#: ../yum/__init__.py:3574
+#: ../yum/__init__.py:3575
 #, python-format
 msgid "Problem in reinstall: no package %s matched to install"
 msgstr ""
 "Ongelma uudelleenasennuksessa: asennuspyyntöä vastaavaa pakettia %s ei ole"
 
-#: ../yum/__init__.py:3677
+#: ../yum/__init__.py:3678
 msgid "No package(s) available to downgrade"
 msgstr "Yhtään pakettia ei ole saatavilla varhennettavaksi"
 
-#: ../yum/__init__.py:3730
+#: ../yum/__init__.py:3731
 #, python-format
 msgid "No Match for available package: %s"
 msgstr "Ei vastaavuutta saatavilla olevalle paketille: %s"
 
-#: ../yum/__init__.py:3737
+#: ../yum/__init__.py:3738
 #, python-format
 msgid "Only Upgrade available on package: %s"
 msgstr "Vain päivitys saatavilla paketille: %s"
 
-#: ../yum/__init__.py:3807 ../yum/__init__.py:3844
+#: ../yum/__init__.py:3808 ../yum/__init__.py:3845
 #, python-format
 msgid "Failed to downgrade: %s"
 msgstr "Varhentaminen epäonnistui: %s"
 
-#: ../yum/__init__.py:3876
+#: ../yum/__init__.py:3877
 #, python-format
 msgid "Retrieving GPG key from %s"
 msgstr "Noudetaan GPG-avain osoitteesta %s"
 
-#: ../yum/__init__.py:3896
+#: ../yum/__init__.py:3897
 msgid "GPG key retrieval failed: "
 msgstr "GPG-avaimen nouto epäonnistui: "
 
-#: ../yum/__init__.py:3902
+#: ../yum/__init__.py:3903
 #, python-format
 msgid "Invalid GPG Key from %s: %s"
 msgstr "Virheellinen GPG-avain osoitteesta %s: %s"
 
-#: ../yum/__init__.py:3911
+#: ../yum/__init__.py:3912
 #, python-format
 msgid "GPG key parsing failed: key does not have value %s"
 msgstr "GPG-avaimen jäsentäminen epäonnistui: avaimessa ei ole arvoa %s"
 
-#: ../yum/__init__.py:3943
+#: ../yum/__init__.py:3944
 #, python-format
 msgid "GPG key at %s (0x%s) is already installed"
 msgstr "Osoitteesta %s ladattu GPG-avain (0x%s) on jo asennetuna"
 
 #. Try installing/updating GPG key
-#: ../yum/__init__.py:3948 ../yum/__init__.py:4010
+#: ../yum/__init__.py:3949 ../yum/__init__.py:4011
 #, python-format
 msgid "Importing GPG key 0x%s \"%s\" from %s"
 msgstr "Tuodaan GPG-avain 0x%s ”%s” osoitteesta %s"
 
-#: ../yum/__init__.py:3965
+#: ../yum/__init__.py:3966
 msgid "Not installing key"
 msgstr "Avainta ei asenneta"
 
-#: ../yum/__init__.py:3971
+#: ../yum/__init__.py:3972
 #, python-format
 msgid "Key import failed (code %d)"
 msgstr "Avaimen tuonti epäonnistui (koodi %d)"
 
-#: ../yum/__init__.py:3972 ../yum/__init__.py:4031
+#: ../yum/__init__.py:3973 ../yum/__init__.py:4032
 msgid "Key imported successfully"
 msgstr "Avaimen tuonti onnistui"
 
-#: ../yum/__init__.py:3977 ../yum/__init__.py:4036
+#: ../yum/__init__.py:3978 ../yum/__init__.py:4037
 #, python-format
 msgid ""
 "The GPG keys listed for the \"%s\" repository are already installed but they "
@@ -2591,42 +2594,42 @@ msgstr ""
 "vastaa tätä pakettia.\n"
 "Tarkista että tälle asennuslähteelle on asetettu oikeat avainten URL:t."
 
-#: ../yum/__init__.py:3986
+#: ../yum/__init__.py:3987
 msgid "Import of key(s) didn't help, wrong key(s)?"
 msgstr "Avainten tuonti ei auttanut, ovatko avaimet vääriä?"
 
-#: ../yum/__init__.py:4005
+#: ../yum/__init__.py:4006
 #, python-format
 msgid "GPG key at %s (0x%s) is already imported"
 msgstr "Osoitteesta %s ladattu GPG-avain (0x%s) on jo tuotu"
 
-#: ../yum/__init__.py:4025
+#: ../yum/__init__.py:4026
 #, python-format
 msgid "Not installing key for repo %s"
 msgstr "Ei asenneta avainta asennuslähteelle %s"
 
-#: ../yum/__init__.py:4030
+#: ../yum/__init__.py:4031
 msgid "Key import failed"
 msgstr "Avaimen tuonti epäonnistui"
 
-#: ../yum/__init__.py:4156
+#: ../yum/__init__.py:4157
 msgid "Unable to find a suitable mirror."
 msgstr "Sopivaa peilipalvelinta ei löytynyt."
 
-#: ../yum/__init__.py:4158
+#: ../yum/__init__.py:4159
 msgid "Errors were encountered while downloading packages."
 msgstr "Paketteja ladatessa tapahtui virheitä."
 
-#: ../yum/__init__.py:4208
+#: ../yum/__init__.py:4209
 #, python-format
 msgid "Please report this error at %s"
 msgstr "Ilmoita tästä ongelmasta: %s"
 
-#: ../yum/__init__.py:4232
+#: ../yum/__init__.py:4233
 msgid "Test Transaction Errors: "
 msgstr "Testitransaktion virheitä: "
 
-#: ../yum/__init__.py:4333
+#: ../yum/__init__.py:4334
 #, python-format
 msgid "Could not set cachedir: %s"
 msgstr "Välimuistihakemiston asettaminen epäonnistui %s"
-- 
1.6.6.1


From 2d8c8f210292766cc5389ac5700c3fa7fe1c8342 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Wed, 24 Mar 2010 18:25:35 +0200
Subject: [PATCH 05/53] 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
 
-import syslog as syslog_module
+from logging.handlers import SysLogHandler as syslog_module
 
 syslog = None
 
@@ -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"]
 
 def logLevelFromErrorLevel(error_level):
     """ Convert an old-style error logging level to the new style. """
@@ -140,7 +140,6 @@ def doLoggingSetup(debuglevel, errorlevel,
         return
 
     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
 
-    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
 
     if debuglevel is not None:
@@ -201,5 +197,5 @@ def setFileLog(uid, logfile):
 
 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.6.6.1


From a479fa2fca23ca0173cc06f7e4e24305df0db3cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Wed, 24 Mar 2010 19:19:30 +0200
Subject: [PATCH 06/53] 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
 
     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
 
     if debuglevel is not None:
-- 
1.6.6.1


From b9484bfd83e3c0f83389a649a4cfd7b50b8c2b8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Wed, 24 Mar 2010 22:04:35 +0200
Subject: [PATCH 07/53] 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
 
 .IP
 \fBsyslog_ident \fR
-XXX not implemented yet
+Identification (program name) for syslog messages.
 
 .IP
 \fBsyslog_facility \fR
-XXX not implemented yet
+Facility name for syslog messages, see syslog(3).  Default is `LOG_USER'.
 
 .IP
 \fBproxy \fR
-- 
1.6.6.1


From 311221f71bba055a623565996e981156265789ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Wed, 24 Mar 2010 23:31:28 +0200
Subject: [PATCH 08/53] 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'.
 
 .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'.
+
+.IP
 \fBproxy \fR
 URL to the proxy server that yum should use.
 
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
 
         self.doLoggingSetup(startupconf.debuglevel, startupconf.errorlevel,
                             startupconf.syslog_ident,
-                            startupconf.syslog_facility, syslog_device)
+                            startupconf.syslog_facility,
+                            startupconf.syslog_device)
 
         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.6.6.1


From 203a39125e1de20500739c94e7c92d074d19790f Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 4 Mar 2010 17:17:30 -0500
Subject: [PATCH 09/53]  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())
 
     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')]
 
+    #  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)]
 
+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.6.6.1


From cb59d97fba6765d03a908219d5258b3896f2ecb1 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 11 Mar 2010 11:54:41 -0500
Subject: [PATCH 10/53] 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.6.6.1


From a33aa64f23ac3c197871e9100c99e9cccc3f58b1 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 11 Mar 2010 11:47:33 -0500
Subject: [PATCH 11/53] 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.6.6.1


From 008d74a13173bcb7005e7150ebc1367720078452 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 11 Mar 2010 14:47:40 -0500
Subject: [PATCH 12/53]  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.6.6.1


From b3ca56aed8f2949b73d07bf3c1aa90ae20793848 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Tue, 16 Mar 2010 17:37:04 -0400
Subject: [PATCH 13/53] 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.6.6.1


From f2c3967ea8185541a3c68fad754d19b2dfd71d35 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Mon, 22 Mar 2010 14:21:11 -0400
Subject: [PATCH 14/53]  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
 
         if not os.path.exists(self.conf.db_path):
             try:
@@ -214,7 +215,15 @@ class YumHistory:
 
     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:
 
     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
 
         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:
 
     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:
 
     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
 
         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:
 
     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?
 
+        cur = self._get_cursor()
+        if cur is None:
+            return set()
+
         data = _setupHistorySearchSQL(patterns, ignore_case)
         (need_full, patterns, fields, names) = data
 
@@ -559,7 +590,6 @@ class YumHistory:
         for row in self._yieldSQLDataList(patterns, fields, ignore_case):
             pkgtupids.add(row[0])
 
-        cur = self._get_cursor()
         sql =  """SELECT tid FROM trans_data_pkgs WHERE pkgtupid IN """
         sql += "(%s)" % ",".join(['?'] * len(pkgtupids))
         params = list(pkgtupids)
-- 
1.6.6.1


From 7d04b0e6816cfb27e769bb19f44811f88523ed2b Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Mon, 22 Mar 2010 17:43:25 -0400
Subject: [PATCH 15/53] 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.
 
 %package updatesd
 Summary: Update notification daemon
-- 
1.6.6.1


From 1c2b28e36ef1d7051428ea57446cf800b388f36e Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 25 Mar 2010 11:29:06 -0400
Subject: [PATCH 16/53] 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
 
 .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.6.6.1


From 5579a905155a6be3171f6968a24e691bafcac40b Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 25 Mar 2010 11:53:51 -0400
Subject: [PATCH 17/53] 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)
 
-- 
1.6.6.1


From 9c3b0e9ae6b86cd96ee8751fc9e131e063724b23 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 25 Mar 2010 15:57:24 -0400
Subject: [PATCH 18/53] 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".
+
+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.
 
 .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).
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.6.6.1


From e0175dae0b4eb45f4c2b14f816f1145553ef0e1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Fri, 26 Mar 2010 20:44:37 +0200
Subject: [PATCH 19/53] 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 )
 
     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
             ;;
 
-        erase|remove)
+        erase|remove|distro-sync|distribution-synchronization)
             _yum_list installed "$cur"
             return 0
             ;;
-- 
1.6.6.1


From 1f800dfd4b8c7adb96c653ebd41f7d6b3869d569 Mon Sep 17 00:00:00 2001
From: Timur Malikin <sora_tm@mail.ru>
Date: Sun, 28 Mar 2010 14:56:53 +0000
Subject: [PATCH 20/53] 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 <sora_tm@mail.ru>\n"
 "Language-Team: ru <fedora-localization@www.russianfedora.ru>\n"
 "MIME-Version: 1.0\n"
@@ -1110,24 +1110,24 @@ msgstr "Более года назад"
 
 #: ../output.py:1585
 msgid "installed"
-msgstr "Установлено"
+msgstr "установлено"
 
 #: ../output.py:1586
 msgid "updated"
-msgstr "Обновлено"
+msgstr "обновлен"
 
 #: ../output.py:1587
 msgid "obsoleted"
-msgstr "Заменено"
+msgstr "заменён"
 
 #: ../output.py:1588
 msgid "erased"
-msgstr "удалено"
+msgstr "удалён"
 
 #: ../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"
 
 #: ../output.py:1599
 msgid "--> Running transaction check"
-- 
1.6.6.1


From 305cb4c7c937dd2ea59180c4f08c0635c614e9c9 Mon Sep 17 00:00:00 2001
From: Timur Malikin <sora_tm@mail.ru>
Date: Sun, 28 Mar 2010 14:58:49 +0000
Subject: [PATCH 21/53] 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 <sora_tm@mail.ru>\n"
 "Language-Team: ru <fedora-localization@www.russianfedora.ru>\n"
 "MIME-Version: 1.0\n"
@@ -1127,7 +1127,7 @@ msgstr "удалён"
 #: ../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"
 
 #: ../output.py:1599
 msgid "--> Running transaction check"
-- 
1.6.6.1


From 32fa4bdafb9c820af8f6bbbbc75cea976725e247 Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Mon, 29 Mar 2010 22:25:18 -0400
Subject: [PATCH 22/53] 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]
 
         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
 
+        # 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)
 
@@ -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"))
 
         
 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
 
+            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.6.6.1


From d38a25828b7699a6ffdaaecb06ba223ff2d24edb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Tue, 30 Mar 2010 18:47:35 +0300
Subject: [PATCH 23/53] 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()
             ;;
 
         -R|--randomwait|-x|--exclude|-h|--help|--version|--releasever|--cve|\
-        --bz|--advisory|--tmprepo|--verify-filenames)
+        --bz|--advisory|--tmprepo|--verify-filenames|--setopt)
             return 0
             ;;
 
@@ -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
 
-- 
1.6.6.1


From ecfd7b5e643bab7337d44c981157768b86cab439 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Tue, 30 Mar 2010 14:31:11 -0400
Subject: [PATCH 24/53] 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
 
-            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.6.6.1


From 3e1d76650dc1c5c6128a75230db80d50e56fde65 Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Tue, 30 Mar 2010 14:39:34 -0400
Subject: [PATCH 25/53] 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
 
         # Start with plugins disabled
         self.disablePlugins()
@@ -377,7 +380,7 @@ class YumBase(depsolve.Depsolve):
                 thisrepo.repo_config_age = repo_age
                 thisrepo.repofile = repofn
 
-            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.6.6.1


From 4f267e0e7eca1898ff57a546e8daa9cf89450e20 Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Tue, 30 Mar 2010 16:54:37 -0400
Subject: [PATCH 26/53] 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.6.6.1


From 01c8ad02dedeb47842d4a01593abcdba3617904a Mon Sep 17 00:00:00 2001
From: Misha Shnurapet <zayzayats@yandex.ru>
Date: Thu, 1 Apr 2010 17:49:34 +0000
Subject: [PATCH 27/53] 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 <bor@insight.donbass.com>, 2002.
-# Grigory Bakunov <black@asplinux.ru>, 2002,2003.
-# Timur Malikin <sora_tm@mail.ru>, 2010.
+# Vladimir Bormotov <bor@insight.donbass.com>, 2002
+# Grigory Bakunov <black@asplinux.ru>, 2002, 2003
+# Timur Malikin <sora_tm@mail.ru>, 2010
+# Misha Shnurapet <zayzayats@yandex.ru>, 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 <sora_tm@mail.ru>\n"
+"PO-Revision-Date: 2010-04-02 02:48+0800\n"
+"Last-Translator: Misha Shnurapet <zayzayats@yandex.ru>\n"
 "Language-Team: ru <fedora-localization@www.russianfedora.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"
 
-#: ../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 "Заменено"
+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"
@@ -67,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 "Очистка"
 
@@ -86,14 +109,17 @@ msgstr "Настройка репозиториев"
 
 #: ../cli.py:130
 msgid "Reading repository metadata in from local files"
-msgstr "Чтение метаданных репозиториев с локальных файлов "
+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"
@@ -143,7 +169,7 @@ msgstr ""
 
 #: ../cli.py:364
 msgid "Trying to run the transaction but nothing to do. Exiting."
-msgstr "Попытка запуска транзакции, но нет задач для выполнения. Выход."
+msgstr "Попытка предпринята, делать нечего. Завершение."
 
 #: ../cli.py:403
 msgid "Exiting on user Command"
@@ -157,21 +183,24 @@ 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 и разрешение зависимостей:"
 
 #: ../cli.py:443
 msgid "RPM needs to be updated"
-msgstr "RPM пакет должен быть обновлён"
+msgstr "RPM пакет должен быть обновлен"
 
 #: ../cli.py:444
 #, python-format
@@ -180,19 +209,19 @@ msgstr "Пожалуйста, сообщите об этой ошибке %s"
 
 #: ../cli.py:450
 msgid "Running Transaction Test"
-msgstr "Проверка транзакций"
+msgstr "Проверяем сценарий..."
 
 #: ../cli.py:466
 msgid "Transaction Check Error:\n"
-msgstr "Ошибка проверки транзакции:\n"
+msgstr "Завершено с ошибкой:\n"
 
 #: ../cli.py:473
 msgid "Transaction Test Succeeded"
-msgstr "Проверка прошла успешно"
+msgstr "Успешно."
 
 #: ../cli.py:495
 msgid "Running Transaction"
-msgstr "Запуск транзакции"
+msgstr "Выполняем команды"
 
 #: ../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 "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 "Нечего выполнять"
@@ -232,7 +269,7 @@ msgstr "%d пакеты отмечены для обновления"
 
 #: ../cli.py:650
 msgid "No Packages marked for Update"
-msgstr "Нет пакетов отмеченных для обновления"
+msgstr "Нет пакетов, отмеченных для обновления"
 
 #: ../cli.py:664
 #, python-format
@@ -241,11 +278,11 @@ msgstr "%d пакеты отмечены для удаления"
 
 #: ../cli.py:667
 msgid "No Packages marked for removal"
-msgstr "Нет пакетов отмеченных для удаления"
+msgstr "Нет пакетов, отмеченных для удаления"
 
 #: ../cli.py:692
 msgid "Package(s) to downgrade"
-msgstr "Пакет(ы) для возврата к предыдущей версии"
+msgstr "Пакет(ы) для отката версии"
 
 #: ../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 не найдено"
 
 #: ../cli.py:828
 msgid "No Matches found"
@@ -324,42 +361,46 @@ msgstr "Очистка кэша данных базы RPM"
 
 #: ../cli.py:930
 msgid "Cleaning up plugins"
-msgstr "Очистка плагинов"
+msgstr "Сброс модулей"
 
 #: ../cli.py:955
 msgid "Installed Groups:"
-msgstr "Установлены группы: "
+msgstr "Установлены коллекции: "
 
 #: ../cli.py:967
 msgid "Available Groups:"
-msgstr "Доступные группы:"
+msgstr "Доступные коллекции:"
 
 #: ../cli.py:977
 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 не существует."
+msgstr "Внимание: коллекции %s не существует."
 
 #: ../cli.py:1016
 msgid "No packages in any requested group available to install or update"
-msgstr "В запрашиваемых группах недоступны пакеты для обновления или установки"
+msgstr "Во всех указанных коллекциях пакеты для установки или обновления отсутствуют"
 
 #: ../cli.py:1018
 #, python-format
 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 не существует"
+msgstr "Коллекции с названием %s не существует"
 
 #: ../cli.py:1034
 msgid "No packages to remove from groups"
-msgstr "Нет пакетов для удаления с групп"
+msgstr "Нет пакетов для удаления из коллекций"
 
 #: ../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 уже установлен, пропускаем"
 
 #: ../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 не установлено, добавляем в список для возможной установки"
 
 #: ../cli.py:1135
 msgid "Plugin Options"
-msgstr "Опции плагина"
+msgstr "Опции модуля"
 
 #: ../cli.py:1143
 #, python-format
@@ -416,7 +457,7 @@ msgstr "игнорировать ошибки"
 
 #: ../cli.py:1326
 msgid "run entirely from system cache, don't update cache"
-msgstr "запуск только из системного кэша, не обновляйте кэш"
+msgstr "брать полностью из системного кэша, не обновлять его"
 
 #: ../cli.py:1329
 msgid "config file location"
@@ -464,13 +505,11 @@ msgstr "настройка корневой папки"
 
 #: ../cli.py:1357
 msgid "enable one or more repositories (wildcards allowed)"
-msgstr ""
-"включение одного и более репозиториев (поиск по шаблону поддерживается)"
+msgstr "включение одного и более репозиториев (поиск по шаблону поддерживается)"
 
 #: ../cli.py:1361
 msgid "disable one or more repositories (wildcards allowed)"
-msgstr ""
-"выключение одного и более репозиториев (поиск по шаблону поддерживается)"
+msgstr "выключение одного и более репозиториев (поиск по шаблону поддерживается)"
 
 #: ../cli.py:1364
 msgid "exclude package(s) by name or glob"
@@ -482,11 +521,11 @@ msgstr "отключает исключения для конкретного р
 
 #: ../cli.py:1369
 msgid "enable obsoletes processing during updates"
-msgstr "включить процесс замены во время обновления"
+msgstr "включить обработку недействительных во время обновления"
 
 #: ../cli.py:1371
 msgid "disable Yum plugins"
-msgstr "отключить плагины Yum"
+msgstr "отключить модули Yum"
 
 #: ../cli.py:1373
 msgid "disable gpg signature checking"
@@ -494,11 +533,11 @@ msgstr "отключить проверку подписи gpg"
 
 #: ../cli.py:1375
 msgid "disable plugins by name"
-msgstr "отключить плагин по имени"
+msgstr "отключить модуль по названию"
 
 #: ../cli.py:1378
 msgid "enable plugins by name"
-msgstr "включить плагин по имени"
+msgstr "включить модуль по названию"
 
 #: ../cli.py:1381
 msgid "skip packages with depsolving problems"
@@ -510,9 +549,7 @@ msgstr "Использовать ли цветовые схемы"
 
 #: ../cli.py:1385
 msgid "set value of $releasever in yum config and repo files"
-msgstr ""
-"установите значение $releasever в конфигурационном файле yum и в файлах "
-"репозиториев (repo)"
+msgstr "установите значение $releasever в конфигурационном файле yum и в файлах репозиториев (repo)"
 
 #: ../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
@@ -670,12 +707,12 @@ msgid ""
 "Group: %s"
 msgstr ""
 "\n"
-"Группа: %s"
+"Коллекция: %s"
 
 #: ../output.py:719
 #, python-format
 msgid " Group-Id: %s"
-msgstr " Идентификатор группы: %s"
+msgstr "Код коллекции: %s"
 
 #: ../output.py:724
 #, python-format
@@ -750,7 +787,7 @@ msgstr "Другое:"
 
 #: ../output.py:896
 msgid "There was an error calculating total download size"
-msgstr "Произошла ошибка при подсчёте общего объёма загрузки"
+msgstr "Произошла ошибка при подсчете общего объема загрузки"
 
 #: ../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:908
 #, 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 "Пропущено (ошибка зависимостей)"
 
@@ -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"
 "to exit.\n"
 msgstr ""
 "\n"
-"Текущая закачка отменена, %sвызвано (ctrl-c) повторите %s в течении%s%s%s "
-"секунд\n"
+"Текущая закачка отменена, %sвызвано (ctrl-c) повторите %s в течении%s%s%s секунд\n"
 "для выхода.\n"
 
 #: ../output.py:1162
@@ -935,13 +971,14 @@ msgstr "Система"
 
 #: ../output.py:1254
 msgid "Bad transaction IDs, or package(s), given"
-msgstr "Передан плохой идентификатор транзакции или пакет(ы)"
+msgstr "Передан(ы) неверный код действий или пакет(ы)"
 
 #: ../output.py:1266
 msgid "ID"
 msgstr "ID"
 
-#: ../output.py:1267 ../output.py:1520
+#: ../output.py:1267
+#: ../output.py:1520
 msgid "Login user"
 msgstr "Вход пользователя"
 
@@ -949,43 +986,46 @@ 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 "Изменено"
 
 #: ../output.py:1310
 msgid "No transaction ID given"
-msgstr "Идентификатор транзакции недоступен"
+msgstr "Код действия не задан"
 
 #: ../output.py:1336
 msgid "Bad transaction ID given"
-msgstr "Плохой идентификатор транзакции"
+msgstr "Код действия неверен"
 
 #: ../output.py:1341
 msgid "Not found given transaction ID"
-msgstr "Не найден данный ID транзакции"
+msgstr "Указанный код действия не найден"
 
 #: ../output.py:1349
 msgid "Found more than one transaction ID!"
-msgstr "Найдено более одного ID транзакции!"
+msgstr "Указано более одной операции!"
 
 #: ../output.py:1370
 msgid "No transaction ID, or package, given"
-msgstr "Нет данного ID транзакции или пакета"
+msgstr "Не задан код действия или пакет"
 
 #: ../output.py:1396
 msgid "Transaction ID :"
-msgstr "Идентификатор транзакции:"
+msgstr "Код операции:"
 
 #: ../output.py:1398
 msgid "Begin time     :"
 msgstr "Время начала:"
 
-#: ../output.py:1401 ../output.py:1403
+#: ../output.py:1401
+#: ../output.py:1403
 msgid "Begin rpmdb    :"
 msgstr "Начало базы данных RPM:"
 
@@ -998,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:"
 
@@ -1006,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 "Код возврата:"
 
@@ -1024,11 +1067,12 @@ msgstr "Успешно"
 
 #: ../output.py:1431
 msgid "Transaction performed with:"
-msgstr "Транзакция выполняется с:"
+msgstr "Действие выполнено:"
 
-#: ../output.py:1444 ../output.py:1489
+#: ../output.py:1444
+#: ../output.py:1489
 msgid "Downgraded"
-msgstr "Возвращено к предыдущей версии"
+msgstr "Откат версии"
 
 #. multiple versions installed, both older and newer
 #: ../output.py:1446
@@ -1047,7 +1091,8 @@ msgstr "Вывод сценария:"
 msgid "Errors:"
 msgstr "Ошибки:"
 
-#: ../output.py:1481 ../output.py:1482
+#: ../output.py:1481
+#: ../output.py:1482
 msgid "Install"
 msgstr "Установка "
 
@@ -1057,7 +1102,7 @@ msgstr "Установка зависимостей"
 
 #: ../output.py:1485
 msgid "Obsoleting"
-msgstr "Замена"
+msgstr "Исключаем"
 
 #: ../output.py:1486
 msgid "Erase"
@@ -1069,7 +1114,7 @@ msgstr "Переустановка"
 
 #: ../output.py:1488
 msgid "Downgrade"
-msgstr "Возврат к предыдущей версии"
+msgstr "Откат версии"
 
 #: ../output.py:1490
 msgid "Update"
@@ -1110,38 +1155,39 @@ msgstr "Более года назад"
 
 #: ../output.py:1585
 msgid "installed"
-msgstr "установлено"
+msgstr "для установки"
 
 #: ../output.py:1586
 msgid "updated"
-msgstr "обновлен"
+msgstr "для обновления"
 
 #: ../output.py:1587
 msgid "obsoleted"
-msgstr "заменён"
+msgstr "как недействительный"
 
 #: ../output.py:1588
 msgid "erased"
-msgstr "удалён"
+msgstr "для удаления"
 
 #: ../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"
 
 #: ../output.py:1599
 msgid "--> Running transaction check"
-msgstr "--> Запуск проверки транзакции"
+msgstr "--> Проверка сценария"
 
 #: ../output.py:1604
 msgid "--> Restarting Dependency Resolution with new changes."
-msgstr "--> Перезапуск разрешения зависимостей с новыми параметрами."
+msgstr "--> Перепроверка зависимостей с новыми параметрами."
 
 #: ../output.py:1609
 msgid "--> Finished Dependency Resolution"
-msgstr "--> Окончание разрешения зависимостей"
+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"
@@ -1149,7 +1195,7 @@ msgstr "--> Обработка зависимостей: %s для пакета:
 #: ../output.py:1623
 #, python-format
 msgid "--> Unresolved Dependency: %s"
-msgstr "--> Неразрешённая зависимость: %s"
+msgstr "--> Неразрешенная зависимость: %s"
 
 #: ../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 "--> Конфликт обработки: %s конфликтует %s"
+msgstr "--> Обработка конфликта: %s конфликтует с %s"
 
 #: ../output.py:1674
 msgid "--> Populating transaction set with selected packages. Please wait."
-msgstr ""
-"--> Формирование транзакций для выбранных пакетов. Пожалуйста подождите."
+msgstr "--> Заполнение списка действий выбранными пакетами. Подождите, пожалуйста."
 
 #: ../output.py:1678
 #, python-format
 msgid "---> Downloading header for %s to pack into transaction set."
-msgstr "-- > Загрузка заголовков %s для создания набора транзакций"
+msgstr "---> Загрузка заголовка %s для включения в список."
 
 #: ../utils.py:93
 msgid "Running"
@@ -1213,7 +1260,8 @@ msgstr "Зомби"
 msgid "Traced/Stopped"
 msgstr "Трассировано/Остановлено"
 
-#: ../utils.py:98 ../yumcommands.py:917
+#: ../utils.py:98
+#: ../yumcommands.py:917
 msgid "Unknown"
 msgstr "Неизвестно"
 
@@ -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"
 "\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:282 ../yummain.py:211
+#: ../utils.py:282
+#: ../yummain.py:211
 msgid "Complete!"
-msgstr "Выполнено!"
+msgstr "Готово!"
 
 #: ../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:70
 #, python-format
@@ -1333,7 +1383,7 @@ msgstr "Ошибка: Необходим параметр для соответ
 
 #: ../yumcommands.py:82
 msgid "Error: Need a group or list of groups"
-msgstr "Ошибка: Необходима группа или список групп"
+msgstr "Ошибка: нужна коллекция или список групп"
 
 #: ../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:121
 msgid "Error: more than one file given as argument to shell."
-msgstr ""
-"Ошибка: более чем один файл указан в качестве аргумента для командной "
-"оболочки."
+msgstr "Ошибка: более чем один файл указан в качестве аргумента для командной оболочки."
 
 #: ../yumcommands.py:170
 msgid "PACKAGE..."
@@ -1372,11 +1419,11 @@ msgstr "ПАКЕТ..."
 
 #: ../yumcommands.py:173
 msgid "Install a package or packages on your system"
-msgstr "Установка пакета(пакетов) в вашей системе"
+msgstr "Установка пакета(ов) в систему"
 
 #: ../yumcommands.py:181
 msgid "Setting up Install Process"
-msgstr "Настройка процесса установки"
+msgstr "Подготовка к установке"
 
 #: ../yumcommands.py:192
 msgid "[PACKAGE...]"
@@ -1384,15 +1431,15 @@ msgstr "[ПАКЕТ...]"
 
 #: ../yumcommands.py:195
 msgid "Update a package or packages on your system"
-msgstr "Обновление пакета(ов) в вашей системе"
+msgstr "Обновление пакета(ов) в системе"
 
 #: ../yumcommands.py:202
 msgid "Setting up Update Process"
-msgstr "Настройка процесса обновления"
+msgstr "Подготовка к обновлению"
 
 #: ../yumcommands.py:244
 msgid "Display details about a package or group of packages"
-msgstr "Отобразить подробности о пакете или о группе пакетов"
+msgstr "Отобразить информацию о пакете или о коллекции пакетов"
 
 #: ../yumcommands.py:293
 msgid "Installed Packages"
@@ -1408,12 +1455,14 @@ msgstr "Дополнительные пакеты"
 
 #: ../yumcommands.py:309
 msgid "Updated Packages"
-msgstr "Обновлённые пакеты"
+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 "Заменённые пакеты"
+msgstr "Исключенные пакеты"
 
 #: ../yumcommands.py:326
 msgid "Recently Added Packages"
@@ -1421,43 +1470,43 @@ msgstr "Недавно добавленные пакеты"
 
 #: ../yumcommands.py:333
 msgid "No matching Packages to list"
-msgstr "Нет совпадений с списком пакетов"
+msgstr "Совпадений среди пакетов не найдено"
 
 #: ../yumcommands.py:347
 msgid "List a package or groups of packages"
-msgstr "Список пакетов или группы пакетов"
+msgstr "Вывести список пакетов или коллекций пакетов"
 
 #: ../yumcommands.py:359
 msgid "Remove a package or packages from your system"
-msgstr "Удаление пакета(пакетов) с вашей системы"
+msgstr "Удаление пакета(ов) из системы"
 
 #: ../yumcommands.py:366
 msgid "Setting up Remove Process"
-msgstr "Настройка процесса удаления"
+msgstr "Подготовка к удалению"
 
 #: ../yumcommands.py:380
 msgid "Setting up Group Process"
-msgstr "Настройка группового процесса"
+msgstr "Подготовка к обработке коллекции"
 
 #: ../yumcommands.py:386
 msgid "No Groups on which to run command"
-msgstr "Нет групп для запуска команды"
+msgstr "Коллекций пакетов к обработке нет"
 
 #: ../yumcommands.py:399
 msgid "List available package groups"
-msgstr "Список доступных групп пакетов"
+msgstr "Список доступных коллекций пакетов"
 
 #: ../yumcommands.py:416
 msgid "Install the packages in a group on your system"
-msgstr "Установка пакетов из группы в вашу систему"
+msgstr "Установка коллекции пакетов в систему"
 
 #: ../yumcommands.py:438
 msgid "Remove the packages in a group from your system"
-msgstr "Удаление пакета(пакетов) с вашей системы из группы"
+msgstr "Удаление коллекции пакета(ов) из системы"
 
 #: ../yumcommands.py:465
 msgid "Display details about a package group"
-msgstr "Отображение подробностей о группе пакетов"
+msgstr "Показать информацию о коллекции пакетов"
 
 #: ../yumcommands.py:489
 msgid "Generate the metadata cache"
@@ -1469,7 +1518,7 @@ msgstr "Создание кэша для всех метаданных файл
 
 #: ../yumcommands.py:496
 msgid "This may take a while depending on the speed of this computer"
-msgstr "Это займёт немного времени, в зависимости от скорости компьютера"
+msgstr "Это займет немного времени, в зависимости от скорости компьютера"
 
 #: ../yumcommands.py:517
 msgid "Metadata Cache Created"
@@ -1497,7 +1546,7 @@ msgstr "Поиск пакетов:"
 
 #: ../yumcommands.py:644
 msgid "Update packages taking obsoletes into account"
-msgstr "Обновить пакеты, учитывая замены"
+msgstr "Обновить пакеты, учитывая недействительные"
 
 #: ../yumcommands.py:652
 msgid "Setting up Upgrade Process"
@@ -1509,7 +1558,7 @@ msgstr "Установка локального пакета"
 
 #: ../yumcommands.py:674
 msgid "Setting up Local Package Process"
-msgstr "Настройка процесса для локального пакета"
+msgstr "Подготовка действий с локальным пакетом"
 
 #: ../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: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 "отключено"
 
 #: ../yumcommands.py:866
 msgid "Repo-id      : "
-msgstr "Идентификатор репозитория:"
+msgstr "Код репозитория:"
 
 #: ../yumcommands.py:867
 msgid "Repo-name    : "
@@ -1557,7 +1608,7 @@ msgstr "Имя репозитория:"
 
 #: ../yumcommands.py:870
 msgid "Repo-status  : "
-msgstr "Статус репозитория:"
+msgstr "Состояние репозитория:"
 
 #: ../yumcommands.py:873
 msgid "Repo-revision: "
@@ -1573,7 +1624,7 @@ msgstr "Метки репозитория дистрибутива:"
 
 #: ../yumcommands.py:888
 msgid "Repo-updated : "
-msgstr "Репозиторий обновлён:"
+msgstr "Репозиторий обновлен:"
 
 #: ../yumcommands.py:890
 msgid "Repo-pkgs    : "
@@ -1632,21 +1683,24 @@ 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 "статус"
+msgstr "состояние"
 
 #: ../yumcommands.py:981
 msgid "repo name"
-msgstr "имя репозитория"
+msgstr "репозиторий"
 
 #: ../yumcommands.py:1018
 msgid "Display a helpful usage message"
-msgstr "Отобразить сообщение помощи"
+msgstr "Отобразить подсказку к использованию"
 
 #: ../yumcommands.py:1052
 #, python-format
@@ -1675,19 +1729,19 @@ msgstr ""
 
 #: ../yumcommands.py:1087
 msgid "Setting up Reinstall Process"
-msgstr "Настройка процесса переустановки"
+msgstr "Подготовка к повторной установке"
 
 #: ../yumcommands.py:1095
 msgid "reinstall a package"
-msgstr "Переустановка пакета"
+msgstr "переустановка пакета"
 
 #: ../yumcommands.py:1113
 msgid "Setting up Downgrade Process"
-msgstr "Настройка процесса возврата к предыдущей версии"
+msgstr "Подготовка к откату версии"
 
 #: ../yumcommands.py:1120
 msgid "downgrade a package"
-msgstr "Возврат к предыдущей версии пакета"
+msgstr "откат к предыдущей версии пакета"
 
 #: ../yumcommands.py:1134
 msgid "Display a version for the machine and/or available repos."
@@ -1699,7 +1753,7 @@ msgstr " Группы версий Yum:"
 
 #: ../yumcommands.py:1183
 msgid " Group   :"
-msgstr " Группа:"
+msgstr "Коллекция:"
 
 #: ../yumcommands.py:1184
 msgid " Packages:"
@@ -1707,44 +1761,45 @@ msgstr " Пакеты:"
 
 #: ../yumcommands.py:1213
 msgid "Installed:"
-msgstr "Установлено: "
+msgstr "Установлен(ы):"
 
 #: ../yumcommands.py:1218
 msgid "Group-Installed:"
-msgstr "Группа установленных:"
+msgstr "Установлены коллекцей:"
 
 #: ../yumcommands.py:1227
 msgid "Available:"
-msgstr "Доступно:"
+msgstr "Доступен(ы):"
 
 #: ../yumcommands.py:1233
 msgid "Group-Available:"
-msgstr "Группа доступных:"
+msgstr "Доступны коллекцией:"
 
 #: ../yumcommands.py:1272
 msgid "Display, or use, the transaction history"
-msgstr "Отображать или использовать историю транзакций"
+msgstr "Отобразить (или использовать) журнал операций"
 
 #: ../yumcommands.py:1300
 #, python-format
 msgid "Invalid history sub-command, use: %s."
-msgstr "Неверная субкоманда истории, используйте:%s."
+msgstr "Неверная подкоманда журнала, используйте: %s."
 
 #: ../yumcommands.py:1345
 msgid "Check for problems in the rpmdb"
 msgstr "Проверка проблем в базе данных RPM"
 
 #: ../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: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:"
@@ -1758,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"
 
@@ -1782,11 +1838,11 @@ msgstr ""
 
 #: ../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 "Настройка набора транзакций до включения класса конфигурации"
+msgstr "Составление списка действий до включения класса конфигурации"
 
 #: ../yum/depsolve.py:148
 #, python-format
@@ -1801,22 +1857,23 @@ msgstr "Поиск набора пакетов для зависимости: %s
 #: ../yum/depsolve.py:175
 #, python-format
 msgid "Potential match for %s from %s"
-msgstr "Потенциальное совпадение для %s из %s"
+msgstr "Возможное совпадение для %s из %s"
 
 #: ../yum/depsolve.py:183
 #, python-format
 msgid "Matched %s to require for %s"
-msgstr "%s подходит в качестве требования для %s"
+msgstr "%s подходит как требуемый для %s"
 
 #: ../yum/depsolve.py:225
 #, python-format
 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 сконвертировано для установки"
+msgstr "%s преобразован для установки"
 
 #: ../yum/depsolve.py:246
 #, python-format
@@ -1850,7 +1907,7 @@ msgstr "Требуемая зависимость не является имен
 #: ../yum/depsolve.py:363
 #, python-format
 msgid "Potential Provider: %s"
-msgstr "Потенциальный поставщик:%s"
+msgstr "Возможный поставщик:%s"
 
 #: ../yum/depsolve.py:386
 #, python-format
@@ -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: Замена устаревшего %s пакета пакетом %s чтобы разрешить зависимости."
+msgstr "TSINFO: Замена устаревшего %s пакета пакетом %s чтобы разрешить зависимости."
 
 #: ../yum/depsolve.py:410
 #, python-format
@@ -1881,7 +1937,7 @@ msgstr "TSINFO: Обновление %s для разрешения зависи
 #: ../yum/depsolve.py:418
 #, python-format
 msgid "Cannot find an update path for dep for: %s"
-msgstr "Не удаётся найти путь обновления зависимости для: %s"
+msgstr "Не удается найти путь обновления зависимости для: %s"
 
 #: ../yum/depsolve.py:449
 #, python-format
@@ -1897,19 +1953,17 @@ msgstr "Зависимый пакет %s уже установлен и буде
 #: ../yum/depsolve.py:507
 #, python-format
 msgid "Potential resolving package %s has newer instance in ts."
-msgstr ""
-"Пакет %s новой версии, потенциально разрешающий, находится в составе "
-"транзакции."
+msgstr "Пакет %s в сценарии новее доступного"
 
 #: ../yum/depsolve.py:518
 #, python-format
 msgid "Potential resolving package %s has newer instance installed."
-msgstr "Пакет %s ,потенциально разрешающий, установлен новой версии."
+msgstr "Более новый пакет %s уже установлен в систему"
 
 #: ../yum/depsolve.py:536
 #, python-format
 msgid "%s already in ts, skipping this one"
-msgstr "%s уже находится в наборе транзакций, пропуск"
+msgstr "%s уже в списке к действию, пропускаем его"
 
 #: ../yum/depsolve.py:578
 #, python-format
@@ -1921,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 "Успех - пустая транзакция"
+msgstr "Успешно — холостое задание"
 
-#: ../yum/depsolve.py:729 ../yum/depsolve.py:744
+#: ../yum/depsolve.py:729
+#: ../yum/depsolve.py:744
 msgid "Restarting Loop"
 msgstr "Перезапуск петли"
 
@@ -1940,7 +1996,7 @@ msgstr "%s из %s имеет проблемы с разрешением зав
 
 #: ../yum/depsolve.py:782
 msgid "Success - deps resolved"
-msgstr "Успешно - зависимости разрешены"
+msgstr "Успешно — зависимости разрешены"
 
 #: ../yum/depsolve.py:796
 #, python-format
@@ -1957,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"
@@ -1965,7 +2022,7 @@ msgstr "Лучший архив в %s"
 #: ../yum/depsolve.py:1218
 #, python-format
 msgid "%s obsoletes %s"
-msgstr "%s заменяет %s"
+msgstr "%s исключает %s"
 
 #: ../yum/depsolve.py:1230
 #, python-format
@@ -1998,7 +2055,7 @@ msgstr "Лучший выбор: %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:424
 #, python-format
@@ -2007,11 +2064,11 @@ msgstr "Хранилище %r  не имеет названия в конфиг
 
 #: ../yum/__init__.py:462
 msgid "plugins already initialised"
-msgstr "плагин уже инициализирован"
+msgstr "модули уже загружены"
 
 #: ../yum/__init__.py:469
 msgid "doRpmDBSetup() will go away in a future version of Yum.\n"
-msgstr "doRpmDBSetup() будет устранён в следующей версии Yum.\n"
+msgstr "doRpmDBSetup() будет устранен в следующей версии Yum.\n"
 
 #: ../yum/__init__.py:480
 msgid "Reading Local RPMDB"
@@ -2019,11 +2076,11 @@ msgstr "Чтение локальной базы данных RPM"
 
 #: ../yum/__init__.py:504
 msgid "doRepoSetup() will go away in a future version of Yum.\n"
-msgstr "doRepoSetup() будет устранён в следующей версии Yum.\n"
+msgstr "doRepoSetup() будет устранен в следующей версии Yum.\n"
 
 #: ../yum/__init__.py:524
 msgid "doSackSetup() will go away in a future version of Yum.\n"
-msgstr "doSackSetup() будет устранён в следующей версии Yum.\n"
+msgstr "doSackSetup() будет устранен в следующей версии Yum.\n"
 
 #: ../yum/__init__.py:554
 msgid "Setting up Package Sacks"
@@ -2040,7 +2097,7 @@ msgstr "поэтому этот репозиторий не может быть
 
 #: ../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:617
 msgid "Building updates object"
@@ -2048,25 +2105,25 @@ msgstr "Построение объекта обновлений"
 
 #: ../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:677
 msgid "Getting group metadata"
-msgstr "Получение метаданных групп"
+msgstr "Получение метаданных коллекции"
 
 #: ../yum/__init__.py:703
 #, python-format
 msgid "Adding group file from repository: %s"
-msgstr "Добавление файла групп из репозитория: %s"
+msgstr "Добавление файла коллекций из репозитория: %s"
 
 #: ../yum/__init__.py:712
 #, python-format
 msgid "Failed to add groups file for repository: %s - %s"
-msgstr "Ошибка добавления файла групп для репозитория: %s - %s"
+msgstr "Ошибка добавления файла коллекций для репозитория: %s — %s"
 
 #: ../yum/__init__.py:718
 msgid "No Groups Available in any repository"
-msgstr "Нет доступных групп в любом репозитории"
+msgstr "Ни в одном репозитории нет доступных коллекций"
 
 #: ../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:749
 #, python-format
 msgid "Failed to add Pkg Tags for repository: %s - %s"
-msgstr "Ошибка добавление меток пакета для репозитория: %s - %s"
+msgstr "Ошибка добавление меток пакета для репозитория: %s — %s"
 
 #: ../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: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 "Раунд %i пропуская поврежденные"
+msgstr "Пропуск %i разрушенной связи"
 
 #: ../yum/__init__.py:975
 #, python-format
 msgid "Skip-broken took %i rounds "
-msgstr "Раунд пропуская повреждённые прошло%i "
+msgstr "Разрушено %i связей"
 
 #: ../yum/__init__.py:976
 msgid ""
@@ -2136,16 +2189,13 @@ msgid "installed conflict"
 msgstr "установлен в конфликте"
 
 #: ../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 "Failed to remove transaction file %s"
-msgstr "Невозможно удалить файл транзакции %s"
+msgstr "Невозможно удалить маркер %s"
 
 #. 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 должен был быть удален, но не был удален!"
 
 #. 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: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: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:1534 ../yum/__init__.py:1563
+#: ../yum/__init__.py:1534
+#: ../yum/__init__.py:1563
 #, python-format
 msgid "using local copy of %s"
 msgstr "использование локальной копии %s"
@@ -2221,11 +2269,8 @@ msgstr "Заголовок не готов."
 
 #: ../yum/__init__.py:1661
 #, 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"
 
 #: ../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: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:2219
 #, python-format
@@ -2315,24 +2356,29 @@ msgstr "Результат совпадений: %s"
 
 #: ../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: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"
+msgstr "пакет %s не отмечен в коллекции %s"
 
 #: ../yum/__init__.py:2433
 #, python-format
 msgid "Adding package %s from group %s"
-msgstr "Добавление пакета %s из группы %s"
+msgstr "Добавление пакета %s из коллекции %s"
 
 #: ../yum/__init__.py:2437
 #, python-format
@@ -2349,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 не найден"
@@ -2366,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"
@@ -2389,17 +2440,17 @@ msgstr "Нет доступных для установки пакетов"
 #: ../yum/__init__.py:2972
 #, python-format
 msgid "Package: %s  - already in transaction set"
-msgstr "Пакет: %s - уже включён в транзакцию"
+msgstr "Пакет: %s — уже в списке к действию"
 
 #: ../yum/__init__.py:2998
 #, python-format
 msgid "Package %s is obsoleted by %s which is already installed"
-msgstr "Пакет %s был заменён на %s и он уже установлен"
+msgstr "Пакет %s недействителен из-за установленного %s"
 
 #: ../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 взамен"
 
 #: ../yum/__init__.py:3009
 #, python-format
@@ -2416,13 +2467,16 @@ 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"
+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"
@@ -2430,17 +2484,18 @@ msgstr "%s"
 #: ../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"
 
 #: ../yum/__init__.py:3284
 #, python-format
 msgid "Not Updating Package that is obsoleted: %s"
-msgstr "Пакет не обновляется, заменён: %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"
+msgstr "Необновленный пакет, который был обновлен ранее: %s.%s %s:%s-%s"
 
 #: ../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: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"
+msgstr "Невозможно добавить пакет %s в список действий. Несовместимая архитектура: %s"
 
 #: ../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 для установки заместо обновления."
 
-#: ../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:3511 ../yum/__init__.py:3595
+#: ../yum/__init__.py:3511
+#: ../yum/__init__.py:3595
 #, python-format
 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: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 может быть повторно установлен, пропуск"
@@ -2512,7 +2570,7 @@ msgstr "Проблема при переустановке: пакет %s не 
 
 #: ../yum/__init__.py:3678
 msgid "No package(s) available to downgrade"
-msgstr "Нет доступных пакетов для перехода к предыдущей версии"
+msgstr "Пакеты для отката версии отсутствуют"
 
 #: ../yum/__init__.py:3731
 #, python-format
@@ -2524,10 +2582,11 @@ 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"
+msgstr "Ошибка отката версии: %s"
 
 #: ../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) уже установлен"
 
 #. 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"
@@ -2568,21 +2628,20 @@ 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"
+"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:3987
 msgid "Import of key(s) didn't help, wrong key(s)?"
@@ -2600,11 +2659,11 @@ msgstr "Ключ для репозитория %s не установлен."
 
 #: ../yum/__init__.py:4031
 msgid "Key import failed"
-msgstr "Импорт ключа не успешен"
+msgstr "Импорт ключа неудачен"
 
 #: ../yum/__init__.py:4157
 msgid "Unable to find a suitable mirror."
-msgstr "Не удаётся найти подходящее зеркало"
+msgstr "Не удается найти подходящее зеркало"
 
 #: ../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 "Ошибки проверки сценария:"
 
 #: ../yum/__init__.py:4334
 #, python-format
 msgid "Could not set cachedir: %s"
-msgstr "Невозможно установить директорию кэша: %s"
+msgstr "Невозможно задать кэш-папку: %s"
 
 #. Mostly copied from YumOutput._outKeyValFill()
 #: ../yum/plugins.py:202
 msgid "Loaded plugins: "
-msgstr "Загруженные плагины:"
+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"
+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\""
 
 #: ../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\""
 
 #: ../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"
 
 #: ../yum/plugins.py:501
 msgid "registration of commands not supported"
@@ -2713,23 +2770,24 @@ msgstr "Контрольная сумма md5 пакета %s не совпад
 
 #: ../rpmUtils/oldUtils.py:151
 msgid "Could not open RPM database for reading. Perhaps it is already in use?"
-msgstr ""
-"Невозможно открыть базу RPM для чтения. Возможно база уже используется."
+msgstr "Невозможно открыть базу RPM для чтения. Возможно база уже используется."
 
 #: ../rpmUtils/oldUtils.py:183
 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"
+msgstr "Поврежденный заголовок %s"
 
 #: ../rpmUtils/oldUtils.py:281
 #, python-format
 msgid "Error opening rpm %s - error %s"
-msgstr "Невозможно открыть пакет %s - ошибка %s"
+msgstr "Невозможно открыть пакет %s — ошибка %s"
 
 #, fuzzy
 #~ msgid "Parsing package install arguments"
-- 
1.6.6.1


From 0ac90c93ee164ea24951926e8b26ae897ec270af Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Thu, 1 Apr 2010 15:29:18 -0400
Subject: [PATCH 28/53] 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()
 
     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()
 
     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. """
+
         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."""
 
         highdict = {}
         for pkg in self.returnPackages(patterns=patterns,
@@ -1002,8 +1003,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 +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.6.6.1


From 204f47d96e8c585b96da60adf4ef94d8211be168 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Tue, 30 Mar 2010 15:48:29 -0400
Subject: [PATCH 29/53]  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)
 
     @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
 
@@ -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
 
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
 
@@ -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
+
             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)
 
         return returnList
                 
-- 
1.6.6.1


From ae29fa070f83cf2e11b06ea938468e51eac00eba Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Tue, 30 Mar 2010 18:47:49 -0400
Subject: [PATCH 30/53] 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):
 
     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.6.6.1


From 1f76f743d187226461a226358147c37d42a8fab1 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Tue, 30 Mar 2010 18:52:39 -0400
Subject: [PATCH 31/53] 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
 
     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
 
     def searchRequires(self, name):
         return self.searchPrco(name, 'requires')
@@ -364,7 +371,7 @@ class RPMDBPackageSack(PackageSackBase):
         return misc.newestInList(allpkgs)
 
     @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
 
         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
 
     def _uncached_returnConflictPackages(self):
@@ -975,7 +993,7 @@ 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, [])
             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.6.6.1


From 2a9161a8b4bfc121fa8245700df355c63b58b442 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Wed, 31 Mar 2010 00:12:09 -0400
Subject: [PATCH 32/53] 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.6.6.1


From 9ef0326b38b2098d5bac9442ec4eac2fb0f06bb0 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 1 Apr 2010 18:25:50 -0400
Subject: [PATCH 33/53] 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
 
 class FakeRepo(object):
 
-- 
1.6.6.1


From 3d629ee9686dc972ebd431ee0db9c5912e4f24f3 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 1 Apr 2010 18:26:16 -0400
Subject: [PATCH 34/53] 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)
+
+        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())
-- 
1.6.6.1


From 20b93715c0cf57068c5714699a2f2065a0489e2c Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Thu, 1 Apr 2010 18:29:35 -0400
Subject: [PATCH 35/53] 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
 
-    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. '''
 
         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.6.6.1


From 7a56e51a1fa707d46f58ccb8d5687617d78795b6 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Sat, 3 Apr 2010 17:13:02 -0400
Subject: [PATCH 36/53] 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):
 
     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.6.6.1


From c6ffca42ae0c542e0c16ef7d5d2fbba1db1c5fb6 Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Thu, 8 Apr 2010 11:27:45 -0400
Subject: [PATCH 37/53] 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):
 
     # 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.6.6.1


From 72e0bbb2d2dd704071e222b2b3cea86d31d22985 Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Thu, 8 Apr 2010 11:28:45 -0400
Subject: [PATCH 38/53] 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.6.6.1


From 8f7e8978263d9c60bdfa37abaf0c6a44ed42b46d Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Thu, 8 Apr 2010 14:05:25 -0400
Subject: [PATCH 39/53] 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
+
+                # 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.6.6.1


From c508ed6723b73b7606637376b374ee72e5afd42b Mon Sep 17 00:00:00 2001
From: Seth Vidal <skvidal@fedoraproject.org>
Date: Thu, 8 Apr 2010 16:22:04 -0400
Subject: [PATCH 40/53] - 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.6.6.1


From 12a63c100f706738805cb0ead8852308be88027d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Thu, 8 Apr 2010 23:58:58 +0300
Subject: [PATCH 41/53] 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.6.6.1


From 0e58f4bbafd9e1701a33e3805015d647565239c4 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Fri, 9 Apr 2010 00:09:51 -0400
Subject: [PATCH 42/53] 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.6.6.1


From 1b6b585eab225209cfbfdc156eeb27197dfecedc Mon Sep 17 00:00:00 2001
From: skvidal <skvidal@fedoraproject.org>
Date: Fri, 9 Apr 2010 14:06:19 +0000
Subject: [PATCH 43/53] 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 <bor@insight.donbass.com>, 2002
 # Grigory Bakunov <black@asplinux.ru>, 2002, 2003
 # Timur Malikin <sora_tm@mail.ru>, 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 "зависимости: пакет %s конфликтует с %s"
 
-#, fuzzy
 #~ msgid ""
 #~ "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 ""
-#~ "Ошибка восстановления резервной копии lilo.conf. Резервная копия была:\n"
+#~ msgstr "Ошибка восстановления резервной копии lilo.conf. Резервная копия была:\n"
 
 #~ msgid "Looking in available packages for a providing package"
 #~ 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 "Ошибка получения файла: %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"
-#~ "    Usage:  yum [options] <update | upgrade | install | info | remove | "
-#~ "list |\n"
-#~ "            clean | provides | search | check-update | groupinstall | "
-#~ "groupupdate |\n"
+#~ "    Usage:  yum [options] <update | upgrade | install | info | remove | list |\n"
+#~ "            clean | provides | search | check-update | groupinstall | groupupdate |\n"
 #~ "            grouplist >\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"
-#~ "    Usage:  yum [options] <update | upgrade | install | info | remove | "
-#~ "list |\n"
-#~ "            clean | provides |search | check-update | groupinstall | "
-#~ "groupupdate |\n"
+#~ "    Usage:  yum [options] <update | upgrade | install | info | remove | list |\n"
+#~ "            clean | provides |search | check-update | groupinstall | groupupdate |\n"
 #~ "            grouplist >\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.6.6.1


From 8d3f214597e03e5f4e30c877351cf4926a241627 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Fri, 9 Apr 2010 00:17:36 -0400
Subject: [PATCH 44/53] 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.6.6.1


From 543344aa1346a5e3b37a6b813121f6078cfb9aa4 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Fri, 9 Apr 2010 15:59:07 -0400
Subject: [PATCH 45/53] 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 <installroot>/<persistdir>/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.
+
+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.
 
 .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')
+
+    # 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
+
+    # 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.6.6.1


From d2638b9d8b360713f9739a88dfa03e1e3ffab28b Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Fri, 9 Apr 2010 16:14:27 -0400
Subject: [PATCH 46/53] 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.6.6.1


From 3ec0eb7fe87f339c71539636282c018d278d04c5 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Fri, 9 Apr 2010 16:46:08 -0400
Subject: [PATCH 47/53]  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 <installroot>/<persistdir>/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.6.6.1


From cf43ce922a58f6514a7bc76cdc326a89134379fc Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Fri, 9 Apr 2010 16:59:16 -0400
Subject: [PATCH 48/53] 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).
+
+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
-- 
1.6.6.1


From 7fc1a9491a0fc74ec9cf4e95f3c28a0e86c408cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Sat, 10 Apr 2010 13:47:48 +0300
Subject: [PATCH 49/53] 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.6.6.1


From c46e474d6db8f1e1d9aff21de44a3325535cb24f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Sat, 10 Apr 2010 13:58:43 +0300
Subject: [PATCH 50/53] 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.6.6.1


From d3c698e03df6f664c67b61301320ebdc2dc11422 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Mon, 12 Apr 2010 11:50:55 -0400
Subject: [PATCH 51/53] 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)
+
             for tag in ('arch', 'rel', 'ver', 'epoch'):
                 if loc[tag] is not None and loc[tag] != getattr(po, tag):
                     break
-- 
1.6.6.1


From 62759284de079371407f4ba429f48a0be5a5589b Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Mon, 12 Apr 2010 11:53:17 -0400
Subject: [PATCH 52/53] 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 []
+
         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)
+
         return ret
 
     def _makePackageObject(self, hdr, index):
-- 
1.6.6.1


From e45f29737d830587373e2b494fdcee95ad708e65 Mon Sep 17 00:00:00 2001
From: James Antill <james@and.org>
Date: Mon, 12 Apr 2010 11:56:00 -0400
Subject: [PATCH 53/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.6.6.1