2013-03-06 21:58:40 +04:00
|
|
|
# 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/.
|
|
|
|
|
2015-06-22 03:39:09 +03:00
|
|
|
from __future__ import absolute_import, unicode_literals
|
2013-03-06 21:58:40 +04:00
|
|
|
|
2013-12-06 07:35:52 +04:00
|
|
|
import sys
|
|
|
|
|
2013-03-06 21:58:40 +04:00
|
|
|
from mach.decorators import (
|
|
|
|
CommandArgument,
|
|
|
|
CommandProvider,
|
|
|
|
Command,
|
2019-04-10 19:26:44 +03:00
|
|
|
SubCommand,
|
2013-03-06 21:58:40 +04:00
|
|
|
)
|
|
|
|
|
2015-09-05 19:27:23 +03:00
|
|
|
from mozbuild.base import MachCommandBase, MozbuildObject
|
2013-12-06 07:35:52 +04:00
|
|
|
|
2013-03-06 21:58:40 +04:00
|
|
|
|
2019-04-10 19:26:44 +03:00
|
|
|
@CommandProvider
|
|
|
|
class BustedProvider(object):
|
|
|
|
@Command('busted', category='misc',
|
|
|
|
description='Query known bugs in our tooling, and file new ones.')
|
|
|
|
def busted_default(self):
|
|
|
|
import requests
|
|
|
|
payload = {'include_fields': 'id,summary,last_change_time',
|
|
|
|
'blocks': 1543241,
|
|
|
|
'resolution': '---'}
|
|
|
|
response = requests.get('https://bugzilla.mozilla.org/rest/bug', payload)
|
|
|
|
response.raise_for_status()
|
|
|
|
json_response = response.json()
|
|
|
|
if 'bugs' in json_response and len(json_response['bugs']) > 0:
|
|
|
|
# Display most recently modifed bugs first.
|
|
|
|
bugs = sorted(json_response['bugs'], key=lambda item: item['last_change_time'],
|
|
|
|
reverse=True)
|
|
|
|
for bug in bugs:
|
|
|
|
print("Bug %s - %s" % (bug['id'], bug['summary']))
|
|
|
|
else:
|
|
|
|
print("No known tooling issues found.")
|
|
|
|
|
|
|
|
@SubCommand('busted',
|
|
|
|
'file',
|
|
|
|
description='File a bug for busted tooling.')
|
|
|
|
def busted_file(self):
|
|
|
|
import webbrowser
|
|
|
|
uri = ('https://bugzilla.mozilla.org/enter_bug.cgi?'
|
|
|
|
'product=Firefox%20Build%20System&component=General&blocked=1543241')
|
|
|
|
webbrowser.open_new_tab(uri)
|
|
|
|
|
|
|
|
|
2013-03-06 21:58:40 +04:00
|
|
|
@CommandProvider
|
|
|
|
class SearchProvider(object):
|
2019-04-10 19:26:42 +03:00
|
|
|
@Command('searchfox', category='misc',
|
|
|
|
description='Search for something in Searchfox.')
|
|
|
|
@CommandArgument('term', nargs='+', help='Term(s) to search for.')
|
|
|
|
def searchfox(self, term):
|
|
|
|
import webbrowser
|
|
|
|
term = ' '.join(term)
|
|
|
|
uri = 'https://searchfox.org/mozilla-central/search?q=%s' % term
|
|
|
|
webbrowser.open_new_tab(uri)
|
2013-05-09 04:56:30 +04:00
|
|
|
@Command('dxr', category='misc',
|
2017-01-06 17:52:07 +03:00
|
|
|
description='Search for something in DXR.')
|
2013-03-07 00:23:21 +04:00
|
|
|
@CommandArgument('term', nargs='+', help='Term(s) to search for.')
|
|
|
|
def dxr(self, term):
|
|
|
|
import webbrowser
|
|
|
|
term = ' '.join(term)
|
2014-05-14 19:26:17 +04:00
|
|
|
uri = 'http://dxr.mozilla.org/mozilla-central/search?q=%s&redirect=true' % term
|
2013-03-07 00:23:21 +04:00
|
|
|
webbrowser.open_new_tab(uri)
|
|
|
|
|
2013-05-09 04:56:30 +04:00
|
|
|
@Command('mdn', category='misc',
|
2017-01-06 17:52:07 +03:00
|
|
|
description='Search for something on MDN.')
|
2013-03-06 21:58:40 +04:00
|
|
|
@CommandArgument('term', nargs='+', help='Term(s) to search for.')
|
|
|
|
def mdn(self, term):
|
|
|
|
import webbrowser
|
|
|
|
term = ' '.join(term)
|
|
|
|
uri = 'https://developer.mozilla.org/search?q=%s' % term
|
|
|
|
webbrowser.open_new_tab(uri)
|
|
|
|
|
2013-05-09 04:56:30 +04:00
|
|
|
@Command('google', category='misc',
|
2017-01-06 17:52:07 +03:00
|
|
|
description='Search for something on Google.')
|
2013-03-06 21:58:40 +04:00
|
|
|
@CommandArgument('term', nargs='+', help='Term(s) to search for.')
|
|
|
|
def google(self, term):
|
|
|
|
import webbrowser
|
|
|
|
term = ' '.join(term)
|
|
|
|
uri = 'https://www.google.com/search?q=%s' % term
|
|
|
|
webbrowser.open_new_tab(uri)
|
|
|
|
|
2013-05-09 04:56:30 +04:00
|
|
|
@Command('search', category='misc',
|
2017-01-06 17:52:07 +03:00
|
|
|
description='Search for something on the Internets. '
|
2019-04-10 19:26:42 +03:00
|
|
|
'This will open 4 new browser tabs and search for the term on Google, '
|
|
|
|
'MDN, DXR, and Searchfox.')
|
2013-03-06 21:58:40 +04:00
|
|
|
@CommandArgument('term', nargs='+', help='Term(s) to search for.')
|
|
|
|
def search(self, term):
|
|
|
|
self.google(term)
|
|
|
|
self.mdn(term)
|
2016-07-08 11:31:30 +03:00
|
|
|
self.dxr(term)
|
2019-04-10 19:26:42 +03:00
|
|
|
self.searchfox(term)
|
2013-03-06 21:58:40 +04:00
|
|
|
|
2013-07-15 21:00:09 +04:00
|
|
|
|
|
|
|
@CommandProvider
|
|
|
|
class UUIDProvider(object):
|
|
|
|
@Command('uuid', category='misc',
|
2017-01-06 17:52:07 +03:00
|
|
|
description='Generate a uuid.')
|
2013-10-02 12:06:39 +04:00
|
|
|
@CommandArgument('--format', '-f', choices=['idl', 'cpp', 'c++'],
|
2013-07-15 21:00:09 +04:00
|
|
|
help='Output format for the generated uuid.')
|
2013-10-02 12:06:39 +04:00
|
|
|
def uuid(self, format=None):
|
2013-07-15 21:00:09 +04:00
|
|
|
import uuid
|
|
|
|
u = uuid.uuid4()
|
2013-10-02 12:06:39 +04:00
|
|
|
if format in [None, 'idl']:
|
2013-07-15 21:00:09 +04:00
|
|
|
print(u)
|
2013-10-02 12:06:39 +04:00
|
|
|
if format is None:
|
|
|
|
print('')
|
|
|
|
if format in [None, 'cpp', 'c++']:
|
2013-07-15 21:00:09 +04:00
|
|
|
u = u.hex
|
|
|
|
print('{ 0x%s, 0x%s, 0x%s, \\' % (u[0:8], u[8:12], u[12:16]))
|
|
|
|
pairs = tuple(map(lambda n: u[n:n+2], range(16, 32, 2)))
|
|
|
|
print((' { ' + '0x%s, ' * 7 + '0x%s } }') % pairs)
|
2013-07-30 03:57:28 +04:00
|
|
|
|
2013-10-16 21:13:00 +04:00
|
|
|
|
2019-02-08 22:50:29 +03:00
|
|
|
def REMOVED(cls):
|
|
|
|
"""Command no longer exists!
|
|
|
|
|
|
|
|
This functionality is no longer supported in mach.
|
|
|
|
"""
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
2013-10-16 21:13:00 +04:00
|
|
|
@CommandProvider
|
|
|
|
class PastebinProvider(object):
|
2019-02-08 22:50:29 +03:00
|
|
|
@Command('pastebin', category='misc', conditions=[REMOVED])
|
|
|
|
def pastebin(self):
|
|
|
|
pass
|
2013-12-06 07:35:52 +04:00
|
|
|
|
2018-02-08 20:36:21 +03:00
|
|
|
|
2015-09-05 19:27:23 +03:00
|
|
|
def mozregression_import():
|
|
|
|
# Lazy loading of mozregression.
|
|
|
|
# Note that only the mach_interface module should be used from this file.
|
|
|
|
try:
|
|
|
|
import mozregression.mach_interface
|
|
|
|
except ImportError:
|
|
|
|
return None
|
|
|
|
return mozregression.mach_interface
|
|
|
|
|
|
|
|
|
|
|
|
def mozregression_create_parser():
|
|
|
|
# Create the mozregression command line parser.
|
|
|
|
# if mozregression is not installed, or not up to date, it will
|
|
|
|
# first be installed.
|
|
|
|
cmd = MozbuildObject.from_environment()
|
|
|
|
cmd._activate_virtualenv()
|
|
|
|
mozregression = mozregression_import()
|
|
|
|
if not mozregression:
|
|
|
|
# mozregression is not here at all, install it
|
|
|
|
cmd.virtualenv_manager.install_pip_package('mozregression')
|
|
|
|
print("mozregression was installed. please re-run your"
|
2015-10-05 23:08:35 +03:00
|
|
|
" command. If you keep getting this message please "
|
|
|
|
" manually run: 'pip install -U mozregression'.")
|
2015-09-05 19:27:23 +03:00
|
|
|
else:
|
|
|
|
# check if there is a new release available
|
|
|
|
release = mozregression.new_release_on_pypi()
|
|
|
|
if release:
|
|
|
|
print(release)
|
|
|
|
# there is one, so install it. Note that install_pip_package
|
|
|
|
# does not work here, so just run pip directly.
|
|
|
|
cmd.virtualenv_manager._run_pip([
|
|
|
|
'install',
|
|
|
|
'mozregression==%s' % release
|
|
|
|
])
|
|
|
|
print("mozregression was updated to version %s. please"
|
|
|
|
" re-run your command." % release)
|
|
|
|
else:
|
|
|
|
# mozregression is up to date, return the parser.
|
|
|
|
return mozregression.parser()
|
|
|
|
# exit if we updated or installed mozregression because
|
|
|
|
# we may have already imported mozregression and running it
|
|
|
|
# as this may cause issues.
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
|
|
|
@CommandProvider
|
|
|
|
class MozregressionCommand(MachCommandBase):
|
|
|
|
@Command('mozregression',
|
|
|
|
category='misc',
|
|
|
|
description=("Regression range finder for nightly"
|
|
|
|
" and inbound builds."),
|
|
|
|
parser=mozregression_create_parser)
|
|
|
|
def run(self, **options):
|
|
|
|
self._activate_virtualenv()
|
|
|
|
mozregression = mozregression_import()
|
|
|
|
mozregression.run(options)
|