mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-04-28 19:41:11 +00:00
Fixed a bug in the conflicts checker.
This commit is contained in:
parent
18c7435c4f
commit
fd15f44b0c
26
britney.py
26
britney.py
@ -1688,7 +1688,7 @@ class Britney:
|
|||||||
# can't be solved, so return False.
|
# can't be solved, so return False.
|
||||||
def handle_conflict(pkg, source, system, conflicts):
|
def handle_conflict(pkg, source, system, conflicts):
|
||||||
# reached the top of the tree
|
# reached the top of the tree
|
||||||
if not system[source][1]:
|
if not system[source][1][0]:
|
||||||
return False
|
return False
|
||||||
# remove its conflicts
|
# remove its conflicts
|
||||||
unregister_conflicts(source, conflicts)
|
unregister_conflicts(source, conflicts)
|
||||||
@ -1727,7 +1727,7 @@ class Britney:
|
|||||||
|
|
||||||
# if it is a virtual package
|
# if it is a virtual package
|
||||||
providers = []
|
providers = []
|
||||||
if pkg in binaries[1]:
|
if pkg_from and pkg in binaries[1]:
|
||||||
providers = binaries[1][pkg]
|
providers = binaries[1][pkg]
|
||||||
# it is both real and virtual, so the providers are alternatives
|
# it is both real and virtual, so the providers are alternatives
|
||||||
if binary_u:
|
if binary_u:
|
||||||
@ -1752,6 +1752,16 @@ class Britney:
|
|||||||
# if the package doesn't exist, return False
|
# if the package doesn't exist, return False
|
||||||
if not binary_u: return False
|
if not binary_u: return False
|
||||||
|
|
||||||
|
# it is broken, but we have providers
|
||||||
|
if pkg in broken:
|
||||||
|
for p in providers:
|
||||||
|
# try to install the providers skipping excluded packages,
|
||||||
|
# which we already tried but do not work
|
||||||
|
if p in excluded: continue
|
||||||
|
elif satisfy(p, [a for a in providers if a != p], pkg_from):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
# install the package into the system, recording which package required it
|
# install the package into the system, recording which package required it
|
||||||
if type(pkg_from) != list:
|
if type(pkg_from) != list:
|
||||||
pkg_from = [pkg_from]
|
pkg_from = [pkg_from]
|
||||||
@ -1760,13 +1770,17 @@ class Britney:
|
|||||||
# register provided packages
|
# register provided packages
|
||||||
if binary_u['provides']:
|
if binary_u['provides']:
|
||||||
for p in binary_u['provides']:
|
for p in binary_u['provides']:
|
||||||
system[p] = ([], [pkg])
|
if p in system:
|
||||||
|
if system[p][1][0] == None: continue
|
||||||
|
system[p][1].append(pkg)
|
||||||
|
else:
|
||||||
|
system[p] = ([], [pkg])
|
||||||
|
|
||||||
# check the conflicts
|
# check the conflicts
|
||||||
if pkg in conflicts:
|
if pkg in conflicts:
|
||||||
for name, version, op, conflicting in conflicts[pkg]:
|
for name, version, op, conflicting in conflicts[pkg]:
|
||||||
if conflicting not in binary_u['provides'] and ( \
|
if conflicting in binary_u['provides'] and system[conflicting][1] == [pkg]: continue
|
||||||
op == '' and version == '' or check_depends(binary_u['version'], op, version)):
|
if op == '' and version == '' or check_depends(binary_u['version'], op, version):
|
||||||
# if conflict is found, check if it can be solved removing
|
# if conflict is found, check if it can be solved removing
|
||||||
# already-installed packages without broking the system; if
|
# already-installed packages without broking the system; if
|
||||||
# this is not possible, give up and return False
|
# this is not possible, give up and return False
|
||||||
@ -1816,8 +1830,6 @@ class Britney:
|
|||||||
alternatives = map(operator.itemgetter(0), block)
|
alternatives = map(operator.itemgetter(0), block)
|
||||||
valid = False
|
valid = False
|
||||||
for name, version, op in block:
|
for name, version, op in block:
|
||||||
# if the package is broken, don't try it at all
|
|
||||||
if name in broken: continue
|
|
||||||
# otherwise, if it is already installed or it is installable, the block is satisfied
|
# otherwise, if it is already installed or it is installable, the block is satisfied
|
||||||
if name in system or satisfy(name, [a for a in alternatives if a != name], pkg):
|
if name in system or satisfy(name, [a for a in alternatives if a != name], pkg):
|
||||||
valid = True
|
valid = True
|
||||||
|
Loading…
x
Reference in New Issue
Block a user