… | |
… | |
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.8 2005/12/26 02:50:37 agaffney Exp $ |
8 | $Id: GLIPortage.py,v 1.40 2006/02/11 17:26:33 agaffney Exp $ |
9 | """ |
9 | """ |
10 | |
10 | |
11 | import re |
11 | import re |
|
|
12 | import os |
12 | import GLIUtility |
13 | import GLIUtility |
13 | import GLIException |
14 | from GLIException import GLIException |
14 | |
15 | |
15 | class GLIPortage(object): |
16 | class GLIPortage(object): |
16 | |
17 | |
17 | def __init__(self, chroot_dir, grp_install, logger, debug): |
18 | def __init__(self, chroot_dir, grp_install, logger, debug, cc, compile_logfile): |
18 | self._chroot_dir = chroot_dir |
19 | self._chroot_dir = chroot_dir |
19 | self._grp_install = grp_install |
20 | self._grp_install = grp_install |
20 | self._logger = logger |
21 | self._logger = logger |
21 | self._debug = debug |
22 | self._debug = debug |
|
|
23 | self._cc = cc |
|
|
24 | self._compile_logfile = compile_logfile |
22 | |
25 | |
23 | def get_deps(self, pkgs): |
26 | def get_deps(self, pkgs): |
24 | pkglist = [] |
27 | pkglist = [] |
25 | if isinstance(pkgs, str): |
28 | if isinstance(pkgs, str): |
26 | pkgs = pkgs.split() |
29 | pkgs = pkgs.split() |
27 | for pkg in pkgs: |
30 | for pkg in pkgs: |
28 | if self._debug: self._logger.log("get_deps(): pkg is " + pkg) |
31 | 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): |
32 | 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") |
33 | 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") |
34 | tmppkglist = GLIUtility.spawn("emerge -p " + pkg + r" 2>/dev/null | 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: |
35 | else: |
35 | if self._debug: self._logger.log("get_deps(): grabbing binary deps") |
36 | if self._debug: self._logger.log("get_deps(): grabbing binary deps") |
|
|
37 | # The runtimedeps.py script generates a package install order that is *very* different from emerge itself |
36 | tmppkglist = GLIUtility.spawn("env ROOT='" + self._chroot_dir + "' python ../../runtimedeps.py " + pkg, return_output=True)[1].strip().split("\n") |
38 | # tmppkglist = GLIUtility.spawn("python ../../runtimedeps.py " + self._chroot_dir + " " + pkg, return_output=True)[1].strip().split("\n") |
|
|
39 | tmppkglist = [] |
|
|
40 | for tmppkg in GLIUtility.spawn("emerge -p " + pkg + r" 2>/dev/null | grep -e '^\[[a-z]' | cut -d ']' -f2 | sed -e 's:^ ::' -e 's: .\+$::'", chroot=self._chroot_dir, return_output=True)[1].strip().split("\n"): |
|
|
41 | if self._debug: self._logger.log("get_deps(): looking at " + tmppkg) |
|
|
42 | if self.get_best_version_vdb("=" + tmppkg): |
|
|
43 | if self._debug: self._logger.log("get_deps(): package " + tmppkg + " in host vdb...adding to tmppkglist") |
|
|
44 | tmppkglist.append(tmppkg) |
37 | if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist)) |
45 | if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist)) |
38 | for tmppkg in tmppkglist: |
46 | for tmppkg in tmppkglist: |
39 | if self._debug: self._logger.log("get_deps(): checking to see if " + tmmpkg + " is already in pkglist") |
47 | if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist") |
40 | if not tmppkg in pkglist: |
48 | if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg): |
41 | if self._debug: self._logger.log("get_deps(): adding " + tmmpkg + " to pkglist") |
49 | if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist") |
42 | pkglist.append(tmppkg) |
50 | pkglist.append(tmppkg) |
43 | if self._debug: self._logger.log("get_deps(): pkglist is " + str(pkglist)) |
51 | if self._debug: self._logger.log("get_deps(): pkglist is " + str(pkglist)) |
44 | return pkglist |
52 | return pkglist |
45 | |
53 | |
46 | def copy_pkg_to_chroot(self, package): |
54 | def parse_vdb_contents(self, file): |
|
|
55 | entries = [] |
|
|
56 | try: |
|
|
57 | vdbfile = open(file, "r") |
|
|
58 | except: |
|
|
59 | return entries |
|
|
60 | for line in vdbfile.readlines(): |
|
|
61 | parts = line.strip().split(" ") |
|
|
62 | if parts[0] == "obj": |
|
|
63 | entries.append(parts[1]) |
|
|
64 | # elif parts[0] == "dir": |
|
|
65 | # entries.append(parts[1] + "/") |
|
|
66 | elif parts[0] == "sym": |
|
|
67 | entries.append(" ".join(parts[1:4])) |
|
|
68 | entries.sort() |
|
|
69 | return entries |
|
|
70 | |
|
|
71 | def copy_pkg_to_chroot(self, package, use_root=False, ignore_missing=False): |
47 | symlinks = { '/bin/': '/mnt/livecd/bin/', '/boot/': '/mnt/livecd/boot/', '/lib/': '/mnt/livecd/lib/', |
72 | symlinks = { '/bin': '/mnt/livecd/bin/', '/boot': '/mnt/livecd/boot/', '/lib': '/mnt/livecd/lib/', |
48 | '/opt/': '/mnt/livecd/opt/', '/sbin/': '/mnt/livecd/sbin/', '/usr/': '/mnt/livecd/usr/', |
73 | '/opt': '/mnt/livecd/opt/', '/sbin': '/mnt/livecd/sbin/', '/usr': '/mnt/livecd/usr/', |
49 | '/etc/gconf/': '/usr/livecd/gconf/' } |
74 | '/etc/gconf': '/usr/livecd/gconf/' } |
|
|
75 | |
|
|
76 | tmpdir = "/var/tmp/portage" |
|
|
77 | image_dir = tmpdir + "/" + package.split("/")[1] + "/image" |
|
|
78 | root_cmd = "" |
|
|
79 | tmp_chroot_dir = self._chroot_dir |
|
|
80 | portage_tmpdir = "/var/tmp/portage" |
|
|
81 | vdb_dir = "/var/db/pkg/" |
|
|
82 | if use_root: |
|
|
83 | root_cmd = "ROOT=" + self._chroot_dir |
|
|
84 | tmp_chroot_dir = "" |
|
|
85 | portage_tmpdir = self._chroot_dir + "/var/tmp/portage" |
|
|
86 | vdb_dir = self._chroot_dir + "/var/db/pkg/" |
|
|
87 | |
|
|
88 | # Check to see if package is actually in vdb |
|
|
89 | if not GLIUtility.is_file("/var/db/pkg/" + package): |
|
|
90 | if ignore_missing: |
|
|
91 | if self._debug: |
|
|
92 | self._logger.log("DEBUG: copy_pkg_to_chroot(): package " + package + " does not have a vdb entry but ignore_missing=True...ignoring error") |
|
|
93 | return |
|
|
94 | else: |
|
|
95 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "There is no vdb entry for " + package) |
50 | |
96 | |
51 | # Copy the vdb entry for the package from the LiveCD to the chroot |
97 | # Copy the vdb entry for the package from the LiveCD to the chroot |
52 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package) |
98 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package) |
53 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + "/var/db/pkg/" + package + " && cp -a /var/db/pkg/" + package + "/* " + self._chroot_dir + "/var/db/pkg/" + package)): |
99 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + "/var/db/pkg/" + package + " && cp -a /var/db/pkg/" + package + "/* " + self._chroot_dir + "/var/db/pkg/" + package)): |
54 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package) |
100 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package) |
55 | |
101 | |
|
|
102 | # Create the image dir in the chroot |
|
|
103 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + "'") |
|
|
104 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir)): |
|
|
105 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create image dir for " + package) |
|
|
106 | |
56 | # Create list of files for tar to work with from CONTENTS file in vdb entry |
107 | # Create list of files for tar to work with from CONTENTS file in vdb entry |
57 | entries = GLIUtility.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS") |
108 | entries = self.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS") |
|
|
109 | if not entries: |
|
|
110 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping tar and symlink fixup") |
|
|
111 | else: |
58 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries)) |
112 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries)) |
59 | try: |
113 | try: |
60 | tarfiles = open("/tmp/tarfilelist", "w") |
114 | tarfiles = open("/tmp/tarfilelist", "w") |
61 | for entry in entries: |
115 | for entry in entries: |
62 | parts = entry.split(" ") |
116 | parts = entry.split(" ") |
63 | # Hack for symlink crappiness |
117 | # # Hack for symlink crappiness |
64 | for symlink in symlinks: |
118 | # for symlink in symlinks: |
65 | if parts[0].startswith(symlink): |
119 | # if parts[0].startswith(symlink): |
66 | parts[0] = symlinks[symlink] + parts[0][len(symlink):] |
120 | # parts[0] = symlinks[symlink] + parts[0][len(symlink):] |
67 | tarfiles.write(parts[0] + "\n") |
121 | tarfiles.write(parts[0] + "\n") |
68 | tarfiles.close() |
122 | tarfiles.close() |
69 | except: |
123 | except: |
70 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package) |
124 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package) |
71 | |
125 | |
72 | # Use tar to transfer files into IMAGE directory |
126 | # Use tar to transfer files into IMAGE directory |
73 | tmpdir = "/var/tmp/portage" |
|
|
74 | image_dir = tmpdir + "/" + package.split("/")[1] + "/image" |
|
|
75 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + " && tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x'") |
127 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'tar -cp --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -xp'") |
76 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir + " && tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x")): |
128 | if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -cp --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -xp")): |
77 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package) |
129 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package) |
78 | |
130 | |
79 | # More symlink crappiness hacks |
131 | # # More symlink crappiness hacks |
80 | for symlink in symlinks: |
132 | # for symlink in symlinks: |
81 | if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]): |
133 | ## if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]): |
82 | # parts[0] = symlinks[symlink] + parts[len(symlink):] |
134 | # if os.path.islink(self._chroot_dir + image_dir + symlink): |
83 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): fixing /usr/livecd/gconf/ stuff in " + image_dir + " for " + package) |
135 | # if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): fixing " + symlink + " symlink ickiness stuff in " + image_dir + " for " + package) |
|
|
136 | # GLIUtility.spawn("rm " + self._chroot_dir + image_dir + symlink) |
84 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)): |
137 | # if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)): |
85 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix /usr/livecd/gconf/ stuff for " + package) |
138 | # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package) |
86 | |
139 | |
87 | # Run pkg_setup |
140 | # Run pkg_setup |
88 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package) |
141 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package) |
89 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env ROOT=" + self._chroot_dir + " PORTAGE_TMPDIR=" + self._chroot_dir + tmpdir + " ebuild " + self._chroot_dir + "/var/db/pkg/" + package + "/*.ebuild setup")): |
142 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild setup", chroot=tmp_chroot_dir)): |
90 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package) |
143 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package) |
91 | |
|
|
92 | # Run qmerge |
|
|
93 | # if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running qmerge for " + package) |
|
|
94 | # if not GLIUtility.exitsuccess(GLIUtility.spawn("env ROOT=" + self._chroot_dir + " PORTAGE_TMPDIR=" + self._chroot_dir + tmpdir + " ebuild " + self._chroot_dir + "/var/db/pkg/" + package + "/*.ebuild qmerge")): |
|
|
95 | # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute qmerge for " + package) |
|
|
96 | |
144 | |
97 | # Run pkg_preinst |
145 | # Run pkg_preinst |
98 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package) |
146 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package) |
99 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env ROOT=" + self._chroot_dir + " PORTAGE_TMPDIR=" + self._chroot_dir + tmpdir + " ebuild " + self._chroot_dir + "/var/db/pkg/" + package + "/*.ebuild preinst")): |
147 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)): |
100 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package) |
148 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package) |
101 | |
149 | |
102 | # Copy files from image_dir to chroot |
150 | # Copy files from image_dir to chroot |
|
|
151 | if not entries: |
|
|
152 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /") |
|
|
153 | else: |
103 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package) |
154 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package) |
104 | if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)): |
155 | # if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)): |
|
|
156 | if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -C " + self._chroot_dir + image_dir + "/ -c . | tar -C " + self._chroot_dir + "/ -x")): |
105 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package) |
157 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package) |
106 | |
158 | |
107 | # Run pkg_postinst |
159 | # Run pkg_postinst |
108 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package) |
160 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package) |
109 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env ROOT=" + self._chroot_dir + " PORTAGE_TMPDIR=" + self._chroot_dir + tmpdir + " ebuild " + "/var/db/pkg/" + package + "/*.ebuild postinst")): |
161 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)): |
110 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package) |
162 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package) |
111 | |
163 | |
112 | # Remove image_dir |
164 | # Remove image_dir |
113 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing + " + image_dir + " for " + package) |
165 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package) |
114 | if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)): |
166 | if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)): |
115 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package) |
167 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package) |
116 | |
168 | |
|
|
169 | # Run env-update |
|
|
170 | if not use_root: |
|
|
171 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running env-update inside chroot") |
|
|
172 | if not GLIUtility.exitstatus(GLIUtility.spawn("env-update", chroot=self._chroot_dir)): |
|
|
173 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not run env-update for " + package) |
|
|
174 | |
117 | def add_pkg_to_world(self, package): |
175 | def add_pkg_to_world(self, package): |
118 | if package.find("/") == -1: |
176 | if package.find("/") == -1: |
119 | package = GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip() |
177 | package = self.get_best_version_vdb_chroot(package) |
120 | if not package: return False |
178 | if not package: return False |
121 | expr = re.compile('^(.+?)(-\d.+)?$') |
179 | expr = re.compile('^=?(.+?/.+?)(-\d.+)?$') |
122 | res = expr.match(package) |
180 | res = expr.match(package) |
123 | if res: |
181 | if res: |
124 | GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world") |
182 | GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world") |
125 | |
183 | |
126 | def get_best_version_vdb(self, package): |
184 | def get_best_version_vdb(self, package): |
|
|
185 | if package.startswith('='): |
|
|
186 | package = package[1:] |
|
|
187 | if GLIUtility.is_file("/var/db/pkg/" + package): |
|
|
188 | return package |
|
|
189 | else: |
|
|
190 | return "" |
|
|
191 | else: |
127 | return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip() |
192 | return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip() |
|
|
193 | |
|
|
194 | def get_best_version_vdb_chroot(self, package): |
|
|
195 | if package.startswith('='): |
|
|
196 | package = package[1:] |
|
|
197 | if GLIUtility.is_file(self._chroot_dir + "/var/db/pkg/" + package): |
|
|
198 | return package |
|
|
199 | else: |
|
|
200 | return "" |
|
|
201 | else: |
|
|
202 | return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip() |
128 | |
203 | |
129 | # def get_best_version_tree(self, package): |
204 | # def get_best_version_tree(self, package): |
130 | # return portage.best(tree.match(package)) |
205 | # return portage.best(tree.match(package)) |
|
|
206 | |
|
|
207 | def emerge(self, packages, add_to_world=True): |
|
|
208 | if isinstance(packages, str): |
|
|
209 | packages = packages.split() |
|
|
210 | self._cc.addNotification("progress", (0, "Calculating dependencies for " + " ".join(packages))) |
|
|
211 | pkglist = self.get_deps(packages) |
|
|
212 | if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist)) |
|
|
213 | for i, pkg in enumerate(pkglist): |
|
|
214 | if self._debug: self._logger.log("install_packages(): processing package " + pkg) |
|
|
215 | self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) |
|
|
216 | if not self._grp_install or not self.get_best_version_vdb("=" + pkg): |
|
|
217 | status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True) |
|
|
218 | # status = self._emerge("=" + pkg) |
|
|
219 | if not GLIUtility.exitsuccess(status): |
|
|
220 | raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
|
|
221 | else: |
|
|
222 | # try: |
|
|
223 | self.copy_pkg_to_chroot(pkg) |
|
|
224 | # except: |
|
|
225 | # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
|
|
226 | self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) |
|
|
227 | if add_to_world: |
|
|
228 | for package in packages: |
|
|
229 | self.add_pkg_to_world(package) |