Bug 1333167: Handle empty try message. r=dustin draft
authorWander Lairson Costa <wcosta@mozilla.com>
Thu, 02 Feb 2017 09:34:43 -0200
changeset 469560 57a699e95e55eabaad3e6a7596086c7f06248e91
parent 469559 b992786158851f1099aedfce8669a163228edc51
child 544238 699bfb5ae36c8723e2cd18760af5b25ab39b82b7
push id43768
push userwcosta@mozilla.com
push dateThu, 02 Feb 2017 11:35:10 +0000
reviewersdustin
bugs1333167
milestone54.0a1
Bug 1333167: Handle empty try message. r=dustin We parse_message needs to return an args object even if try commit message is empty. MozReview-Commit-ID: BPWvzjAyjHX
taskcluster/taskgraph/try_option_syntax.py
--- a/taskcluster/taskgraph/try_option_syntax.py
+++ b/taskcluster/taskgraph/try_option_syntax.py
@@ -195,27 +195,30 @@ def escape_whitespace_in_brackets(input_
             result += '\ '
             continue
 
         result += char
 
     return result
 
 
-def parse_message(message):
+def find_try_idx(message):
     # shlex used to ensure we split correctly when giving values to argparse.
     parts = shlex.split(escape_whitespace_in_brackets(message))
     try_idx = None
     for idx, part in enumerate(parts):
         if part == TRY_DELIMITER:
             try_idx = idx
             break
 
-    if try_idx is None:
-        return None
+    return try_idx, parts
+
+
+def parse_message(message):
+    try_idx, parts = find_try_idx(message)
 
     # Argument parser based on try flag flags
     parser = argparse.ArgumentParser()
     parser.add_argument('-b', '--build', dest='build_types')
     parser.add_argument('-p', '--platform', nargs='?',
                         dest='platforms', const='all', default='all')
     parser.add_argument('-u', '--unittests', nargs='?',
                         dest='unittests', const='all', default='all')
@@ -230,16 +233,17 @@ def parse_message(message):
     parser.add_argument('--rebuild-talos', dest='talos_trigger_tests', action='store',
                         type=int, default=1)
     parser.add_argument('--setenv', dest='env', action='append')
     parser.add_argument('--spsProfile', dest='profile', action='store_true')
     parser.add_argument('--tag', dest='tag', action='store', default=None)
     parser.add_argument('--no-retry', dest='no_retry', action='store_true')
     # In order to run test jobs multiple times
     parser.add_argument('--rebuild', dest='trigger_tests', type=int, default=1)
+    parts = parts[try_idx:] if try_idx is not None else []
     args, _ = parser.parse_known_args(parts[try_idx:])
     return args
 
 
 class TryOptionSyntax(object):
 
     def __init__(self, message, full_task_graph):
         """
@@ -279,19 +283,22 @@ class TryOptionSyntax(object):
         self.interactive = False
         self.notifications = None
         self.talos_trigger_tests = 0
         self.env = []
         self.profile = False
         self.tag = None
         self.no_retry = False
 
+        try_idx, _ = find_try_idx(message)
+        if try_idx is None:
+            return None
+
         args = parse_message(message)
-        if args is None:
-            return
+        assert args is not None
 
         self.jobs = self.parse_jobs(args.jobs)
         self.build_types = self.parse_build_types(args.build_types)
         self.platforms = self.parse_platforms(args.platforms)
         self.unittests = self.parse_test_option(
             "unittest_try_name", args.unittests, full_task_graph)
         self.talos = self.parse_test_option("talos_try_name", args.talos, full_task_graph)
         self.trigger_tests = args.trigger_tests