2009-11-27 Adam Barth <abarth@webkit.org>
[WebKit-https.git] / WebKitTools / Scripts / bugzilla-tool
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 # A tool for automating dealing with bugzilla, posting patches, committing patches, etc.
32
33 import os
34
35 from modules.buildsteps import BuildSteps
36 from modules.commands.download import *
37 from modules.commands.queries import *
38 from modules.commands.queues import *
39 from modules.commands.upload import *
40 from modules.logging import log
41
42 class BugzillaTool(MultiCommandTool):
43     def __init__(self):
44         MultiCommandTool.__init__(self)
45         self.global_option_parser.add_option("--dry-run", action="callback", help="do not touch remote servers", callback=self.dry_run_callback)
46
47         self.bugs = Bugzilla()
48         self.buildbot = BuildBot()
49         self._scm = None
50         self._status = None
51         self.steps = BuildSteps()
52
53     def dry_run_callback(self, option, opt, value, parser):
54         self.scm().dryrun = True
55         self.bugs.dryrun = True
56
57     def scm(self):
58         # Lazily initialize SCM to not error-out before command line parsing (or when running non-scm commands).
59         original_cwd = os.path.abspath(".")
60         if not self._scm:
61             self._scm = detect_scm_system(original_cwd)
62
63         if not self._scm:
64             script_directory = os.path.abspath(sys.path[0])
65             webkit_directory = os.path.abspath(os.path.join(script_directory, "../.."))
66             self._scm = detect_scm_system(webkit_directory)
67             if self._scm:
68                 log("The current directory (%s) is not a WebKit checkout, using %s" % (original_cwd, webkit_directory))
69             else:
70                 error("FATAL: Failed to determine the SCM system for either %s or %s" % (original_cwd, webkit_directory))
71
72         return self._scm
73
74     def status(self):
75         if not self._status:
76             self._status = StatusBot()
77         return self._status
78
79     def path(self):
80         return __file__
81
82     def should_show_in_main_help(self, command):
83         if not command.show_in_main_help:
84             return False
85         if command.requires_local_commits:
86             return self.scm().supports_local_commits()
87         return True
88
89     def should_execute_command(self, command):
90         if command.requires_local_commits and not self.scm().supports_local_commits():
91             failure_reason = "%s requires local commits using %s in %s." % (command.name, self.scm().display_name(), self.scm().checkout_root)
92             return (False, failure_reason)
93         return (True, None)
94
95
96 if __name__ == "__main__":
97     BugzillaTool().main()