1 |
Author: agaffney |
2 |
Date: 2008-02-28 02:54:42 +0000 (Thu, 28 Feb 2008) |
3 |
New Revision: 1885 |
4 |
|
5 |
Added: |
6 |
trunk/src/vdb_to_fake_binrepo.py |
7 |
Removed: |
8 |
trunk/src/runtimedeps.py |
9 |
Modified: |
10 |
trunk/ChangeLog |
11 |
Log: |
12 |
Add vdb_to_fake_binrepo.py script from the always awesome zmedico |
13 |
|
14 |
Modified: trunk/ChangeLog |
15 |
=================================================================== |
16 |
--- trunk/ChangeLog 2007-12-06 03:14:49 UTC (rev 1884) |
17 |
+++ trunk/ChangeLog 2008-02-28 02:54:42 UTC (rev 1885) |
18 |
@@ -1,7 +1,11 @@ |
19 |
# ChangeLog for Gentoo Linux Installer |
20 |
-# Copyright 2005-2007 Gentoo Foundation; Distributed under the GPL v2 |
21 |
+# Copyright 2005-2008 Gentoo Foundation; Distributed under the GPL v2 |
22 |
# $Id: $ |
23 |
|
24 |
+ 28 Feb 2008; Andrew Gaffney <agaffney@g.o> -src/runtimedeps.py, |
25 |
+ +src/vdb_to_fake_binrepo.py: |
26 |
+ Add vdb_to_fake_binrepo.py script from the always awesome zmedico |
27 |
+ |
28 |
03 Dec 2007; Andrew Gaffney <agaffney@g.o> src/GLIPortage.py: |
29 |
force livecd and bindist USE |
30 |
|
31 |
|
32 |
Deleted: trunk/src/runtimedeps.py |
33 |
=================================================================== |
34 |
--- trunk/src/runtimedeps.py 2007-12-06 03:14:49 UTC (rev 1884) |
35 |
+++ trunk/src/runtimedeps.py 2008-02-28 02:54:42 UTC (rev 1885) |
36 |
@@ -1,130 +0,0 @@ |
37 |
-""" |
38 |
-# Copyright 1999-2005 Gentoo Foundation |
39 |
-# This source code is distributed under the terms of version 2 of the GNU |
40 |
-# General Public License as published by the Free Software Foundation, a copy |
41 |
-# of which can be found in the main directory of this project. |
42 |
-Gentoo Linux Installer |
43 |
- |
44 |
-$Id: runtimedeps.py,v 1.3 2005/12/26 19:26:26 agaffney Exp $ |
45 |
-""" |
46 |
- |
47 |
-import os, sys |
48 |
- |
49 |
-class MissingPackagesError(Exception): |
50 |
- pass |
51 |
- |
52 |
-class depgraph: |
53 |
- |
54 |
- def __init__(self): |
55 |
- self.graph = {} |
56 |
- |
57 |
- def add(self, node, parent=None): |
58 |
- if node not in self.graph: |
59 |
- self.graph[node] = [[], []] |
60 |
- if parent and parent not in self.graph[node][0]: |
61 |
- if parent not in self.graph: |
62 |
- self.graph[parent] = [[], []] |
63 |
- self.graph[node][0].append(parent) |
64 |
- self.graph[parent][1].append(node) |
65 |
- |
66 |
- def remove(self, node): |
67 |
- for parent in self.graph[node][0]: |
68 |
- self.graph[parent][1].remove(node) |
69 |
- for child in self.graph[node][1]: |
70 |
- self.graph[child][0].remove(node) |
71 |
- return self.graph.pop(node) |
72 |
- |
73 |
- def has_node(self, node): |
74 |
- return node in self.graph |
75 |
- |
76 |
- def leaf_nodes(self): |
77 |
- return [node for node in self.graph if not self.graph[node][1]] |
78 |
- |
79 |
- def node_count(self): |
80 |
- return len(self.graph) |
81 |
- |
82 |
- def important_node(self): |
83 |
- important_node = None |
84 |
- importance = 0 |
85 |
- for node in self.graph: |
86 |
- if len(self.graph[node][0]) > importance: |
87 |
- importance = len(self.graph[node][0]) |
88 |
- important_node = node |
89 |
- return important_node |
90 |
- |
91 |
-def resolve_deps(dep_list): |
92 |
- if dep_list and dep_list[0] == "||": |
93 |
- for dep in dep_list[1:]: |
94 |
- if isinstance(dep, list): |
95 |
- try: |
96 |
- atoms = resolve_deps(dep) |
97 |
- except MissingPackagesError: |
98 |
- continue |
99 |
- else: |
100 |
- atoms = [dep] |
101 |
- all_found = True |
102 |
- for atom in atoms: |
103 |
- if not atom.startswith("!") and not vdb.match(atom): |
104 |
- all_found = False |
105 |
- break |
106 |
- if all_found: |
107 |
- return atoms |
108 |
- raise MissingPackagesError(dep_list) |
109 |
- atoms = [] |
110 |
- for dep in dep_list: |
111 |
- if isinstance(dep, list): |
112 |
- atoms.extend(resolve_deps(dep)) |
113 |
- elif not dep.startswith("!"): |
114 |
- if not vdb.match(dep): |
115 |
- raise MissingPackagesError([dep]) |
116 |
- atoms.append(dep) |
117 |
- return atoms |
118 |
- |
119 |
-def calc_required_pkgs(atom, graph, parent=None): |
120 |
- pkg = portage.best(vdb.match(atom)) |
121 |
- if not pkg: |
122 |
- raise MissingPackagesError([atom]) |
123 |
- if pkg == parent: |
124 |
- return |
125 |
- already_processed = graph.has_node(pkg) |
126 |
- graph.add(pkg, parent) |
127 |
- if already_processed: |
128 |
- return |
129 |
- useflags = vdb.aux_get(pkg, ["USE"])[0].split() |
130 |
- rdep_raw = " ".join(vdb.aux_get(pkg, ["RDEPEND", "PDEPEND"])) |
131 |
- rdep_struct = portage_dep.use_reduce(portage_dep.paren_reduce(rdep_raw), uselist=useflags) |
132 |
- rdep_struct = portage.dep_virtual(portage_dep.dep_opconvert(rdep_struct), portage.settings) |
133 |
- rdep_atoms = portage.unique_array(resolve_deps(rdep_struct)) |
134 |
- for atom in rdep_atoms: |
135 |
- calc_required_pkgs(atom, graph, pkg) |
136 |
- |
137 |
-def prune_existing(graph): |
138 |
- db = portage.db[portage.root]["vartree"].dbapi |
139 |
- for atom in db.cp_all(): |
140 |
- for pkg in db.match(atom): |
141 |
- if graph.has_node(pkg): |
142 |
- graph.remove(pkg) |
143 |
- |
144 |
-def get_deps(pkgs): |
145 |
- pkglist = [] |
146 |
- graph = depgraph() |
147 |
- for pkg in pkgs.split(): |
148 |
- if not vdb.match(pkg): |
149 |
- continue |
150 |
- calc_required_pkgs(pkg, graph) |
151 |
- while graph.node_count(): |
152 |
- leaf_nodes = graph.leaf_nodes() |
153 |
- if not leaf_nodes: |
154 |
- node = graph.important_node() |
155 |
- pkglist.append(node) |
156 |
- graph.remove(node) |
157 |
- continue |
158 |
- pkglist.extend(leaf_nodes) |
159 |
- for node in leaf_nodes: |
160 |
- graph.remove(node) |
161 |
- return pkglist |
162 |
- |
163 |
-os.environ['ROOT'] = sys.argv[1] |
164 |
-import portage, portage_dep |
165 |
-vdb = portage.db["/"]["vartree"].dbapi |
166 |
-print "\n".join(get_deps(" ".join(sys.argv[2:]))) |
167 |
|
168 |
Added: trunk/src/vdb_to_fake_binrepo.py |
169 |
=================================================================== |
170 |
--- trunk/src/vdb_to_fake_binrepo.py (rev 0) |
171 |
+++ trunk/src/vdb_to_fake_binrepo.py 2008-02-28 02:54:42 UTC (rev 1885) |
172 |
@@ -0,0 +1,60 @@ |
173 |
+#!/usr/bin/env python |
174 |
+# Copyright 1999-2008 Gentoo Foundation |
175 |
+# Distributed under the terms of the GNU General Public License v2 |
176 |
+# $Header: $ |
177 |
+# |
178 |
+# Zac Medico <zmedico@g.o> |
179 |
+# |
180 |
+ |
181 |
+import os |
182 |
+import sys |
183 |
+from itertools import izip |
184 |
+ |
185 |
+def vdb_to_fake_binrepo(): |
186 |
+ |
187 |
+ metadata_keys = ["CATEGORY", "CHOST", "DEPEND", |
188 |
+ "EAPI", "IUSE", "KEYWORDS", "LICENSE", "PF", |
189 |
+ "PROVIDE", "RDEPEND", "PDEPEND", "SLOT", "USE"] |
190 |
+ |
191 |
+ import portage |
192 |
+ try: |
193 |
+ from portage import xpak |
194 |
+ from portage.util import ensure_dirs |
195 |
+ except ImportError: |
196 |
+ import xpak |
197 |
+ from portage_util import ensure_dirs |
198 |
+ |
199 |
+ root = portage.settings["ROOT"] |
200 |
+ vartree = portage.db[root]["vartree"] |
201 |
+ bintree = portage.db[root]["bintree"] |
202 |
+ |
203 |
+ for cpv in vartree.dbapi.cpv_all(): |
204 |
+ bintree.prevent_collision(cpv) |
205 |
+ metadata = dict(izip(metadata_keys, |
206 |
+ vartree.dbapi.aux_get(cpv, metadata_keys))) |
207 |
+ xpdata = xpak.xpak_mem(metadata) |
208 |
+ binpkg_tmpfile = os.path.join(bintree.pkgdir, |
209 |
+ cpv + ".tbz2." + str(os.getpid())) |
210 |
+ ensure_dirs(os.path.dirname(binpkg_tmpfile)) |
211 |
+ xpak.tbz2(binpkg_tmpfile).recompose_mem(xpdata) |
212 |
+ binpkg_path = bintree.getname(cpv) |
213 |
+ ensure_dirs(os.path.dirname(binpkg_path)) |
214 |
+ os.rename(binpkg_tmpfile, binpkg_path) |
215 |
+ bintree.inject(cpv) |
216 |
+ |
217 |
+def main(): |
218 |
+ description = "This program uses the currently installed packages to" + \ |
219 |
+ " populate $PKGDIR with a fake binary package repository that is " + \ |
220 |
+ "suitable for dependency calculations." |
221 |
+ usage = "usage: %s" % os.path.basename(sys.argv[0]) |
222 |
+ from optparse import OptionParser |
223 |
+ parser = OptionParser(description=description, usage=usage) |
224 |
+ options, args = parser.parse_args(args=sys.argv[1:]) |
225 |
+ vdb_to_fake_binrepo() |
226 |
+ |
227 |
+if __name__ == '__main__': |
228 |
+ try: |
229 |
+ main() |
230 |
+ except KeyboardInterrupt: |
231 |
+ print "Interrupted." |
232 |
+ sys.exit(1) |
233 |
|
234 |
|
235 |
Property changes on: trunk/src/vdb_to_fake_binrepo.py |
236 |
___________________________________________________________________ |
237 |
Name: svn:executable |
238 |
+ * |
239 |
Name: svn:keywords |
240 |
+ Id |
241 |
|
242 |
-- |
243 |
gentoo-commits@l.g.o mailing list |