| Index: tools/mb/mb.py | 
| diff --git a/tools/mb/mb.py b/tools/mb/mb.py | 
| index c90c5b925f54bbac81f6cbd6e29c235ecbfd7e26..89f5c41081068dfc6b283a9e8f3ab4759753954b 100755 | 
| --- a/tools/mb/mb.py | 
| +++ b/tools/mb/mb.py | 
| @@ -45,6 +45,8 @@ class MetaBuildWrapper(object): | 
| self.chromium_src_dir = CHROMIUM_SRC_DIR | 
| self.default_config = os.path.join(self.chromium_src_dir, 'tools', 'mb', | 
| 'mb_config.pyl') | 
| +    self.default_isolate_map = os.path.join(self.chromium_src_dir, 'testing', | 
| +                                            'buildbot', 'gn_isolate_map.pyl') | 
| self.executable = sys.executable | 
| self.platform = sys.platform | 
| self.sep = os.sep | 
| @@ -85,7 +87,11 @@ class MetaBuildWrapper(object): | 
| subp.add_argument('-f', '--config-file', metavar='PATH', | 
| default=self.default_config, | 
| help='path to config file ' | 
| -                            '(default is //tools/mb/mb_config.pyl)') | 
| +                             '(default is %(default)s)') | 
| +      subp.add_argument('-i', '--isolate-map-file', metavar='PATH', | 
| +                        default=self.default_isolate_map, | 
| +                        help='path to isolate map file ' | 
| +                             '(default is %(default)s)') | 
| subp.add_argument('-g', '--goma-dir', | 
| help='path to goma directory') | 
| subp.add_argument('--gyp-script', metavar='PATH', | 
| @@ -126,8 +132,7 @@ class MetaBuildWrapper(object): | 
| 'each builder as a JSON object') | 
| subp.add_argument('-f', '--config-file', metavar='PATH', | 
| default=self.default_config, | 
| -                      help='path to config file ' | 
| -                          '(default is //tools/mb/mb_config.pyl)') | 
| +                      help='path to config file (default is %(default)s)') | 
| subp.add_argument('-g', '--goma-dir', | 
| help='path to goma directory') | 
| subp.set_defaults(func=self.CmdExport) | 
| @@ -203,16 +208,14 @@ class MetaBuildWrapper(object): | 
| help='validate the config file') | 
| subp.add_argument('-f', '--config-file', metavar='PATH', | 
| default=self.default_config, | 
| -                      help='path to config file ' | 
| -                          '(default is //tools/mb/mb_config.pyl)') | 
| +                      help='path to config file (default is %(default)s)') | 
| subp.set_defaults(func=self.CmdValidate) | 
|  | 
| subp = subps.add_parser('audit', | 
| help='Audit the config file to track progress') | 
| subp.add_argument('-f', '--config-file', metavar='PATH', | 
| default=self.default_config, | 
| -                      help='path to config file ' | 
| -                          '(default is //tools/mb/mb_config.pyl)') | 
| +                      help='path to config file (default is %(default)s)') | 
| subp.add_argument('-i', '--internal', action='store_true', | 
| help='check internal masters also') | 
| subp.add_argument('-m', '--master', action='append', | 
| @@ -671,8 +674,14 @@ class MetaBuildWrapper(object): | 
| self.mixins = contents['mixins'] | 
|  | 
| def ReadIsolateMap(self): | 
| -    return ast.literal_eval(self.ReadFile(self.PathJoin( | 
| -        self.chromium_src_dir, 'testing', 'buildbot', 'gn_isolate_map.pyl'))) | 
| +    if not self.Exists(self.args.isolate_map_file): | 
| +      raise MBErr('isolate map file not found at %s' % | 
| +                  self.args.isolate_map_file) | 
| +    try: | 
| +      return ast.literal_eval(self.ReadFile(self.args.isolate_map_file)) | 
| +    except SyntaxError as e: | 
| +      raise MBErr('Failed to parse isolate map file "%s": %s' % | 
| +                  (self.args.isolate_map_file, e)) | 
|  | 
| def ConfigFromArgs(self): | 
| if self.args.config: | 
|  |