dbaa15916d98127ff8505e6ebc7b9219ef0c99b1
[WebKit-https.git] / WebKitTools / Scripts / modules / commands / queries.py
1 #!/usr/bin/env python
2 # Copyright (c) 2009, Google Inc. All rights reserved.
3 # Copyright (c) 2009 Apple Inc. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are
7 # met:
8
9 #     * Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 #     * Redistributions in binary form must reproduce the above
12 # copyright notice, this list of conditions and the following disclaimer
13 # in the documentation and/or other materials provided with the
14 # distribution.
15 #     * Neither the name of Google Inc. nor the names of its
16 # contributors may be used to endorse or promote products derived from
17 # this software without specific prior written permission.
18
19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 # FIXME: Trim down this import list once we have unit tests.
32 import os
33 import re
34 import StringIO
35 import subprocess
36 import sys
37 import time
38
39 from datetime import datetime, timedelta
40 from optparse import make_option
41
42 from modules.bugzilla import Bugzilla, parse_bug_id
43 from modules.buildbot import BuildBot
44 from modules.changelogs import ChangeLog
45 from modules.comments import bug_comment_from_commit_text
46 from modules.grammar import pluralize
47 from modules.landingsequence import LandingSequence, ConditionalLandingSequence
48 from modules.logging import error, log, tee
49 from modules.multicommandtool import MultiCommandTool, Command
50 from modules.patchcollection import PatchCollection
51 from modules.scm import CommitMessage, detect_scm_system, ScriptError, CheckoutNeedsUpdate
52 from modules.statusbot import StatusBot
53 from modules.webkitport import WebKitPort
54 from modules.workqueue import WorkQueue, WorkQueueDelegate
55
56 class BugsToCommit(Command):
57     name = "bugs-to-commit"
58     show_in_main_help = False
59     def __init__(self):
60         Command.__init__(self, "List bugs in the commit-queue")
61
62     def execute(self, options, args, tool):
63         bug_ids = tool.bugs.fetch_bug_ids_from_commit_queue()
64         for bug_id in bug_ids:
65             print "%s" % bug_id
66
67
68 class PatchesToCommit(Command):
69     name = "patches-to-commit"
70     show_in_main_help = False
71     def __init__(self):
72         Command.__init__(self, "List patches in the commit-queue")
73
74     def execute(self, options, args, tool):
75         patches = tool.bugs.fetch_patches_from_commit_queue()
76         log("Patches in commit queue:")
77         for patch in patches:
78             print "%s" % patch["url"]
79
80
81 class PatchesToReview(Command):
82     name = "patches-to-review"
83     show_in_main_help = False
84     def __init__(self):
85         Command.__init__(self, "List patches that are pending review")
86
87     def execute(self, options, args, tool):
88         patch_ids = tool.bugs.fetch_attachment_ids_from_review_queue()
89         log("Patches pending review:")
90         for patch_id in patch_ids:
91             print patch_id
92
93
94 class ReviewedPatches(Command):
95     name = "reviewed-patches"
96     show_in_main_help = False
97     def __init__(self):
98         Command.__init__(self, "List r+'d patches on a bug", "BUGID")
99
100     def execute(self, options, args, tool):
101         bug_id = args[0]
102         patches_to_land = tool.bugs.fetch_reviewed_patches_from_bug(bug_id)
103         for patch in patches_to_land:
104             print "%s" % patch["url"]
105
106
107 class TreeStatus(Command):
108     name = "tree-status"
109     show_in_main_help = True
110     def __init__(self):
111         Command.__init__(self, "Print the status of the %s buildbots" % BuildBot.default_host)
112
113     def execute(self, options, args, tool):
114         for builder in tool.buildbot.builder_statuses():
115             status_string = "ok" if builder["is_green"] else "FAIL"
116             print "%s : %s" % (status_string.ljust(4), builder["name"])