| … | |
… | |
| 3 | # This source code is distributed under the terms of version 2 of the GNU |
3 | # This source code is distributed under the terms of version 2 of the GNU |
| 4 | # General Public License as published by the Free Software Foundation, a copy |
4 | # General Public License as published by the Free Software Foundation, a copy |
| 5 | # of which can be found in the main directory of this project. |
5 | # of which can be found in the main directory of this project. |
| 6 | Gentoo Linux Installer |
6 | Gentoo Linux Installer |
| 7 | |
7 | |
| 8 | $Id: GLIPortage.py,v 1.7 2005/12/26 01:51:36 agaffney Exp $ |
8 | $Id: GLIPortage.py,v 1.8 2005/12/26 02:50:37 agaffney Exp $ |
| 9 | """ |
9 | """ |
| 10 | |
10 | |
| 11 | import re |
11 | import re |
| 12 | import GLIUtility |
12 | import GLIUtility |
| 13 | import GLIException |
13 | import GLIException |
| 14 | |
|
|
| 15 | class MissingPackagesError(Exception): |
|
|
| 16 | pass |
|
|
| 17 | |
|
|
| 18 | class depgraph: |
|
|
| 19 | |
|
|
| 20 | def __init__(self): |
|
|
| 21 | self.graph = {} |
|
|
| 22 | |
|
|
| 23 | def add(self, node, parent=None): |
|
|
| 24 | if node not in self.graph: |
|
|
| 25 | self.graph[node] = [[], []] |
|
|
| 26 | if parent and parent not in self.graph[node][0]: |
|
|
| 27 | if parent not in self.graph: |
|
|
| 28 | self.graph[parent] = [[], []] |
|
|
| 29 | self.graph[node][0].append(parent) |
|
|
| 30 | self.graph[parent][1].append(node) |
|
|
| 31 | |
|
|
| 32 | def remove(self, node): |
|
|
| 33 | for parent in self.graph[node][0]: |
|
|
| 34 | self.graph[parent][1].remove(node) |
|
|
| 35 | for child in self.graph[node][1]: |
|
|
| 36 | self.graph[child][0].remove(node) |
|
|
| 37 | return self.graph.pop(node) |
|
|
| 38 | |
|
|
| 39 | def has_node(self, node): |
|
|
| 40 | return node in self.graph |
|
|
| 41 | |
|
|
| 42 | def leaf_nodes(self): |
|
|
| 43 | return [node for node in self.graph if not self.graph[node][1]] |
|
|
| 44 | |
|
|
| 45 | def node_count(self): |
|
|
| 46 | return len(self.graph) |
|
|
| 47 | |
|
|
| 48 | def important_node(self): |
|
|
| 49 | important_node = None |
|
|
| 50 | importance = 0 |
|
|
| 51 | for node in self.graph: |
|
|
| 52 | if len(self.graph[node][0]) > importance: |
|
|
| 53 | importance = len(self.graph[node][0]) |
|
|
| 54 | important_node = node |
|
|
| 55 | return important_node |
|
|
| 56 | |
14 | |
| 57 | class GLIPortage(object): |
15 | class GLIPortage(object): |
| 58 | |
16 | |
| 59 | def __init__(self, chroot_dir, grp_install, logger, debug): |
17 | def __init__(self, chroot_dir, grp_install, logger, debug): |
| 60 | self._chroot_dir = chroot_dir |
18 | self._chroot_dir = chroot_dir |
| … | |
… | |
| 65 | def get_deps(self, pkgs): |
23 | def get_deps(self, pkgs): |
| 66 | pkglist = [] |
24 | pkglist = [] |
| 67 | if isinstance(pkgs, str): |
25 | if isinstance(pkgs, str): |
| 68 | pkgs = pkgs.split() |
26 | pkgs = pkgs.split() |
| 69 | for pkg in pkgs: |
27 | for pkg in pkgs: |
|
|
28 | if self._debug: self._logger.log("get_deps(): pkg is " + pkg) |
| 70 | if not self._grp_install or not self.get_best_version_vdb(pkg): |
29 | if not self._grp_install or not self.get_best_version_vdb(pkg): |
|
|
30 | if self._debug: self._logger.log("get_deps(): grabbing compile deps") |
| 71 | # del(os.environ['ROOT']) |
31 | # del(os.environ['ROOT']) |
| 72 | tmppkglist = GLIUtility.spawn("emerge -p " + pkgs + r" | grep -e '^\[[a-z]' | cut -d ']' -f2 | sed -e 's:^ ::' -e 's: .\+$::'", chroot=self._chroot_dir, return_output=True)[1].split("\n") |
32 | tmppkglist = GLIUtility.spawn("emerge -p " + pkgs + r" | grep -e '^\[[a-z]' | cut -d ']' -f2 | sed -e 's:^ ::' -e 's: .\+$::'", chroot=self._chroot_dir, return_output=True)[1].strip().split("\n") |
| 73 | # os.environ['ROOT'] = self._chroot_dir |
33 | # os.environ['ROOT'] = self._chroot_dir |
| 74 | else: |
34 | else: |
|
|
35 | if self._debug: self._logger.log("get_deps(): grabbing binary deps") |
| 75 | tmppkglist = GLIUtility.spawn("env ROOT=" + self._chroot_dir + " python ../../runtimedeps.py " + pkg, return_output=True)[1].split("\n")[:-1] |
36 | tmppkglist = GLIUtility.spawn("env ROOT='" + self._chroot_dir + "' python ../../runtimedeps.py " + pkg, return_output=True)[1].strip().split("\n") |
|
|
37 | if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist)) |
| 76 | for tmppkg in tmppkglist: |
38 | for tmppkg in tmppkglist: |
|
|
39 | if self._debug: self._logger.log("get_deps(): checking to see if " + tmmpkg + " is already in pkglist") |
| 77 | if not tmppkg in pkglist: |
40 | if not tmppkg in pkglist: |
|
|
41 | if self._debug: self._logger.log("get_deps(): adding " + tmmpkg + " to pkglist") |
| 78 | pkglist.append(tmppkg) |
42 | pkglist.append(tmppkg) |
|
|
43 | if self._debug: self._logger.log("get_deps(): pkglist is " + str(pkglist)) |
| 79 | return pkglist |
44 | return pkglist |
| 80 | |
45 | |
| 81 | def copy_pkg_to_chroot(self, package): |
46 | def copy_pkg_to_chroot(self, package): |
| 82 | symlinks = { '/bin/': '/mnt/livecd/bin/', '/boot/': '/mnt/livecd/boot/', '/lib/': '/mnt/livecd/lib/', |
47 | symlinks = { '/bin/': '/mnt/livecd/bin/', '/boot/': '/mnt/livecd/boot/', '/lib/': '/mnt/livecd/lib/', |
| 83 | '/opt/': '/mnt/livecd/opt/', '/sbin/': '/mnt/livecd/sbin/', '/usr/': '/mnt/livecd/usr/', |
48 | '/opt/': '/mnt/livecd/opt/', '/sbin/': '/mnt/livecd/sbin/', '/usr/': '/mnt/livecd/usr/', |