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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1269 - (hide annotations) (download) (as text)
Sun Feb 5 19:42:22 2006 UTC (8 years, 2 months ago) by agaffney
Original Path: trunk/src/GLIPortage.py
File MIME type: text/x-python
File size: 11115 byte(s)
  src/GLIPortage.py:
  copy_pkg_to_chroot() uses /vdb for ROOT= installs

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 1269 $Id: GLIPortage.py,v 1.33 2006/02/05 19:42:22 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 agaffney 1222 # elif parts[0] == "dir":
65     # entries.append(parts[1] + "/")
66 agaffney 1221 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 1269 vdb_dir = "/var/db/pkg"
82 agaffney 1198 if use_root:
83     root_cmd = "ROOT=" + self._chroot_dir
84 agaffney 1203 tmp_chroot_dir = ""
85 agaffney 1204 portage_tmpdir = self._chroot_dir + "/var/tmp/portage"
86 agaffney 1269 vdb_dir = self._chroot_dir + "/var/db/pkg"
87 agaffney 1198
88 agaffney 1182 # Copy the vdb entry for the package from the LiveCD to the chroot
89     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package)
90     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)):
91     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package)
92    
93 agaffney 1208 # Create the image dir in the chroot
94     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + "'")
95     if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir)):
96     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create image dir for " + package)
97    
98 agaffney 1182 # Create list of files for tar to work with from CONTENTS file in vdb entry
99 agaffney 1221 entries = self.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS")
100 agaffney 1208 if not entries:
101     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping tar and symlink fixup")
102     else:
103     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries))
104     try:
105     tarfiles = open("/tmp/tarfilelist", "w")
106     for entry in entries:
107     parts = entry.split(" ")
108 agaffney 1222 # # Hack for symlink crappiness
109 agaffney 1221 # for symlink in symlinks:
110     # if parts[0].startswith(symlink):
111     # parts[0] = symlinks[symlink] + parts[0][len(symlink):]
112 agaffney 1208 tarfiles.write(parts[0] + "\n")
113     tarfiles.close()
114     except:
115     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package)
116 agaffney 1182
117 agaffney 1208 # Use tar to transfer files into IMAGE directory
118 agaffney 1222 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'")
119     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")):
120 agaffney 1208 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package)
121 agaffney 1182
122 agaffney 1221 # # More symlink crappiness hacks
123     # for symlink in symlinks:
124     ## if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]):
125     # if os.path.islink(self._chroot_dir + image_dir + symlink):
126     # if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): fixing " + symlink + " symlink ickiness stuff in " + image_dir + " for " + package)
127     # GLIUtility.spawn("rm " + self._chroot_dir + image_dir + symlink)
128     # if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)):
129     # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package)
130 agaffney 1182
131     # Run pkg_setup
132     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package)
133 agaffney 1269 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild setup", chroot=tmp_chroot_dir)):
134 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package)
135    
136     # Run pkg_preinst
137     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package)
138 agaffney 1269 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)):
139 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package)
140    
141     # Copy files from image_dir to chroot
142 agaffney 1208 if not entries:
143 agaffney 1209 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /")
144 agaffney 1208 else:
145     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package)
146     if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)):
147     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package)
148 agaffney 1182
149     # Run pkg_postinst
150     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package)
151 agaffney 1269 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)):
152 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package)
153    
154     # Remove image_dir
155 agaffney 1208 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package)
156 agaffney 1182 if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)):
157     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package)
158    
159     def add_pkg_to_world(self, package):
160     if package.find("/") == -1:
161 agaffney 1195 package = self.get_best_version_vdb_chroot(package)
162 agaffney 1182 if not package: return False
163 agaffney 1205 expr = re.compile('^=?(.+?/.+?)(-\d.+)?$')
164 agaffney 1182 res = expr.match(package)
165     if res:
166     GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world")
167    
168 agaffney 1185 def get_best_version_vdb(self, package):
169     return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip()
170 agaffney 1189
171 agaffney 1194 def get_best_version_vdb_chroot(self, package):
172 agaffney 1195 return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip()
173 agaffney 1194
174 agaffney 1184 # def get_best_version_tree(self, package):
175     # return portage.best(tree.match(package))
176 agaffney 1205
177     def emerge(self, packages, add_to_world=True):
178     if isinstance(packages, str):
179     packages = packages.split()
180 agaffney 1223 self._cc.addNotification("progress", (0, "Calculating dependencies for " + " ".join(packages)))
181 agaffney 1205 pkglist = self.get_deps(packages)
182     if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist))
183     for i, pkg in enumerate(pkglist):
184     if self._debug: self._logger.log("install_packages(): processing package " + pkg)
185 agaffney 1208 self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
186     if not self._grp_install or not self.get_best_version_vdb("=" + pkg):
187 agaffney 1205 status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True)
188     # status = self._emerge("=" + pkg)
189     if not GLIUtility.exitsuccess(status):
190     raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
191     else:
192     # try:
193     self.copy_pkg_to_chroot(pkg)
194     # except:
195     # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
196 agaffney 1208 self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
197 agaffney 1205 if add_to_world:
198     for package in packages:
199     self.add_pkg_to_world(package)

Properties

Name Value
svn:eol-style native

  ViewVC Help
Powered by ViewVC 1.1.20