Index: git_cl.py |
diff --git a/git_cl.py b/git_cl.py |
index 77f4a9e9f13c769e02e6acdadb087acb64f05224..23f8835fac1a7aecec9b664bd825afda2e72a657 100755 |
--- a/git_cl.py |
+++ b/git_cl.py |
@@ -2207,6 +2207,44 @@ def GetTreeStatusReason(): |
connection.close() |
return status['message'] |
M-A Ruel
2014/08/14 18:42:02
2 lines
sheyang
2014/08/14 19:50:22
Done.
|
+def GetBuilderMaster(bot_list): |
+ """For a given builder, fetch the master from AE if available.""" |
+ err_msg = '' |
+ master_map = None |
+ result_master = '' |
+ map_url = 'https://builders-map.appspot.com/' |
+ try: |
+ res = urllib2.urlopen(map_url) |
+ master_map = json.load(res) |
M-A Ruel
2014/08/14 18:42:02
master_map = json.load(urllib2.urlopen(map_url))
sheyang
2014/08/14 19:50:24
Done.
|
+ except urllib2.URLError as url_e: |
M-A Ruel
2014/08/14 18:42:02
s/url_e/e/
sheyang
2014/08/14 19:50:22
Done.
|
+ err_msg = ('Failed to fetch builder-to-master map from %s. Error: %s.' % |
M-A Ruel
2014/08/14 18:42:02
Why not return right away?
sheyang
2014/08/14 19:50:22
Done.
|
+ (map_url, url_e)) |
+ except ValueError as val_e: |
M-A Ruel
2014/08/14 18:42:02
s/val_e/e/
sheyang
2014/08/14 19:50:22
Done.
sheyang
2014/08/14 19:50:24
Done.
|
+ err_msg = 'Invalid json string from %s. Error: %s.' % (map_url, val_e) |
+ |
+ if master_map: |
M-A Ruel
2014/08/14 18:42:02
if not master_map:
return None, err_msg
sheyang
2014/08/14 19:50:24
Done.
|
+ for bot in bot_list: |
+ if ':' in bot: |
+ builder, _ = bot.split(':', 1) |
M-A Ruel
2014/08/14 18:42:02
builder = bot.split(':', 1)[0]
Remove line 2227,
sheyang
2014/08/14 19:50:22
Removed.
|
+ else: |
+ builder = bot |
+ master_list = master_map.get(builder, []) |
+ if not master_list: |
+ err_msg = 'Cannot find a master for builder %s.' % builder |
M-A Ruel
2014/08/14 18:42:02
It'd likely be simpler to return right away.
sheyang
2014/08/14 19:50:22
Done.
|
+ break |
+ elif len(master_list) > 1: |
+ err_msg = ('The builder name %s exists in multiple masters %s.' % |
M-A Ruel
2014/08/14 18:42:02
Same
sheyang
2014/08/14 19:50:22
Done.
|
+ (builder, master_list)) |
+ break |
+ else: |
+ cur_master = master_list[0] |
+ if not result_master: |
+ result_master = cur_master |
+ elif result_master != cur_master: |
+ err_msg = 'The builders do not belong to the same master.' |
+ result_master = '' |
M-A Ruel
2014/08/14 18:42:02
Return
sheyang
2014/08/14 19:50:24
Done.
|
+ break |
+ return result_master, err_msg |
M-A Ruel
2014/08/14 18:42:02
2 lines
sheyang
2014/08/14 19:50:24
Done.
|
def CMDtree(parser, args): |
"""Shows the status of the tree.""" |
@@ -2231,10 +2269,10 @@ def CMDtry(parser, args): |
"-b", "--bot", action="append", |
help=("IMPORTANT: specify ONE builder per --bot flag. Use it multiple " |
"times to specify multiple builders. ex: " |
- "'-bwin_rel:ui_tests,webkit_unit_tests -bwin_layout'. See " |
+ "'-b win_rel:ui_tests,webkit_unit_tests -b win_layout'. See " |
"the try server waterfall for the builders name and the tests " |
"available. Can also be used to specify gtest_filter, e.g. " |
- "-bwin_rel:base_unittests:ValuesTest.*Value")) |
+ "-b win_rel:base_unittests:ValuesTest.*Value")) |
group.add_option( |
"-m", "--master", default='', |
help=("Specify a try master where to run the tries.")) |
@@ -2276,8 +2314,11 @@ def CMDtry(parser, args): |
options.name = cl.GetBranch() |
if options.bot and not options.master: |
- parser.error('For manually specified bots please also specify the ' |
- 'tryserver master, e.g. "-m tryserver.chromium.linux".') |
+ options.master, err_msg = GetBuilderMaster(options.bot) |
+ if err_msg: |
+ parser.error('Tryserver master cannot be found because: %s\n' |
+ 'Please manually specify the tryserver master' |
+ ', e.g. "-m tryserver.chromium.linux".' % err_msg) |
def GetMasterMap(): |
# Process --bot and --testfilter. |