diff --git a/build/mach_bootstrap.py b/build/mach_bootstrap.py index 3df4c1f9feae..262dd49dbc4a 100644 --- a/build/mach_bootstrap.py +++ b/build/mach_bootstrap.py @@ -47,6 +47,7 @@ MACH_MODULES = [ 'python/mozbuild/mozbuild/backend/mach_commands.py', 'python/mozbuild/mozbuild/compilation/codecomplete.py', 'python/mozbuild/mozbuild/frontend/mach_commands.py', + 'python/mozrelease/mozrelease/mach_commands.py', 'taskcluster/mach_commands.py', 'testing/awsy/mach_commands.py', 'testing/firefox-ui/mach_commands.py', @@ -89,7 +90,7 @@ CATEGORIES = { 'ci': { 'short': 'CI', 'long': 'Taskcluster commands', - 'priority': 59 + 'priority': 59, }, 'devenv': { 'short': 'Development Environment', @@ -106,13 +107,18 @@ CATEGORIES = { 'long': 'Potent potables and assorted snacks.', 'priority': 10, }, + 'release': { + 'short': 'Release automation', + 'long': 'Commands for used in release automation.', + 'priority': 5, + }, 'disabled': { 'short': 'Disabled', 'long': 'The disabled commands are hidden by default. Use -v to display them. ' 'These commands are unavailable for your current context, ' 'run "mach " to see why.', 'priority': 0, - } + }, } diff --git a/python/mozrelease/mozrelease/mach_commands.py b/python/mozrelease/mozrelease/mach_commands.py new file mode 100644 index 000000000000..a19622f91eb4 --- /dev/null +++ b/python/mozrelease/mozrelease/mach_commands.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +from __future__ import absolute_import, print_function, unicode_literals + +import sys +import logging + +from mach.decorators import ( + CommandArgument, + CommandProvider, + Command, + SubCommand, +) + +from mozbuild.base import MachCommandBase +from mozilla_version.gecko import GeckoVersion + + +@CommandProvider +class MachCommands(MachCommandBase): + + @Command('release', category="release", + description="Task that are part of the release process.") + def release(self): + """ + The release subcommands all relate to the release process. + """ + + @SubCommand('release', 'buglist', + description="Generate list of bugs since the last release.") + @CommandArgument('--version', + required=True, + type=GeckoVersion.parse, + help="The version being built.") + @CommandArgument('--product', + required=True, + help="The product being built.") + @CommandArgument('--revision', + required=True, + help="The revision being built.") + def buglist(self, version, product, revision): + self.setup_logging() + from mozrelease.buglist_creator import create_bugs_url + print(create_bugs_url( + product=product, + current_version=version, + current_revision=revision, + )) + + def setup_logging(self, quiet=False, verbose=True): + """ + Set up Python logging for all loggers, sending results to stderr (so + that command output can be redirected easily) and adding the typical + mach timestamp. + """ + # remove the old terminal handler + old = self.log_manager.replace_terminal_handler(None) + + # re-add it, with level and fh set appropriately + if not quiet: + level = logging.DEBUG if verbose else logging.INFO + self.log_manager.add_terminal_logging( + fh=sys.stderr, level=level, + write_interval=old.formatter.write_interval, + write_times=old.formatter.write_times) + + # all of the taskgraph logging is unstructured logging + self.log_manager.enable_unstructured()