1 |
Author: zmedico |
2 |
Date: 2008-10-30 03:04:08 +0000 (Thu, 30 Oct 2008) |
3 |
New Revision: 11746 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/portage/dbapi/vartree.py |
7 |
Log: |
8 |
Bug #225429 - In dblink.unmerge(), eliminate consumers having providers with |
9 |
the same soname as an installed library that is not preserved. This eliminates |
10 |
libraries that are erroneously preserved due to a move from one directory to |
11 |
another. |
12 |
|
13 |
|
14 |
Modified: main/trunk/pym/portage/dbapi/vartree.py |
15 |
=================================================================== |
16 |
--- main/trunk/pym/portage/dbapi/vartree.py 2008-10-29 20:15:28 UTC (rev 11745) |
17 |
+++ main/trunk/pym/portage/dbapi/vartree.py 2008-10-30 03:04:08 UTC (rev 11746) |
18 |
@@ -480,6 +480,11 @@ |
19 |
""" |
20 |
if not self._libs: |
21 |
self.rebuild() |
22 |
+ if isinstance(obj, self._ObjectKey): |
23 |
+ obj_key = obj |
24 |
+ if obj_key not in self._obj_properties: |
25 |
+ raise KeyError("%s not in object list" % obj_key) |
26 |
+ return self._obj_properties[obj_key][3] |
27 |
if obj not in self._obj_key_cache: |
28 |
raise KeyError("%s not in object list" % obj) |
29 |
return self._obj_properties[self._obj_key_cache[obj]][3] |
30 |
@@ -1953,30 +1958,67 @@ |
31 |
plib_dict = plib_registry.getPreservedLibs() |
32 |
lib_graph = digraph() |
33 |
preserved_nodes = set() |
34 |
+ preserved_paths = set() |
35 |
+ path_node_map = {} |
36 |
root = self.myroot |
37 |
+ |
38 |
+ def path_to_node(path): |
39 |
+ node = path_node_map.get(path) |
40 |
+ if node is None: |
41 |
+ node = LinkageMap._LibGraphNode(path, root) |
42 |
+ alt_path_node = lib_graph.get(node) |
43 |
+ if alt_path_node is not None: |
44 |
+ node = alt_path_node |
45 |
+ node.alt_paths.add(path) |
46 |
+ path_node_map[path] = node |
47 |
+ return node |
48 |
+ |
49 |
+ linkmap = self.vartree.dbapi.linkmap |
50 |
for plibs in plib_dict.itervalues(): |
51 |
for f in plibs: |
52 |
- preserved_node = LinkageMap._LibGraphNode(f, root) |
53 |
+ preserved_node = path_to_node(f) |
54 |
if not preserved_node.file_exists(): |
55 |
continue |
56 |
- existing_node = lib_graph.get(preserved_node) |
57 |
- if existing_node is not None: |
58 |
- preserved_node = existing_node |
59 |
- else: |
60 |
- lib_graph.add(preserved_node, None) |
61 |
- preserved_node.alt_paths.add(f) |
62 |
+ lib_graph.add(preserved_node, None) |
63 |
+ preserved_paths.add(f) |
64 |
preserved_nodes.add(preserved_node) |
65 |
for c in self.vartree.dbapi.linkmap.findConsumers(f): |
66 |
- consumer_node = LinkageMap._LibGraphNode(c, root) |
67 |
+ consumer_node = path_to_node(c) |
68 |
if not consumer_node.file_exists(): |
69 |
continue |
70 |
# Note that consumers may also be providers. |
71 |
- existing_node = lib_graph.get(consumer_node) |
72 |
- if existing_node is not None: |
73 |
- consumer_node = existing_node |
74 |
- consumer_node.alt_paths.add(c) |
75 |
lib_graph.add(preserved_node, consumer_node) |
76 |
|
77 |
+ # Eliminate consumers having providers with the same soname as an |
78 |
+ # installed library that is not preserved. This eliminates |
79 |
+ # libraries that are erroneously preserved due to a move from one |
80 |
+ # directory to another. |
81 |
+ provider_cache = {} |
82 |
+ for preserved_node in preserved_nodes: |
83 |
+ soname = linkmap.getSoname(preserved_node) |
84 |
+ for consumer_node in lib_graph.parent_nodes(preserved_node): |
85 |
+ if consumer_node in preserved_nodes: |
86 |
+ continue |
87 |
+ providers = provider_cache.get(consumer_node) |
88 |
+ if providers is None: |
89 |
+ providers = linkmap.findProviders(consumer_node) |
90 |
+ provider_cache[consumer_node] = providers |
91 |
+ providers = providers.get(soname) |
92 |
+ if providers is None: |
93 |
+ continue |
94 |
+ for provider in providers: |
95 |
+ if provider in preserved_paths: |
96 |
+ continue |
97 |
+ provider_node = path_to_node(provider) |
98 |
+ if not provider_node.file_exists(): |
99 |
+ continue |
100 |
+ if provider_node in preserved_nodes: |
101 |
+ continue |
102 |
+ # An alternative provider seems to be |
103 |
+ # installed, so drop this edge. |
104 |
+ lib_graph.remove_edge(preserved_node, consumer_node) |
105 |
+ break |
106 |
+ |
107 |
while not lib_graph.empty(): |
108 |
root_nodes = preserved_nodes.intersection(lib_graph.root_nodes()) |
109 |
if not root_nodes: |