/[gli]/branches/overhaul/src/GLIPortage.py
Gentoo

Contents of /branches/overhaul/src/GLIPortage.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1221 - (hide annotations) (download) (as text)
Fri Jan 6 16:39:49 2006 UTC (8 years, 11 months ago) by agaffney
Original Path: trunk/src/GLIPortage.py
File MIME type: text/x-python
File size: 10944 byte(s)
  src/GLIUtility.py:
  move parse_vdb_contents() to GLIPortage
  src/GLIPortage.py:
  remove all symlink fixups

1 agaffney 1181 """
2     # Copyright 1999-2005 Gentoo Foundation
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
5     # of which can be found in the main directory of this project.
6     Gentoo Linux Installer
7    
8 agaffney 1221 $Id: GLIPortage.py,v 1.30 2006/01/06 16:39:49 agaffney Exp $
9 agaffney 1181 """
10    
11 agaffney 1182 import re
12 agaffney 1216 import os
13 agaffney 1181 import GLIUtility
14 agaffney 1204 from GLIException import GLIException
15 agaffney 1181
16     class GLIPortage(object):
17    
18 agaffney 1205 def __init__(self, chroot_dir, grp_install, logger, debug, cc, compile_logfile):
19 agaffney 1182 self._chroot_dir = chroot_dir
20 agaffney 1189 self._grp_install = grp_install
21 agaffney 1182 self._logger = logger
22     self._debug = debug
23 agaffney 1205 self._cc = cc
24     self._compile_logfile = compile_logfile
25 agaffney 1181
26 agaffney 1183 def get_deps(self, pkgs):
27 agaffney 1189 pkglist = []
28     if isinstance(pkgs, str):
29     pkgs = pkgs.split()
30     for pkg in pkgs:
31 agaffney 1190 if self._debug: self._logger.log("get_deps(): pkg is " + pkg)
32 agaffney 1189 if not self._grp_install or not self.get_best_version_vdb(pkg):
33 agaffney 1190 if self._debug: self._logger.log("get_deps(): grabbing compile deps")
34 agaffney 1208 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")
35 agaffney 1189 else:
36 agaffney 1190 if self._debug: self._logger.log("get_deps(): grabbing binary deps")
37 agaffney 1210 # The runtimedeps.py script generates a package install order that is *very* different from emerge itself
38     # tmppkglist = GLIUtility.spawn("python ../../runtimedeps.py " + self._chroot_dir + " " + pkg, return_output=True)[1].strip().split("\n")
39     tmppkglist = []
40 agaffney 1214 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 agaffney 1210 if self._debug: self._logger.log("get_deps(): looking at " + tmppkg)
42 agaffney 1211 if self.get_best_version_vdb("=" + tmppkg):
43 agaffney 1210 if self._debug: self._logger.log("get_deps(): package " + tmppkg + " in host vdb...adding to tmppkglist")
44     tmppkglist.append(tmppkg)
45 agaffney 1190 if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist))
46 agaffney 1189 for tmppkg in tmppkglist:
47 agaffney 1192 if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist")
48 agaffney 1194 if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg):
49 agaffney 1192 if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist")
50 agaffney 1189 pkglist.append(tmppkg)
51 agaffney 1190 if self._debug: self._logger.log("get_deps(): pkglist is " + str(pkglist))
52 agaffney 1189 return pkglist
53 agaffney 1182
54 agaffney 1221 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 agaffney 1199 def copy_pkg_to_chroot(self, package, use_root=False):
72 agaffney 1221 symlinks = { '/bin': '/mnt/livecd/bin/', '/boot': '/mnt/livecd/boot/', '/lib': '/mnt/livecd/lib/',
73     '/opt': '/mnt/livecd/opt/', '/sbin': '/mnt/livecd/sbin/', '/usr': '/mnt/livecd/usr/',
74     '/etc/gconf': '/usr/livecd/gconf/' }
75 agaffney 1182
76 agaffney 1208 tmpdir = "/var/tmp/portage"
77     image_dir = tmpdir + "/" + package.split("/")[1] + "/image"
78 agaffney 1198 root_cmd = ""
79     tmp_chroot_dir = self._chroot_dir
80 agaffney 1204 portage_tmpdir = "/var/tmp/portage"
81 agaffney 1198 if use_root:
82     root_cmd = "ROOT=" + self._chroot_dir
83 agaffney 1203 tmp_chroot_dir = ""
84 agaffney 1204 portage_tmpdir = self._chroot_dir + "/var/tmp/portage"
85 agaffney 1198
86 agaffney 1182 # Copy the vdb entry for the package from the LiveCD to the chroot
87     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package)
88     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)):
89     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package)
90    
91 agaffney 1208 # Create the image dir in the chroot
92     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + "'")
93     if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir)):
94     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create image dir for " + package)
95    
96 agaffney 1182 # Create list of files for tar to work with from CONTENTS file in vdb entry
97 agaffney 1221 entries = self.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS")
98 agaffney 1208 if not entries:
99     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping tar and symlink fixup")
100     else:
101     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries))
102     try:
103     tarfiles = open("/tmp/tarfilelist", "w")
104     for entry in entries:
105     parts = entry.split(" ")
106     # Hack for symlink crappiness
107 agaffney 1221 # for symlink in symlinks:
108     # if parts[0].startswith(symlink):
109     # parts[0] = symlinks[symlink] + parts[0][len(symlink):]
110 agaffney 1208 tarfiles.write(parts[0] + "\n")
111     tarfiles.close()
112     except:
113     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package)
114 agaffney 1182
115 agaffney 1208 # Use tar to transfer files into IMAGE directory
116     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x'")
117     if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x")):
118     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package)
119 agaffney 1182
120 agaffney 1221 # # More symlink crappiness hacks
121     # for symlink in symlinks:
122     ## if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]):
123     # if os.path.islink(self._chroot_dir + image_dir + symlink):
124     # if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): fixing " + symlink + " symlink ickiness stuff in " + image_dir + " for " + package)
125     # GLIUtility.spawn("rm " + self._chroot_dir + image_dir + symlink)
126     # if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)):
127     # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package)
128 agaffney 1182
129     # Run pkg_setup
130     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package)
131 agaffney 1204 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild setup", chroot=tmp_chroot_dir)):
132 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package)
133    
134     # Run pkg_preinst
135     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package)
136 agaffney 1204 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)):
137 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package)
138    
139     # Copy files from image_dir to chroot
140 agaffney 1208 if not entries:
141 agaffney 1209 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /")
142 agaffney 1208 else:
143     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package)
144     if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)):
145     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package)
146 agaffney 1182
147     # Run pkg_postinst
148     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package)
149 agaffney 1204 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)):
150 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package)
151    
152     # Remove image_dir
153 agaffney 1208 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package)
154 agaffney 1182 if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)):
155     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package)
156    
157     def add_pkg_to_world(self, package):
158     if package.find("/") == -1:
159 agaffney 1195 package = self.get_best_version_vdb_chroot(package)
160 agaffney 1182 if not package: return False
161 agaffney 1205 expr = re.compile('^=?(.+?/.+?)(-\d.+)?$')
162 agaffney 1182 res = expr.match(package)
163     if res:
164     GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world")
165    
166 agaffney 1185 def get_best_version_vdb(self, package):
167     return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip()
168 agaffney 1189
169 agaffney 1194 def get_best_version_vdb_chroot(self, package):
170 agaffney 1195 return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip()
171 agaffney 1194
172 agaffney 1184 # def get_best_version_tree(self, package):
173     # return portage.best(tree.match(package))
174 agaffney 1205
175     def emerge(self, packages, add_to_world=True):
176     if isinstance(packages, str):
177     packages = packages.split()
178     pkglist = self.get_deps(packages)
179     if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist))
180     for i, pkg in enumerate(pkglist):
181     if self._debug: self._logger.log("install_packages(): processing package " + pkg)
182 agaffney 1208 self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
183     if not self._grp_install or not self.get_best_version_vdb("=" + pkg):
184 agaffney 1205 status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True)
185     # status = self._emerge("=" + pkg)
186     if not GLIUtility.exitsuccess(status):
187     raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
188     else:
189     # try:
190     self.copy_pkg_to_chroot(pkg)
191     # except:
192     # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
193 agaffney 1208 self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
194 agaffney 1205 if add_to_world:
195     for package in packages:
196     self.add_pkg_to_world(package)

Properties

Name Value
svn:eol-style native

  ViewVC Help
Powered by ViewVC 1.1.20