|
|
|
@ -234,7 +234,8 @@ class Job(object): |
|
|
|
|
class Jobset(object): |
|
|
|
|
"""Manages one run of jobs.""" |
|
|
|
|
|
|
|
|
|
def __init__(self, check_cancelled, maxjobs, newline_on_success, travis, cache): |
|
|
|
|
def __init__(self, check_cancelled, maxjobs, newline_on_success, travis, |
|
|
|
|
stop_on_failure, cache): |
|
|
|
|
self._running = set() |
|
|
|
|
self._check_cancelled = check_cancelled |
|
|
|
|
self._cancelled = False |
|
|
|
@ -244,6 +245,7 @@ class Jobset(object): |
|
|
|
|
self._newline_on_success = newline_on_success |
|
|
|
|
self._travis = travis |
|
|
|
|
self._cache = cache |
|
|
|
|
self._stop_on_failure = stop_on_failure |
|
|
|
|
|
|
|
|
|
def start(self, spec): |
|
|
|
|
"""Start a job. Return True on success, False on failure.""" |
|
|
|
@ -280,8 +282,12 @@ class Jobset(object): |
|
|
|
|
for job in self._running: |
|
|
|
|
st = job.state(self._cache) |
|
|
|
|
if st == _RUNNING: continue |
|
|
|
|
if st == _FAILURE: self._failures += 1 |
|
|
|
|
if st == _KILLED: self._failures += 1 |
|
|
|
|
if st == _FAILURE or st == _KILLED: |
|
|
|
|
self._failures += 1 |
|
|
|
|
if self._stop_on_failure: |
|
|
|
|
self._cancelled = True |
|
|
|
|
for job in self._running: |
|
|
|
|
job.kill() |
|
|
|
|
dead.add(job) |
|
|
|
|
for job in dead: |
|
|
|
|
self._completed += 1 |
|
|
|
@ -333,10 +339,11 @@ def run(cmdlines, |
|
|
|
|
maxjobs=None, |
|
|
|
|
newline_on_success=False, |
|
|
|
|
travis=False, |
|
|
|
|
stop_on_failure=False, |
|
|
|
|
cache=None): |
|
|
|
|
js = Jobset(check_cancelled, |
|
|
|
|
maxjobs if maxjobs is not None else _DEFAULT_MAX_JOBS, |
|
|
|
|
newline_on_success, travis, |
|
|
|
|
newline_on_success, travis, stop_on_failure, |
|
|
|
|
cache if cache is not None else NoCache()) |
|
|
|
|
if not travis: |
|
|
|
|
cmdlines = shuffle_iteratable(cmdlines) |
|
|
|
|