1d0825bca7fe65beaee391d30da42e937db621564Steve Block# Copyright (C) 2010 Google Inc. All rights reserved.
2d0825bca7fe65beaee391d30da42e937db621564Steve Block#
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# Redistribution and use in source and binary forms, with or without
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# modification, are permitted provided that the following conditions are
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# met:
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#     * Redistributions of source code must retain the above copyright
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# notice, this list of conditions and the following disclaimer.
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#     * Redistributions in binary form must reproduce the above
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# copyright notice, this list of conditions and the following disclaimer
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# in the documentation and/or other materials provided with the
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# distribution.
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#     * Neither the name of Google Inc. nor the names of its
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# contributors may be used to endorse or promote products derived from
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# this software without specific prior written permission.
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
29d0825bca7fe65beaee391d30da42e937db621564Steve Blockimport os
30d0825bca7fe65beaee391d30da42e937db621564Steve Block
31545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochfrom webkitpy.common.checkout.changelog import ChangeLog
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.common.system.executive import ScriptError
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.tool.steps.abstractstep import AbstractStep
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.tool.steps.options import Options
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.common.system.deprecated_logging import error
36d0825bca7fe65beaee391d30da42e937db621564Steve Block
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
38d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass PrepareChangeLog(AbstractStep):
39d0825bca7fe65beaee391d30da42e937db621564Steve Block    @classmethod
40d0825bca7fe65beaee391d30da42e937db621564Steve Block    def options(cls):
4121939df44de1705786c545cd1bf519d47250322dBen Murdoch        return AbstractStep.options() + [
42d0825bca7fe65beaee391d30da42e937db621564Steve Block            Options.quiet,
43d0825bca7fe65beaee391d30da42e937db621564Steve Block            Options.email,
4421939df44de1705786c545cd1bf519d47250322dBen Murdoch            Options.git_commit,
45d0825bca7fe65beaee391d30da42e937db621564Steve Block        ]
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    def _ensure_bug_url(self, state):
48545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if not state.get("bug_id"):
49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        bug_id = state.get("bug_id")
51545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        changelogs = self.cached_lookup(state, "changelogs")
52545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        for changelog_path in changelogs:
53545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            changelog = ChangeLog(changelog_path)
54545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if not changelog.latest_entry().bug_id():
55545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                changelog.set_short_description_and_bug_url(
56545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    self.cached_lookup(state, "bug_title"),
57545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    self._tool.bugs.bug_url_for_bug_id(bug_id))
58545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
59d0825bca7fe65beaee391d30da42e937db621564Steve Block    def run(self, state):
60d0825bca7fe65beaee391d30da42e937db621564Steve Block        if self.cached_lookup(state, "changelogs"):
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            self._ensure_bug_url(state)
62d0825bca7fe65beaee391d30da42e937db621564Steve Block            return
63d0825bca7fe65beaee391d30da42e937db621564Steve Block        os.chdir(self._tool.scm().checkout_root)
642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        args = self._tool.port().prepare_changelog_command()
6506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if state.get("bug_id"):
66d0825bca7fe65beaee391d30da42e937db621564Steve Block            args.append("--bug=%s" % state["bug_id"])
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            args.append("--description=%s" % self._tool.bugs.fetch_bug(state["bug_id"]).title())
68d0825bca7fe65beaee391d30da42e937db621564Steve Block        if self._options.email:
69d0825bca7fe65beaee391d30da42e937db621564Steve Block            args.append("--email=%s" % self._options.email)
70e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
71e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if self._tool.scm().supports_local_commits():
72e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            args.append("--merge-base=%s" % self._tool.scm().merge_base(self._options.git_commit))
7321939df44de1705786c545cd1bf519d47250322dBen Murdoch
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        args.extend(self._changed_files(state))
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76d0825bca7fe65beaee391d30da42e937db621564Steve Block        try:
77d0825bca7fe65beaee391d30da42e937db621564Steve Block            self._tool.executive.run_and_throw_if_fail(args, self._options.quiet)
78d0825bca7fe65beaee391d30da42e937db621564Steve Block        except ScriptError, e:
79d0825bca7fe65beaee391d30da42e937db621564Steve Block            error("Unable to prepare ChangeLogs.")
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        self.did_modify_checkout(state)
81