Skip to content

Commit 43f3c42

Browse files
authored
Merge pull request rpm-software-management#69 from dmnks/bz1477574
update(): honor multilib_policy for obsoletes
2 parents aa9bbae + 25a1cf0 commit 43f3c42

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

test/simpleobsoletestests.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ def testObsoletenoarchTonoarchForDependency(self):
3838

3939
def testObsoletenoarchToi386(self):
4040
p = self.pkgs
41-
res, msg = self.runOperation(['update'], [p.installed_noarch], [p.obsoletes_i386])
41+
res, msg = self.runOperation(['update'], [p.installed_noarch], [p.obsoletes_i386],
42+
{'multilib_policy': 'all'})
4243
self.assert_(res=='ok', msg)
4344
self.assertResult((p.obsoletes_i386,))
4445
def testObsoletenoarchToi386ForDependency(self):
@@ -50,7 +51,8 @@ def testObsoletenoarchToi386ForDependency(self):
5051

5152
def testObsoletenoarchTox86_64(self):
5253
p = self.pkgs
53-
res, msg = self.runOperation(['update'], [p.installed_noarch], [p.obsoletes_x86_64])
54+
res, msg = self.runOperation(['update'], [p.installed_noarch], [p.obsoletes_x86_64],
55+
{'multilib_policy': 'all'})
5456
self.assert_(res=='ok', msg)
5557
self.assertResult((p.obsoletes_x86_64,))
5658
def testObsoletenoarchTox86_64ForDependency(self):
@@ -62,7 +64,8 @@ def testObsoletenoarchTox86_64ForDependency(self):
6264

6365
def testObsoletenoarchToMultiarch(self):
6466
p = self.pkgs
65-
res, msg = self.runOperation(['update'], [p.installed_noarch], [p.obsoletes_i386, p.obsoletes_x86_64])
67+
res, msg = self.runOperation(['update'], [p.installed_noarch], [p.obsoletes_i386, p.obsoletes_x86_64],
68+
{'multilib_policy': 'all'})
6669
self.assert_(res=='ok', msg)
6770
if new_behavior:
6871
self.assertResult((p.obsoletes_x86_64,), (p.obsoletes_i386,))

yum/__init__.py

+25-1
Original file line numberDiff line numberDiff line change
@@ -4789,6 +4789,21 @@ def _valid_install_arch(self, po, ipkgs=None):
47894789
return False
47904790
return True
47914791

4792+
def _valid_obsoleter_arch(self, obsoleter, obsoletee):
4793+
"""Return whether this obsoleter meets multilib_policy in case we are
4794+
dealing with the noarch->arch obsoletion case."""
4795+
if not self.arch.multilib or self.conf.multilib_policy != 'best':
4796+
# Install everything
4797+
return True
4798+
if obsoletee.arch != 'noarch' or obsoleter.arch == 'noarch':
4799+
# We do respect any arch->(no)arch obsoletions (having
4800+
# obsoletee.i386 installed on x86_64, you'd still expect
4801+
# obsoleter.i386 to replace it, even if you have
4802+
# multilib_policy=best).
4803+
return True
4804+
# noarch->arch case
4805+
return obsoleter.arch in self.arch.legit_multi_arches
4806+
47924807
def install(self, po=None, **kwargs):
47934808
"""Mark the specified item for installation. If a package
47944809
object is given, mark it for installation. Otherwise, mark
@@ -5156,10 +5171,12 @@ def _dbg2(*args, **kwargs):
51565171
allow_missing=True)
51575172
if obsoleting_pkg is None:
51585173
continue
5174+
installed_pkg = self.getInstalledPackageObject(installed)
5175+
if not self._valid_obsoleter_arch(obsoleting_pkg, installed_pkg):
5176+
continue
51595177
topkg = self._test_loop(obsoleting_pkg, self._pkg2obspkg)
51605178
if topkg is not None:
51615179
obsoleting_pkg = topkg
5162-
installed_pkg = self.getInstalledPackageObject(installed)
51635180
txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg)
51645181
self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg)
51655182
if requiringPo:
@@ -5193,6 +5210,7 @@ def _dbg2(*args, **kwargs):
51935210

51945211
instpkgs = []
51955212
availpkgs = []
5213+
arch_specified = True
51965214
if po: # just a po
51975215
if po.repoid == 'installed':
51985216
instpkgs.append(po)
@@ -5254,6 +5272,8 @@ def _dbg2(*args, **kwargs):
52545272
self.logger.critical(_('No Match for argument: %s') % to_unicode(arg))
52555273
if not self.conf.skip_missing_names_on_update:
52565274
raise Errors.UpdateMissingNameError, _('Not tolerating missing names on update, stopping.')
5275+
5276+
arch_specified = '.' in kwargs['pattern']
52575277

52585278
else: # we have kwargs, sort them out.
52595279
nevra_dict = self._nevra_kwarg_parse(kwargs)
@@ -5306,12 +5326,16 @@ def _dbg2(*args, **kwargs):
53065326
allow_missing=True)
53075327
if obsoleting_pkg is None:
53085328
continue
5329+
if not arch_specified and not self._valid_obsoleter_arch(obsoleting_pkg, installed_pkg):
5330+
continue
53095331
obs_pkgs.append(obsoleting_pkg)
53105332
# NOTE: Broekn wrt. repoid
53115333
for obsoleting_pkg in packagesNewestByName(obs_pkgs):
53125334
tx_return.extend(self.install(po=obsoleting_pkg))
53135335
for available_pkg in availpkgs:
53145336
for obsoleted_pkg in self._find_obsoletees(available_pkg):
5337+
if not arch_specified and not self._valid_obsoleter_arch(available_pkg, obsoleted_pkg):
5338+
continue
53155339
obsoleted = obsoleted_pkg.pkgtup
53165340
txmbr = self.tsInfo.addObsoleting(available_pkg, obsoleted_pkg)
53175341
if requiringPo:

0 commit comments

Comments
 (0)