Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r10898 - main/trunk/pym/_emerge
Date: Thu, 03 Jul 2008 03:39:15
Message-Id: E1KEFf2-00024t-7C@stork.gentoo.org
1 Author: zmedico
2 Date: 2008-07-03 03:39:06 +0000 (Thu, 03 Jul 2008)
3 New Revision: 10898
4
5 Modified:
6 main/trunk/pym/_emerge/__init__.py
7 Log:
8 Split out a SpawnProcess base class out of EbuildFetcherAsync.
9
10
11 Modified: main/trunk/pym/_emerge/__init__.py
12 ===================================================================
13 --- main/trunk/pym/_emerge/__init__.py 2008-07-03 03:09:21 UTC (rev 10897)
14 +++ main/trunk/pym/_emerge/__init__.py 2008-07-03 03:39:06 UTC (rev 10898)
15 @@ -1495,13 +1495,22 @@
16
17 self.returncode = retval
18
19 -class EbuildFetcherAsync(SubProcess):
20 +class SpawnProcess(SubProcess):
21
22 - __slots__ = ("log_file", "fd_pipes", "pkg",
23 - "register", "unregister",
24 - "files")
25 + """
26 + Constructor keyword args are passed into portage.process.spawn().
27 + The required "args" keyword argument will be passed as the first
28 + spawn() argument.
29 + """
30
31 - _file_names = ("fetcher", "out")
32 + _spawn_kwarg_names = ("env", "opt_name", "fd_pipes",
33 + "uid", "gid", "groups", "umask", "logfile",
34 + "path_lookup", "pre_exec")
35 +
36 + __slots__ = ("args", "files", "register", "unregister", "registered") + \
37 + _spawn_kwarg_names
38 +
39 + _file_names = ("process", "out")
40 _files_dict = slot_dict_class(_file_names, prefix="")
41 _bufsize = 4096
42
43 @@ -1519,27 +1528,26 @@
44 2 : sys.stderr.fileno(),
45 }
46
47 - log_file = self.log_file
48 + logfile = self.logfile
49 self.files = self._files_dict()
50 files = self.files
51
52 - if log_file is not None:
53 - files.out = open(log_file, "a")
54 - portage.util.apply_secpass_permissions(log_file,
55 + if logfile is not None:
56 + files.out = open(logfile, "a")
57 + portage.util.apply_secpass_permissions(logfile,
58 uid=portage.portage_uid, gid=portage.portage_gid,
59 mode=0660)
60 else:
61 + fd_pipes.setdefault(1, sys.stdout.fileno())
62 for fd in fd_pipes.itervalues():
63 if fd == sys.stdout.fileno():
64 sys.stdout.flush()
65 if fd == sys.stderr.fileno():
66 sys.stderr.flush()
67 -
68 files.out = os.fdopen(os.dup(fd_pipes[1]), 'w')
69
70 master_fd, slave_fd = os.pipe()
71
72 - import fcntl
73 fcntl.fcntl(master_fd, fcntl.F_SETFL,
74 fcntl.fcntl(master_fd, fcntl.F_GETFL) | os.O_NONBLOCK)
75
76 @@ -1549,49 +1557,71 @@
77 fd_pipes[1] = slave_fd
78 fd_pipes[2] = slave_fd
79
80 - root_config = self.pkg.root_config
81 - portdb = root_config.trees["porttree"].dbapi
82 - ebuild_path = portdb.findname(self.pkg.cpv)
83 - settings = root_config.settings
84 + kwargs = {}
85 + for k in self._spawn_kwarg_names:
86 + v = getattr(self, k)
87 + if v is not None:
88 + kwargs[k] = v
89
90 - fetch_env = dict((k, settings[k]) for k in settings)
91 - fetch_env["FEATURES"] = fetch_env.get("FEATURES", "") + " -cvs"
92 - fetch_env["PORTAGE_NICENESS"] = "0"
93 - fetch_env["PORTAGE_PARALLEL_FETCHONLY"] = "1"
94 + kwargs["fd_pipes"] = fd_pipes
95 + kwargs["returnpid"] = True
96 + del kwargs["logfile"]
97
98 - ebuild_binary = os.path.join(
99 - settings["EBUILD_BIN_PATH"], "ebuild")
100 + retval = portage.process.spawn(self.args, **kwargs)
101
102 - fetch_args = [ebuild_binary, ebuild_path, "fetch"]
103 - debug = settings.get("PORTAGE_DEBUG") == "1"
104 - if debug:
105 - fetch_args.append("--debug")
106 -
107 - retval = portage.process.spawn(fetch_args, env=fetch_env,
108 - fd_pipes=fd_pipes, returnpid=True)
109 -
110 self.pid = retval[0]
111
112 os.close(slave_fd)
113 - files.fetcher = os.fdopen(master_fd, 'r')
114 - self.register(files.fetcher.fileno(),
115 + files.process = os.fdopen(master_fd, 'r')
116 + self.registered = True
117 + self.register(files.process.fileno(),
118 select.POLLIN, self._output_handler)
119
120 def _output_handler(self, fd, event):
121 files = self.files
122 buf = array.array('B')
123 try:
124 - buf.fromfile(files.fetcher, self._bufsize)
125 + buf.fromfile(files.process, self._bufsize)
126 except EOFError:
127 pass
128 if buf:
129 buf.tofile(files.out)
130 files.out.flush()
131 else:
132 - self.unregister(files.fetcher.fileno())
133 + fd = files.process.fileno()
134 for f in files.values():
135 + f.flush()
136 f.close()
137 + self.registered = False
138 + self.unregister(fd)
139
140 +class EbuildFetcherAsync(SpawnProcess):
141 +
142 + __slots__ = ("pkg",)
143 +
144 + def start(self):
145 +
146 + root_config = self.pkg.root_config
147 + portdb = root_config.trees["porttree"].dbapi
148 + ebuild_path = portdb.findname(self.pkg.cpv)
149 + settings = root_config.settings
150 +
151 + fetch_env = settings.environ()
152 + fetch_env["PORTAGE_NICENESS"] = "0"
153 + fetch_env["PORTAGE_PARALLEL_FETCHONLY"] = "1"
154 +
155 + ebuild_binary = os.path.join(
156 + settings["EBUILD_BIN_PATH"], "ebuild")
157 +
158 + fetch_args = [ebuild_binary, ebuild_path, "fetch"]
159 + debug = settings.get("PORTAGE_DEBUG") == "1"
160 + if debug:
161 + fetch_args.append("--debug")
162 +
163 + self.args = fetch_args
164 + self.env = fetch_env
165 + SpawnProcess.start(self)
166 +
167 class EbuildBuildDir(SlotObject):
168
169 __slots__ = ("dir_path", "pkg", "settings",
170 @@ -1848,7 +1878,7 @@
171
172 __slots__ = ("fd_pipes", "phase", "pkg",
173 "register", "settings", "unregister",
174 - "files")
175 + "files", "registered")
176
177 _file_names = ("log", "stdout", "ebuild")
178 _files_dict = slot_dict_class(_file_names, prefix="")
179 @@ -1929,6 +1959,7 @@
180 files.log = open(logfile, 'a')
181 files.stdout = os.fdopen(os.dup(fd_pipes_orig[1]), 'w')
182 files.ebuild = os.fdopen(master_fd, 'r')
183 + self.registered = True
184 self.register(files.ebuild.fileno(),
185 select.POLLIN, self._output_handler)
186
187 @@ -1945,9 +1976,11 @@
188 buf.tofile(files.log)
189 files.log.flush()
190 else:
191 - self.unregister(files.ebuild.fileno())
192 + fd = files.ebuild.fileno()
193 for f in files.values():
194 f.close()
195 + self.registered = False
196 + self.unregister(fd)
197
198 def _set_returncode(self, wait_retval):
199 SubProcess._set_returncode(self, wait_retval)
200 @@ -2309,6 +2342,7 @@
201
202 os.close(slave_fd)
203 files.fetcher = os.fdopen(master_fd, 'r')
204 + self.registered = True
205 self.register(files.fetcher.fileno(),
206 select.POLLIN, self._output_handler)
207
208 @@ -2323,11 +2357,13 @@
209 buf.tofile(files.out)
210 files.out.flush()
211 else:
212 - self.unregister(files.fetcher.fileno())
213 + fd = files.fetcher.fileno()
214 for f in files.values():
215 f.close()
216 if self.locked:
217 self.unlock()
218 + self.registered = False
219 + self.unregister(fd)
220
221 def lock(self):
222 """
223 @@ -7146,7 +7182,7 @@
224 state_changed = False
225
226 for task in list(running_tasks):
227 - if task.poll() is not None:
228 + if not task.registered and task.poll() is not None:
229 running_tasks.remove(task)
230 state_changed = True
231
232 @@ -7196,7 +7232,7 @@
233 continue
234 if pkg.type_name == "ebuild":
235 self._add_task(EbuildFetcherAsync(
236 - log_file=self._fetch_log,
237 + logfile=self._fetch_log,
238 pkg=pkg, register=self._register,
239 unregister=self._unregister))
240 elif pkg.type_name == "binary" and getbinpkg and \
241
242 --
243 gentoo-commits@l.g.o mailing list