195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python
295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be
401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file.
501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org"""Command processor for GRIT.  This is the script you invoke to run the various
701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgGRIT tools.
8eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org"""
901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport os
1101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport sys
1201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgif __name__ == '__main__':
1398b76c0017dbdc61506f146d197d594b1ce07db7joi@chromium.org  sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
1401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport getopt
1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit import util
1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
19eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.orgimport grit.extern.FP
2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org# Tool info factories; these import only within each factory to avoid
2201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org# importing most of the GRIT code until required.
2301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryBuild():
2401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.build
2501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.build.RcBuilder()
2601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
27eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.orgdef ToolFactoryBuildInfo():
28eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  import grit.tool.buildinfo
29eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  return grit.tool.buildinfo.DetermineBuildInfo()
30eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org
3101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryCount():
3201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.count
3301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.count.CountMessage()
3401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
3501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryDiffStructures():
3601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.diff_structures
3701fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.diff_structures.DiffStructures()
3801fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
3901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryMenuTranslationsFromParts():
4001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.menu_from_parts
4101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.menu_from_parts.MenuTranslationsFromParts()
4201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
4301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryNewGrd():
4401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.newgrd
4501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.newgrd.NewGrd()
4601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
4701fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryResizeDialog():
4801fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.resize
4901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.resize.ResizeDialog()
5001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
5101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryRc2Grd():
5201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.rc2grd
5301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.rc2grd.Rc2Grd()
5401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
5501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryTest():
5601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.test
5701fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.test.TestTool()
5801fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
5901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryTranslationToTc():
6001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.transl2tc
6101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.transl2tc.TranslationToTc()
6201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
6301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef ToolFactoryUnit():
6401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  import grit.tool.unit
6501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return grit.tool.unit.UnitTestTool()
6601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
67eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.orgdef ToolFactoryXmb():
68eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  import grit.tool.xmb
69eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  return grit.tool.xmb.OutputXmb()
70eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org
7139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgdef ToolAndroid2Grd():
7239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org  import grit.tool.android2grd
7339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org  return grit.tool.android2grd.Android2Grd()
7439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org
7501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Keys for the following map
7601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org_FACTORY = 1
7701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org_REQUIRES_INPUT = 2
7801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org_HIDDEN = 3  # optional key - presence indicates tool is hidden
7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
8001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Maps tool names to the tool's module.  Done as a list of (key, value) tuples
8101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# instead of a map to preserve ordering.
8201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org_TOOLS = [
8301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  ['build', { _FACTORY : ToolFactoryBuild, _REQUIRES_INPUT : True }],
84eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  ['buildinfo', { _FACTORY : ToolFactoryBuildInfo, _REQUIRES_INPUT : True }],
85eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  ['count', { _FACTORY : ToolFactoryCount, _REQUIRES_INPUT : True }],
86eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  ['menufromparts', {
87eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org      _FACTORY: ToolFactoryMenuTranslationsFromParts,
88eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org      _REQUIRES_INPUT : True, _HIDDEN : True }],
8901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  ['newgrd', { _FACTORY  : ToolFactoryNewGrd, _REQUIRES_INPUT : False }],
9001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  ['rc2grd', { _FACTORY : ToolFactoryRc2Grd, _REQUIRES_INPUT : False }],
9101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  ['resize', {
9201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org      _FACTORY : ToolFactoryResizeDialog, _REQUIRES_INPUT : True }],
93eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  ['sdiff', { _FACTORY : ToolFactoryDiffStructures,
94eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org              _REQUIRES_INPUT : False }],
9501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  ['test', {
9601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org      _FACTORY: ToolFactoryTest, _REQUIRES_INPUT : True,
9701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      _HIDDEN : True }],
98eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  ['transl2tc', { _FACTORY : ToolFactoryTranslationToTc,
99eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org                  _REQUIRES_INPUT : False }],
100eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  ['unit', { _FACTORY : ToolFactoryUnit, _REQUIRES_INPUT : False }],
101eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  ['xmb', { _FACTORY : ToolFactoryXmb, _REQUIRES_INPUT : True }],
10239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org  ['android2grd', {
10339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org      _FACTORY: ToolAndroid2Grd,
10439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org      _REQUIRES_INPUT : False }],
10501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org]
10601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
10701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
10801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgdef PrintUsage():
10901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  tool_list = ''
11001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  for (tool, info) in _TOOLS:
11101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if not _HIDDEN in info.keys():
11201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org      tool_list += '    %-12s %s\n' % (tool, info[_FACTORY]().ShortDescription())
11301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
11401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  # TODO(joi) Put these back into the usage when appropriate:
11501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #
11601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #  -d    Work disconnected.  This causes GRIT not to attempt connections with
11701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #        e.g. Perforce.
11801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #
11901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #  -c    Use the specified Perforce CLIENT when talking to Perforce.
120d4edc6c61f2135b39318e34f9b342b673133e6ccbenrg@chromium.org  print """GRIT - the Google Resource and Internationalization Tool
121d4edc6c61f2135b39318e34f9b342b673133e6ccbenrg@chromium.org
122d4edc6c61f2135b39318e34f9b342b673133e6ccbenrg@chromium.orgUsage: grit [GLOBALOPTIONS] TOOL [args to tool]
12301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
12401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgGlobal options:
12501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
12601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  -i INPUT  Specifies the INPUT file to use (a .grd file).  If this is not
12701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            specified, GRIT will look for the environment variable GRIT_INPUT.
12801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            If it is not present either, GRIT will try to find an input file
12901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            named 'resource.grd' in the current working directory.
13001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
131eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org  -h MODULE Causes GRIT to use MODULE.UnsignedFingerPrint instead of
132eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org            grit.extern.FP.UnsignedFingerprint.  MODULE must be
133eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org            available somewhere in the PYTHONPATH search path.
134eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org
13501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  -v        Print more verbose runtime information.
13601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
13701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  -x        Print extremely verbose runtime information.  Implies -v
13801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
13901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  -p FNAME  Specifies that GRIT should profile its execution and output the
14001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            results to the file FNAME.
14101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
14201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgTools:
14301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
14401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  TOOL can be one of the following:
14501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org%s
14601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  For more information on how to use a particular tool, and the specific
14701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  arguments you can send to that tool, execute 'grit help TOOL'
148eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org""" % (tool_list)
14901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
15001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
15101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass Options(object):
152eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  """Option storage and parsing."""
15301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
15401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def __init__(self):
15501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.disconnected = False
15601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.client = ''
157eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org    self.hash = None
15801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.input = None
15901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.verbose = False
16001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.extra_verbose = False
16101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.output_stream = sys.stdout
16201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.profile_dest = None
163705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    self.psyco = False
16401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
16501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def ReadOptions(self, args):
166eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org    """Reads options from the start of args and returns the remainder."""
1671e98e2afc5bc983b43e6b482069150082c5fb337joi@chromium.org    (opts, args) = getopt.getopt(args, 'g:qdvxc:i:p:h:', ('psyco',))
16801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    for (key, val) in opts:
16901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      if key == '-d': self.disconnected = True
17001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      elif key == '-c': self.client = val
171eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org      elif key == '-h': self.hash = val
17201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      elif key == '-i': self.input = val
17301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      elif key == '-v':
17401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        self.verbose = True
17501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        util.verbose = True
17601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      elif key == '-x':
17701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        self.verbose = True
17801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        util.verbose = True
17901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        self.extra_verbose = True
18001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        util.extra_verbose = True
18101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      elif key == '-p': self.profile_dest = val
182705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      elif key == '--psyco': self.psyco = True
18301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
18401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if not self.input:
18501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      if 'GRIT_INPUT' in os.environ:
18601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        self.input = os.environ['GRIT_INPUT']
18701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      else:
18801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        self.input = 'resource.grd'
18901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
19001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return args
19101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
19201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def __repr__(self):
19301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return '(disconnected: %d, verbose: %d, client: %s, input: %s)' % (
194eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org        self.disconnected, self.verbose, self.client, self.input)
19501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
19601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
19701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgdef _GetToolInfo(tool):
198eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  """Returns the info map for the tool named 'tool' or None if there is no
199eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  such tool."""
200705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org  matches = [t for t in _TOOLS if t[0] == tool]
201eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  if not matches:
20201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return None
20301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  else:
20401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return matches[0][1]
20501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
20601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
20701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgdef Main(args):
208eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  """Parses arguments and does the appropriate thing."""
20901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  util.ChangeStdoutEncoding()
21001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
21195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org  if sys.version_info < (2, 6):
21295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org    print "GRIT requires Python 2.6 or later."
21395640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org    return 2
214eda8d69f7c49419eef6e96a1cd42af26a864d794joi@chromium.org  elif not args or (len(args) == 1 and args[0] == 'help'):
21501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    PrintUsage()
21601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return 0
21701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  elif len(args) == 2 and args[0] == 'help':
21801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool = args[1].lower()
21901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if not _GetToolInfo(tool):
22001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      print "No such tool.  Try running 'grit help' for a list of tools."
22101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      return 2
22201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
22301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    print ("Help for 'grit %s' (for general help, run 'grit help'):\n"
22401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org           % (tool))
22501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    print _GetToolInfo(tool)[_FACTORY]().__doc__
22601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return 0
22701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  else:
22801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    options = Options()
22901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    args = options.ReadOptions(args)  # args may be shorter after this
23001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if not args:
23101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      print "No tool provided.  Try running 'grit help' for a list of tools."
23201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      return 2
23301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool = args[0]
23401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if not _GetToolInfo(tool):
23501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      print "No such tool.  Try running 'grit help' for a list of tools."
23601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      return 2
23701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
23801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    try:
23901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      if _GetToolInfo(tool)[_REQUIRES_INPUT]:
24001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        os.stat(options.input)
24101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    except OSError:
24201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      print ('Input file %s not found.\n'
24301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org             'To specify a different input file:\n'
24401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org             '  1. Use the GRIT_INPUT environment variable.\n'
24501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org             '  2. Use the -i command-line option.  This overrides '
24601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org             'GRIT_INPUT.\n'
24701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org             '  3. Specify neither GRIT_INPUT or -i and GRIT will try to load '
24801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org             "'resource.grd'\n"
24901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org             '     from the current directory.' % options.input)
25001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      return 2
25101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
252705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    if options.psyco:
253705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      # Psyco is a specializing JIT for Python.  Early tests indicate that it
254705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      # could speed up GRIT (at the expense of more memory) for large GRIT
255705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      # compilations.  See http://psyco.sourceforge.net/
256705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      import psyco
257705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      psyco.profile()
258705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org
259eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org    if options.hash:
260eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org      grit.extern.FP.UseUnsignedFingerPrintFromModule(options.hash)
261eafc3b06f8c3ec9a48714b5d44e7d91ecab023ebjoi@chromium.org
26201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    toolobject = _GetToolInfo(tool)[_FACTORY]()
26301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if options.profile_dest:
26401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      import hotshot
26501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      prof = hotshot.Profile(options.profile_dest)
26601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      prof.runcall(toolobject.Run, options, args[1:])
26701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    else:
26801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      toolobject.Run(options, args[1:])
26901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
27001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
27101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgif __name__ == '__main__':
27201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  sys.exit(Main(sys.argv[1:]))
273