Gentoo Archives: gentoo-commits

From: "Andrew Gaffney (agaffney)" <agaffney@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gli r1885 - in trunk: . src
Date: Thu, 28 Feb 2008 02:54:47
Message-Id: E1JUYux-0007qi-Q1@stork.gentoo.org
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