Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r11746 - main/trunk/pym/portage/dbapi
Date: Thu, 30 Oct 2008 03:04:12
Message-Id: E1KvNpR-0005PC-Ed@stork.gentoo.org
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: