Merge lp:~cr3/checkbox/whitelist_ordering_with_job_cache into lp:~sylvain-pineau/checkbox/whitelist_ordering_with_job_cache

Proposed by Marc Tardif
Status: Merged
Approved by: Sylvain Pineau
Approved revision: 1247
Merge reported by: Sylvain Pineau
Merged at revision: not available
Proposed branch: lp:~cr3/checkbox/whitelist_ordering_with_job_cache
Merge into: lp:~sylvain-pineau/checkbox/whitelist_ordering_with_job_cache
Diff against target: 233 lines (+31/-93)
5 files modified
checkbox/job.py (+0/-71)
checkbox/user_interface.py (+2/-2)
plugins/jobs_info.py (+29/-8)
plugins/jobs_prompt.py (+0/-9)
plugins/suites_prompt.py (+0/-3)
To merge this branch: bzr merge lp:~cr3/checkbox/whitelist_ordering_with_job_cache
Reviewer Review Type Date Requested Status
Sylvain Pineau Approve
Review via email: mp+93242@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Sylvain Pineau (sylvain-pineau) wrote :

As simple as a call to cmp. thanks

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'checkbox/job.py'
2--- checkbox/job.py 2012-02-14 20:32:39 +0000
3+++ checkbox/job.py 2012-02-15 16:55:31 +0000
4@@ -17,7 +17,6 @@
5 # along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
6 #
7 import os
8-import re
9 import logging
10
11 from gettext import gettext as _
12@@ -105,58 +104,6 @@
13 class JobStore(MessageStore):
14 """A job store which stores its jobs in a file system hierarchy."""
15
16- msg = {} # msg stored in a the /store filesystem
17- depends = {} # jobs dependencies
18-
19- def whitelist_ordering(self, whitelist_patterns):
20- """
21- Sort the Message file objects by whitelist patterns
22- """
23-
24- logging.debug("Whitelist ordering in progress")
25- jobs = [] # ordered jobs
26-
27- for filename in self._walk_messages():
28- message = self._read_message(filename, cache=True)
29- name = message.get("name")
30- os.rename(filename, filename + ".tmp")
31- self.msg[name] = filename
32- self.depends[name] = message.get("depends")
33-
34- for p in whitelist_patterns:
35- job = next((n for n in self.msg.iterkeys() if p.match(n)), None)
36- if job:
37- jobs.append(job)
38-
39- jobs_orig = list(jobs)
40-
41- # Overrides the whitelist order and puts the requirements
42- # ahead of the dependent job
43- for name in [n for n in jobs if self.depends[n]]:
44- alldeps = self._get_dependencies([name])
45- missingdeps = set()
46- for dep in alldeps:
47- if dep not in jobs:
48- logging.warning('"%s" dependency not found' % dep)
49- missingdeps.add(dep)
50- continue
51- # Dependencies must be run in whitelist order
52- for dep in sorted(alldeps-missingdeps, key=jobs_orig.index):
53- limit = jobs.index(name)
54- dep_index = jobs.index(dep)
55- if dep_index > limit:
56- jobs.insert(limit, jobs.pop(dep_index))
57-
58- for i, name in enumerate(jobs):
59- try:
60- os.rename(self.msg[name] + ".tmp",
61- re.sub(r'\d+$', str(i), self.msg[name]))
62- except:
63- logging.warning(
64- 'Unable to process "%s", possible duplicated values' % name)
65-
66- logging.debug("Whitelist ordering completed")
67-
68 def add(self, job):
69 # TODO: Order alphabetically within suite or non-suite
70
71@@ -191,21 +138,3 @@
72 break
73 else:
74 yield filename
75-
76- def _get_dependencies(self, jobs):
77- """
78- Get all dependencies including ancestors
79- """
80-
81- dependencies = set()
82-
83- for name in jobs:
84- if name in self.msg:
85- msg = self.msg[name]
86- depends = self.depends[name]
87- if depends:
88- dependencies.update(
89- set(depends),
90- self._get_dependencies(depends))
91-
92- return dependencies
93
94=== modified file 'checkbox/user_interface.py'
95--- checkbox/user_interface.py 2012-02-13 01:44:19 +0000
96+++ checkbox/user_interface.py 2012-02-15 16:55:31 +0000
97@@ -27,8 +27,6 @@
98 import gettext
99 from gettext import gettext as _
100
101-from gi.repository import Gio
102-
103 from checkbox.contrib.REThread import REThread
104
105 from checkbox.lib.environ import add_variable, get_variable, remove_variable
106@@ -180,6 +178,8 @@
107 if os.getenv("DISPLAY") and \
108 subprocess.call(["pgrep", "-x", "-u", str(uid), "gnome-panel|gconfd-2"],
109 stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0:
110+ from gi.repository import Gio
111+
112 preferred_xml_app = Gio.app_info_get_default_for_type("application/xml",False)
113 if preferred_xml_app:
114 preferred_browser = preferred_xml_app.get_executable()
115
116=== modified file 'plugins/jobs_info.py'
117--- plugins/jobs_info.py 2012-02-14 20:32:39 +0000
118+++ plugins/jobs_info.py 2012-02-15 16:55:31 +0000
119@@ -54,16 +54,16 @@
120
121 # Space separated list of directories where job files are stored.
122 directories = List(Path(),
123- default_factory=lambda:"%(checkbox_share)s/jobs")
124+ default_factory=lambda: "%(checkbox_share)s/jobs")
125
126 # List of jobs to blacklist
127- blacklist = List(String(), default_factory=lambda:"")
128+ blacklist = List(String(), default_factory=lambda: "")
129
130 # Path to blacklist file
131 blacklist_file = Path(required=False)
132
133 # List of jobs to whitelist
134- whitelist = List(String(), default_factory=lambda:"")
135+ whitelist = List(String(), default_factory=lambda: "")
136
137 # Path to whitelist file
138 whitelist_file = Path(required=False)
139@@ -82,8 +82,8 @@
140 try:
141 file = open(filename)
142 except IOError, e:
143- error_message=(gettext.gettext("Failed to open file '%s': %s") %
144- (filename,e.strerror))
145+ error_message=(gettext.gettext("Failed to open file '%s': %s") %
146+ (filename, e.strerror))
147 logging.critical(error_message)
148 sys.stderr.write("%s\n" % error_message)
149 sys.exit(os.EX_NOINPUT)
150@@ -95,11 +95,15 @@
151
152 def gather(self):
153 # Register temporary handler for report-message events
154+ messages = []
155+
156 def report_message(message):
157- self._manager.reactor.fire("report-job", message)
158+ if self.whitelist_patterns:
159+ name = message["name"]
160+ if not [name for p in self.whitelist_patterns if p.match(name)]:
161+ return
162
163- # Send whitelist info to jobs-prompt for job ordering
164- self._manager.reactor.fire("whitelist", self.whitelist_patterns)
165+ messages.append(message)
166
167 # Set domain and message event handler
168 old_domain = gettext.textdomain()
169@@ -109,6 +113,23 @@
170 for directory in self.directories:
171 self._manager.reactor.fire("message-directory", directory)
172
173+ # Apply whitelist ordering
174+ def cmp_function(a, b):
175+ a_name = a["name"]
176+ b_name = b["name"]
177+ for pattern in self.whitelist_patterns:
178+ if pattern.match(a_name):
179+ a_index = self.whitelist_patterns.index(pattern)
180+ elif pattern.match(b_name):
181+ b_index = self.whitelist_patterns.index(pattern)
182+
183+ return cmp(a_index, b_index)
184+
185+ if self.whitelist_patterns:
186+ messages = sorted(messages, cmp=cmp_function)
187+ for message in messages:
188+ self._manager.reactor.fire("report-job", message)
189+
190 # Unset domain and event handler
191 self._manager.reactor.cancel_call(event_id)
192 gettext.textdomain(old_domain)
193
194=== modified file 'plugins/jobs_prompt.py'
195--- plugins/jobs_prompt.py 2012-02-14 20:32:39 +0000
196+++ plugins/jobs_prompt.py 2012-02-15 16:55:31 +0000
197@@ -61,8 +61,6 @@
198 ("prompt-job", self.prompt_job),
199 ("prompt-jobs", self.prompt_jobs),
200 ("prompt-finish", self.prompt_finish),
201- ("jobs-ordering", self.jobs_ordering),
202- ("whitelist", self.report_whitelist),
203 ("report", self.report),
204 ("report-job", self.report_job)]:
205 self._manager.reactor.call_on(rt, rh)
206@@ -125,13 +123,6 @@
207 if interface.direction == NEXT:
208 self.store.delete_all_messages()
209
210- def jobs_ordering(self):
211- if self.whitelist_patterns:
212- self.store.whitelist_ordering(self.whitelist_patterns)
213-
214- def report_whitelist(self, whitelist):
215- self.whitelist_patterns = whitelist
216-
217 def report(self):
218 self.store.set_pending_offset(0)
219 messages = self.store.get_pending_messages()
220
221=== modified file 'plugins/suites_prompt.py'
222--- plugins/suites_prompt.py 2012-02-14 20:32:39 +0000
223+++ plugins/suites_prompt.py 2012-02-15 16:55:31 +0000
224@@ -84,9 +84,6 @@
225 self._statuses[job["name"]] = job["status"]
226
227 def prompt_gather(self, interface):
228- # Whitelist ordering
229- self._manager.reactor.fire("jobs-ordering")
230-
231 # Resolve dependencies
232 resolver = Resolver()
233 for key in self._jobs.iterkeys():

Subscribers

People subscribed via source and target branches

to all changes: