Bug 1414919 - [tryselect] Add --rebuild support to |mach try fuzzy|, r?jmaher draft
authorAndrew Halberstadt <ahalberstadt@mozilla.com>
Tue, 07 Nov 2017 10:27:44 -0500
changeset 695113 692af09512dd255f1358c9087c424ce1c510ffd5
parent 695112 60432f904443800f47658f1378cb3d2a5d66dc3e
child 739531 b85a52d44d4feb5a9f0d48b0d65ba152ae85edbd
push id88352
push userahalberstadt@mozilla.com
push dateWed, 08 Nov 2017 20:30:17 +0000
reviewersjmaher
bugs1414919
milestone58.0a1
Bug 1414919 - [tryselect] Add --rebuild support to |mach try fuzzy|, r?jmaher This allows rebuilding all selected tasks. This defines an upper limit of 20 rebuilds per push. If more are needed, developers can either change it in code or push multiple times. MozReview-Commit-ID: I0XtMP5yEEq
tools/tryselect/selectors/fuzzy.py
tools/tryselect/templates.py
--- a/tools/tryselect/selectors/fuzzy.py
+++ b/tools/tryselect/selectors/fuzzy.py
@@ -96,17 +96,17 @@ class FuzzyParser(BaseTryParser):
                   "target tasks).",
           }],
         [['-p', '--parameters'],
          {'default': None,
           'help': "Use the given parameters.yml to generate tasks, "
                   "defaults to latest parameters.yml from mozilla-central",
           }],
     ]
-    templates = ['artifact', 'env']
+    templates = ['artifact', 'env', 'rebuild']
 
 
 def run(cmd, cwd=None):
     is_win = platform.system() == 'Windows'
     return subprocess.call(cmd, cwd=cwd, shell=True if is_win else False)
 
 
 def run_fzf_install_script(fzf_path):
--- a/tools/tryselect/templates.py
+++ b/tools/tryselect/templates.py
@@ -6,16 +6,17 @@
 Templates provide a way of modifying the task definition of selected
 tasks. They live under taskcluster/taskgraph/templates.
 """
 
 from __future__ import absolute_import, print_function, unicode_literals
 
 import os
 from abc import ABCMeta, abstractmethod
+from argparse import Action
 
 from mozbuild.base import BuildEnvironmentNotFoundException, MozbuildObject
 
 here = os.path.abspath(os.path.dirname(__file__))
 
 
 class Template(object):
     __metaclass__ = ABCMeta
@@ -62,12 +63,42 @@ class Environment(Template):
                                  'Can be passed in multiple times.')
 
     def context(self, env, **kwargs):
         if not env:
             return
         return dict(e.split('=', 1) for e in env)
 
 
+class RangeAction(Action):
+    def __init__(self, min, max, *args, **kwargs):
+        self.min = min
+        self.max = max
+        kwargs['metavar'] = '[{}-{}]'.format(self.min, self.max)
+        super(RangeAction, self).__init__(*args, **kwargs)
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        name = option_string or self.dest
+        if values < self.min:
+            parser.error('{} can not be less than {}'.format(name, self.min))
+        if values > self.max:
+            parser.error('{} can not be more than {}'.format(name, self.max))
+        setattr(namespace, self.dest, values)
+
+
+class Rebuild(Template):
+
+    def add_arguments(self, parser):
+        parser.add_argument('--rebuild', action=RangeAction, min=2, max=20, default=None, type=int,
+                            help='Rebuild all selected tasks the specified number of times.')
+
+    def context(self, rebuild, **kwargs):
+        if not rebuild:
+            return
+
+        return rebuild
+
+
 all_templates = {
     'artifact': Artifact,
     'env': Environment,
+    'rebuild': Rebuild,
 }