| … | |
… | |
| 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.18 2006/01/01 03:46:04 agaffney Exp $ |
8 | $Id: GLIPortage.py,v 1.19 2006/01/02 18:23:34 agaffney Exp $ |
| 9 | """ |
9 | """ |
| 10 | |
10 | |
| 11 | import re |
11 | import re |
| 12 | import GLIUtility |
12 | import GLIUtility |
| 13 | from GLIException import GLIException |
13 | from GLIException import GLIException |
| 14 | |
14 | |
| 15 | class GLIPortage(object): |
15 | class GLIPortage(object): |
| 16 | |
16 | |
| 17 | def __init__(self, chroot_dir, grp_install, logger, debug): |
17 | def __init__(self, chroot_dir, grp_install, logger, debug, cc, compile_logfile): |
| 18 | self._chroot_dir = chroot_dir |
18 | self._chroot_dir = chroot_dir |
| 19 | self._grp_install = grp_install |
19 | self._grp_install = grp_install |
| 20 | self._logger = logger |
20 | self._logger = logger |
| 21 | self._debug = debug |
21 | self._debug = debug |
|
|
22 | self._cc = cc |
|
|
23 | self._compile_logfile = compile_logfile |
| 22 | |
24 | |
| 23 | def get_deps(self, pkgs): |
25 | def get_deps(self, pkgs): |
| 24 | pkglist = [] |
26 | pkglist = [] |
| 25 | if isinstance(pkgs, str): |
27 | if isinstance(pkgs, str): |
| 26 | pkgs = pkgs.split() |
28 | pkgs = pkgs.split() |
| 27 | for pkg in pkgs: |
29 | for pkg in pkgs: |
| 28 | if self._debug: self._logger.log("get_deps(): pkg is " + pkg) |
30 | if self._debug: self._logger.log("get_deps(): pkg is " + pkg) |
| 29 | if not self._grp_install or not self.get_best_version_vdb(pkg): |
31 | 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") |
32 | if self._debug: self._logger.log("get_deps(): grabbing compile deps") |
| 31 | # del(os.environ['ROOT']) |
|
|
| 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") |
33 | 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") |
| 33 | # os.environ['ROOT'] = self._chroot_dir |
|
|
| 34 | else: |
34 | else: |
| 35 | if self._debug: self._logger.log("get_deps(): grabbing binary deps") |
35 | if self._debug: self._logger.log("get_deps(): grabbing binary deps") |
|
|
36 | # Until I have a unified method of getting binary and compile deps, I can't reliably merge the deptrees |
| 36 | tmppkglist = GLIUtility.spawn("python ../../runtimedeps.py " + self._chroot_dir + " " + pkg, return_output=True)[1].strip().split("\n") |
37 | # tmppkglist = GLIUtility.spawn("python ../../runtimedeps.py " + self._chroot_dir + " " + pkg, return_output=True)[1].strip().split("\n") |
|
|
38 | tmppkglist = [] |
|
|
39 | for tmppkg in 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") |
|
|
40 | if self.get_best_version_vdb_chroot("=" + tmppkg): |
|
|
41 | tmppkglist.append(tmppkg) |
| 37 | if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist)) |
42 | if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist)) |
| 38 | for tmppkg in tmppkglist: |
43 | for tmppkg in tmppkglist: |
| 39 | if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist") |
44 | if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist") |
| 40 | if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg): |
45 | if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg): |
| 41 | if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist") |
46 | if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist") |
| … | |
… | |
| 124 | |
129 | |
| 125 | def add_pkg_to_world(self, package): |
130 | def add_pkg_to_world(self, package): |
| 126 | if package.find("/") == -1: |
131 | if package.find("/") == -1: |
| 127 | package = self.get_best_version_vdb_chroot(package) |
132 | package = self.get_best_version_vdb_chroot(package) |
| 128 | if not package: return False |
133 | if not package: return False |
| 129 | expr = re.compile('^(.+?)(-\d.+)?$') |
134 | expr = re.compile('^=?(.+?/.+?)(-\d.+)?$') |
| 130 | res = expr.match(package) |
135 | res = expr.match(package) |
| 131 | if res: |
136 | if res: |
| 132 | GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world") |
137 | GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world") |
| 133 | |
138 | |
| 134 | def get_best_version_vdb(self, package): |
139 | def get_best_version_vdb(self, package): |
| … | |
… | |
| 137 | def get_best_version_vdb_chroot(self, package): |
142 | def get_best_version_vdb_chroot(self, package): |
| 138 | return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip() |
143 | return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip() |
| 139 | |
144 | |
| 140 | # def get_best_version_tree(self, package): |
145 | # def get_best_version_tree(self, package): |
| 141 | # return portage.best(tree.match(package)) |
146 | # return portage.best(tree.match(package)) |
|
|
147 | |
|
|
148 | def emerge(self, packages, add_to_world=True): |
|
|
149 | if isinstance(packages, str): |
|
|
150 | packages = packages.split() |
|
|
151 | pkglist = self.get_deps(packages) |
|
|
152 | if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist)) |
|
|
153 | for i, pkg in enumerate(pkglist): |
|
|
154 | if self._debug: self._logger.log("install_packages(): processing package " + pkg) |
|
|
155 | self._cc.add_notification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) |
|
|
156 | if not self.get_best_version_vdb("=" + pkg): |
|
|
157 | status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True) |
|
|
158 | # status = self._emerge("=" + pkg) |
|
|
159 | if not GLIUtility.exitsuccess(status): |
|
|
160 | raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
|
|
161 | else: |
|
|
162 | # try: |
|
|
163 | self.copy_pkg_to_chroot(pkg) |
|
|
164 | # except: |
|
|
165 | # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
|
|
166 | if add_to_world: |
|
|
167 | for package in packages: |
|
|
168 | self.add_pkg_to_world(package) |