Bug 1641134 - [tryselect] Fix Python 3 compatibility issues with |mach try --pernosco|, r=mhentges

Differential Revision: https://phabricator.services.mozilla.com/D77364
This commit is contained in:
Andrew Halberstadt 2020-05-29 20:45:36 +00:00
Родитель 12faf95015
Коммит b2e6e5eb9d
3 изменённых файлов: 52 добавлений и 8 удалений

Просмотреть файл

@ -156,15 +156,22 @@ class TrySelect(MachCommandBase):
def handle_try_config(self, **kwargs): def handle_try_config(self, **kwargs):
from tryselect.util.dicttools import merge from tryselect.util.dicttools import merge
to_validate = []
kwargs.setdefault('try_config', {}) kwargs.setdefault('try_config', {})
for cls in six.itervalues(self.parser.task_configs): for cls in six.itervalues(self.parser.task_configs):
try_config = cls.try_config(**kwargs) try_config = cls.try_config(**kwargs)
if try_config is not None: if try_config is not None:
to_validate.append(cls)
kwargs['try_config'] = merge(kwargs['try_config'], try_config) kwargs['try_config'] = merge(kwargs['try_config'], try_config)
for name in cls.dests: for name in cls.dests:
del kwargs[name] del kwargs[name]
# Validate task_configs after they have all been parsed to avoid
# depending on the order they were processed.
for cls in to_validate:
cls.validate(**kwargs)
return kwargs return kwargs
def run(self, **kwargs): def run(self, **kwargs):

Просмотреть файл

@ -47,6 +47,9 @@ class TryConfig(object):
def try_config(self, **kwargs): def try_config(self, **kwargs):
pass pass
def validate(self, **kwargs):
pass
class Artifact(TryConfig): class Artifact(TryConfig):
@ -112,17 +115,13 @@ class Pernosco(TryConfig):
return return
if pernosco: if pernosco:
if not kwargs['no_artifact'] and (kwargs['artifact'] or Artifact.is_artifact_build()):
print("Pernosco does not support artifact builds at this time. "
"Please try again with '--no-artifact'.")
sys.exit(1)
try: try:
# The Pernosco service currently requires a Mozilla e-mail address to # The Pernosco service currently requires a Mozilla e-mail address to
# log in. Prevent people with non-Mozilla addresses from using this # log in. Prevent people with non-Mozilla addresses from using this
# flag so they don't end up consuming time and resources only to # flag so they don't end up consuming time and resources only to
# realize they can't actually log in and see the reports. # realize they can't actually log in and see the reports.
output = subprocess.check_output(['ssh', '-G', 'hg.mozilla.org']).splitlines() cmd = ['ssh', '-G', 'hg.mozilla.org']
output = subprocess.check_output(cmd, universal_newlines=True).splitlines()
address = [l.rsplit(' ', 1)[-1] for l in output if l.startswith('user')][0] address = [l.rsplit(' ', 1)[-1] for l in output if l.startswith('user')][0]
if not address.endswith('@mozilla.com'): if not address.endswith('@mozilla.com'):
print(dedent("""\ print(dedent("""\
@ -137,7 +136,7 @@ class Pernosco(TryConfig):
print("warning: failed to detect current user for 'hg.mozilla.org'") print("warning: failed to detect current user for 'hg.mozilla.org'")
print("Pernosco requires a Mozilla e-mail address to view its reports.") print("Pernosco requires a Mozilla e-mail address to view its reports.")
while True: while True:
answer = raw_input("Do you have an @mozilla.com address? [Y/n]: ").lower() answer = input("Do you have an @mozilla.com address? [Y/n]: ").lower()
if answer == 'n': if answer == 'n':
sys.exit(1) sys.exit(1)
elif answer == 'y': elif answer == 'y':
@ -149,6 +148,12 @@ class Pernosco(TryConfig):
} }
} }
def validate(self, **kwargs):
if kwargs['try_config'].get('use-artifact-builds'):
print("Pernosco does not support artifact builds at this time. "
"Please try again with '--no-artifact'.")
sys.exit(1)
class Path(TryConfig): class Path(TryConfig):

Просмотреть файл

@ -9,8 +9,10 @@ from argparse import ArgumentParser
import mozunit import mozunit
import pytest import pytest
import subprocess
from textwrap import dedent
from tryselect.task_config import all_task_configs from tryselect.task_config import all_task_configs, Pernosco
# task configs have a list of tests of the form (input, expected) # task configs have a list of tests of the form (input, expected)
@ -34,6 +36,9 @@ TASK_CONFIG_TESTS = {
{'env': {'MOZHARNESS_TEST_PATHS': '{"xpcshell": ["dom/indexedDB", "testing"]}'}}), {'env': {'MOZHARNESS_TEST_PATHS': '{"xpcshell": ["dom/indexedDB", "testing"]}'}}),
(['invalid/path'], SystemExit), (['invalid/path'], SystemExit),
], ],
'pernosco': [
([], None),
],
'rebuild': [ 'rebuild': [
([], None), ([], None),
(['--rebuild', '10'], {'rebuild': 10}), (['--rebuild', '10'], {'rebuild': 10}),
@ -89,5 +94,32 @@ def test_task_configs(config_patch_resolver, task_config, args, expected):
assert cfg.try_config(**vars(args)) == expected assert cfg.try_config(**vars(args)) == expected
@pytest.fixture
def patch_pernosco_email_check(monkeypatch):
def inner(val):
def fake_check_output(*args, **kwargs):
return val
monkeypatch.setattr(subprocess, 'check_output', fake_check_output)
return inner
def test_pernosco(patch_pernosco_email_check):
patch_pernosco_email_check(dedent("""
user foobar@mozilla.com
hostname hg.mozilla.com
"""))
parser = ArgumentParser()
cfg = Pernosco()
cfg.add_arguments(parser)
args = parser.parse_args(['--pernosco'])
assert cfg.try_config(**vars(args)) == {"env": {"PERNOSCO": "1"}}
if __name__ == '__main__': if __name__ == '__main__':
mozunit.main() mozunit.main()