1
# Copyright (c) 2010 Google Inc. All rights reserved.
3
# Redistribution and use in source and binary forms, with or without
4
# modification, are permitted provided that the following conditions are
7
# * Redistributions of source code must retain the above copyright
8
# notice, this list of conditions and the following disclaimer.
9
# * Redistributions in binary form must reproduce the above
10
# copyright notice, this list of conditions and the following disclaimer
11
# in the documentation and/or other materials provided with the
13
# * Neither the name of Google Inc. nor the names of its
14
# contributors may be used to endorse or promote products derived from
15
# this software without specific prior written permission.
17
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
from webkitpy.tool.bot.patchanalysistask import PatchAnalysisTask, PatchAnalysisTaskDelegate
32
class CommitQueueTaskDelegate(PatchAnalysisTaskDelegate):
33
def parent_command(self):
36
def did_pass_testing_ews(self, patch):
37
raise NotImplementedError("subclasses must implement")
40
class CommitQueueTask(PatchAnalysisTask):
42
# Bugs might get closed, or patches might be obsoleted or r-'d while the
43
# commit-queue is processing.
44
self._patch = self._delegate.refetch_patch(self._patch)
45
if self._patch.is_obsolete():
47
if self._patch.bug().is_closed():
49
if not self._patch.committer():
51
if self._patch.review() == "-":
55
def _validate_changelog(self):
56
return self._run_command([
61
"ChangeLog validated",
62
"ChangeLog did not pass validation")
64
def _did_pass_tests_recently(self):
65
if self._delegate.did_pass_testing_ews(self._patch):
67
return self._test_patch()
70
if not self.validate():
74
if not self._update():
77
return self.report_failure()
78
if not self._validate_changelog():
79
return self.report_failure()
80
if not self._patch.is_rollout():
82
if not self._build_without_patch():
84
return self.report_failure()
85
if not self._did_pass_tests_recently():
87
# Make sure the patch is still valid before landing (e.g., make sure
88
# no one has set commit-queue- since we started working on the patch.)
89
if not self.validate():
91
# FIXME: We should understand why the land failure occured and retry if possible.
93
return self.report_failure()