Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r10811 - main/trunk/pym/_emerge
Date: Fri, 27 Jun 2008 07:58:23
Message-Id: E1KC8iU-0004xE-TZ@stork.gentoo.org
1 Author: zmedico
2 Date: 2008-06-27 07:49:57 +0000 (Fri, 27 Jun 2008)
3 New Revision: 10811
4
5 Modified:
6 main/trunk/pym/_emerge/__init__.py
7 Log:
8 Bug #12768 - Add a --keep-going option. This uses the same resume_depgraph()
9 function that's called for emerge --resume operations. Given the remaining
10 tasks, depedencies are recalculated and any tasks with unsatisfied
11 dependencies are automatically dropped.
12
13
14 Modified: main/trunk/pym/_emerge/__init__.py
15 ===================================================================
16 --- main/trunk/pym/_emerge/__init__.py 2008-06-27 06:44:29 UTC (rev 10810)
17 +++ main/trunk/pym/_emerge/__init__.py 2008-06-27 07:49:57 UTC (rev 10811)
18 @@ -197,6 +197,7 @@
19 "--fetchonly", "--fetch-all-uri",
20 "--getbinpkg", "--getbinpkgonly",
21 "--help", "--ignore-default-opts",
22 +"--keep-going",
23 "--noconfmem",
24 "--newuse", "--nocolor",
25 "--nodeps", "--noreplace",
26 @@ -5871,11 +5872,16 @@
27 "--fetchonly", "--fetch-all-uri",
28 "--nodeps", "--pretend"])
29
30 - def __init__(self, settings, trees, myopts):
31 + def __init__(self, settings, trees, mtimedb, myopts,
32 + spinner, mergelist, favorites):
33 self.settings = settings
34 self.target_root = settings["ROOT"]
35 self.trees = trees
36 self.myopts = myopts
37 + self._spinner = spinner
38 + self._mtimedb = mtimedb
39 + self._mergelist = mergelist
40 + self._favorites = favorites
41 self.edebug = 0
42 if settings.get("PORTAGE_DEBUG", "") == "1":
43 self.edebug = 1
44 @@ -5924,15 +5930,86 @@
45
46 return blocker_dblinks
47
48 - def merge(self, mylist, favorites, mtimedb):
49 - try:
50 - return self._merge(mylist, favorites, mtimedb)
51 - finally:
52 - if self._spawned_pids:
53 - from portage import process
54 - process.spawned_pids.extend(self._spawned_pids)
55 - self._spawned_pids = []
56 + def merge(self):
57
58 + keep_going = "--keep-going" in self.myopts
59 +
60 + while True:
61 + try:
62 + rval = self._merge()
63 + finally:
64 + spawned_pids = self._spawned_pids
65 + while spawned_pids:
66 + pid = spawned_pids.pop()
67 + try:
68 + if os.waitpid(pid, os.WNOHANG) == (0, 0):
69 + os.kill(pid, signal.SIGTERM)
70 + os.waitpid(pid, 0)
71 + except OSError:
72 + pass # cleaned up elsewhere.
73 +
74 + if rval == os.EX_OK or not keep_going:
75 + break
76 + mtimedb = self._mtimedb
77 + if "resume" not in mtimedb:
78 + break
79 + mergelist = self._mtimedb["resume"].get("mergelist")
80 + if not mergelist:
81 + break
82 + if mergelist[0][-1] != "merge":
83 + break
84 + # Skip the first one because it failed to build or install.
85 + del mergelist[0]
86 + if not mergelist:
87 + break
88 + mylist = self._calc_resume_list()
89 + if not mylist:
90 + break
91 + self.curval += 1
92 + self._mergelist = mylist
93 +
94 + return rval
95 +
96 + def _calc_resume_list(self):
97 + """
98 + Use the current resume list to calculate a new one,
99 + dropping any packages with unsatisfied deps.
100 + """
101 + print colorize("GOOD", "*** Resuming merge...")
102 +
103 + show_spinner = "--quiet" not in self.myopts and \
104 + "--nodeps" not in self.myopts
105 +
106 + if show_spinner:
107 + print "Calculating dependencies ",
108 +
109 + myparams = create_depgraph_params(self.myopts, None)
110 + success, mydepgraph, dropped_tasks = resume_depgraph(
111 + self.settings, self.trees, self._mtimedb, self.myopts,
112 + myparams, self._spinner, skip_unsatisfied=True)
113 +
114 + if show_spinner:
115 + print "\b\b... done!"
116 +
117 + if not success:
118 + mydepgraph.display_problems()
119 + return None
120 +
121 + if dropped_tasks:
122 + portage.writemsg("!!! One or more packages have been " + \
123 + "dropped due to\n" + \
124 + "!!! masking or unsatisfied dependencies:\n\n",
125 + noiselevel=-1)
126 + for task in dropped_tasks:
127 + portage.writemsg(" " + str(task) + "\n", noiselevel=-1)
128 + portage.writemsg("\n", noiselevel=-1)
129 +
130 + mylist = mydepgraph.altlist()
131 + mydepgraph.break_refs(mylist)
132 + del mydepgraph
133 + clear_caches(self.trees)
134 + return mylist
135 +
136 def _poll_child_processes(self):
137 """
138 After each merge, collect status from child processes
139 @@ -5952,7 +6029,10 @@
140 pass
141 spawned_pids.remove(pid)
142
143 - def _merge(self, mylist, favorites, mtimedb):
144 + def _merge(self):
145 + mylist = self._mergelist
146 + favorites = self._favorites
147 + mtimedb = self._mtimedb
148 from portage.elog import elog_process
149 from portage.elog.filtering import filter_mergephases
150 buildpkgonly = "--buildpkgonly" in self.myopts
151 @@ -8805,7 +8885,6 @@
152
153 if ("--resume" in myopts):
154 favorites=mtimedb["resume"]["favorites"]
155 - mergetask = MergeTask(settings, trees, myopts)
156 if "PORTAGE_PARALLEL_FETCHONLY" in settings:
157 """ parallel-fetch uses --resume --fetchonly and we don't want
158 it to write the mtimedb"""
159 @@ -8816,7 +8895,9 @@
160 del mydepgraph
161 clear_caches(trees)
162
163 - retval = mergetask.merge(mymergelist, favorites, mtimedb)
164 + mergetask = MergeTask(settings, trees, mtimedb, myopts,
165 + spinner, mymergelist, favorites)
166 + retval = mergetask.merge()
167 merge_count = mergetask.curval
168 else:
169 if "resume" in mtimedb and \
170 @@ -8860,8 +8941,9 @@
171 del mydepgraph
172 clear_caches(trees)
173
174 - mergetask = MergeTask(settings, trees, myopts)
175 - retval = mergetask.merge(pkglist, favorites, mtimedb)
176 + mergetask = MergeTask(settings, trees, mtimedb, myopts,
177 + spinner, pkglist, favorites)
178 + retval = mergetask.merge()
179 merge_count = mergetask.curval
180
181 if retval == os.EX_OK and not (buildpkgonly or fetchonly or pretend):
182
183 --
184 gentoo-commits@l.g.o mailing list