Index: grit/grit_runner.py |
=================================================================== |
--- grit/grit_runner.py (revision 0) |
+++ grit/grit_runner.py (revision 0) |
@@ -0,0 +1,212 @@ |
+#!/usr/bin/python2.4 |
+# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+'''Command processor for GRIT. This is the script you invoke to run the various |
+GRIT tools. |
+''' |
+ |
+import os |
+import sys |
+if __name__ == '__main__': |
+ sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), '..')) |
+ |
+import getopt |
+ |
+from grit import util |
+ |
+import grit.exception |
+ |
+import grit.tool.build |
+import grit.tool.count |
+import grit.tool.diff_structures |
+import grit.tool.menu_from_parts |
+import grit.tool.newgrd |
+import grit.tool.resize |
+import grit.tool.rc2grd |
+import grit.tool.test |
+import grit.tool.transl2tc |
+import grit.tool.unit |
+ |
+ |
+# Copyright notice |
+_COPYRIGHT = '''\ |
+GRIT - the Google Resource and Internationalization Tool |
+Copyright (c) Google Inc. %d |
+''' % util.GetCurrentYear() |
+ |
+# Keys for the following map |
+_CLASS = 1 |
+_REQUIRES_INPUT = 2 |
+_HIDDEN = 3 # optional key - presence indicates tool is hidden |
+ |
+ |
+# Maps tool names to the tool's module. Done as a list of (key, value) tuples |
+# instead of a map to preserve ordering. |
+_TOOLS = [ |
+ ['build', { _CLASS : grit.tool.build.RcBuilder, _REQUIRES_INPUT : True }], |
+ ['newgrd', { _CLASS : grit.tool.newgrd.NewGrd, _REQUIRES_INPUT : False }], |
+ ['rc2grd', { _CLASS : grit.tool.rc2grd.Rc2Grd, _REQUIRES_INPUT : False }], |
+ ['transl2tc', { _CLASS : grit.tool.transl2tc.TranslationToTc, |
+ _REQUIRES_INPUT : False }], |
+ ['sdiff', { _CLASS : grit.tool.diff_structures.DiffStructures, |
+ _REQUIRES_INPUT : False }], |
+ ['resize', { |
+ _CLASS : grit.tool.resize.ResizeDialog, _REQUIRES_INPUT : True }], |
+ ['unit', { _CLASS : grit.tool.unit.UnitTestTool, _REQUIRES_INPUT : False }], |
+ ['count', { _CLASS : grit.tool.count.CountMessage, _REQUIRES_INPUT : True }], |
+ ['test', { |
+ _CLASS: grit.tool.test.TestTool, _REQUIRES_INPUT : True, |
+ _HIDDEN : True }], |
+ ['menufromparts', { |
+ _CLASS: grit.tool.menu_from_parts.MenuTranslationsFromParts, |
+ _REQUIRES_INPUT : True, _HIDDEN : True }], |
+] |
+ |
+ |
+def PrintUsage(): |
+ print _COPYRIGHT |
+ |
+ tool_list = '' |
+ for (tool, info) in _TOOLS: |
+ if not _HIDDEN in info.keys(): |
+ tool_list += ' %-12s %s\n' % (tool, info[_CLASS]().ShortDescription()) |
+ |
+ # TODO(joi) Put these back into the usage when appropriate: |
+ # |
+ # -d Work disconnected. This causes GRIT not to attempt connections with |
+ # e.g. Perforce. |
+ # |
+ # -c Use the specified Perforce CLIENT when talking to Perforce. |
+ print '''Usage: grit [GLOBALOPTIONS] TOOL [args to tool] |
+ |
+Global options: |
+ |
+ -i INPUT Specifies the INPUT file to use (a .grd file). If this is not |
+ specified, GRIT will look for the environment variable GRIT_INPUT. |
+ If it is not present either, GRIT will try to find an input file |
+ named 'resource.grd' in the current working directory. |
+ |
+ -v Print more verbose runtime information. |
+ |
+ -x Print extremely verbose runtime information. Implies -v |
+ |
+ -p FNAME Specifies that GRIT should profile its execution and output the |
+ results to the file FNAME. |
+ |
+Tools: |
+ |
+ TOOL can be one of the following: |
+%s |
+ For more information on how to use a particular tool, and the specific |
+ arguments you can send to that tool, execute 'grit help TOOL' |
+''' % (tool_list) |
+ |
+ |
+class Options(object): |
+ '''Option storage and parsing.''' |
+ |
+ def __init__(self): |
+ self.disconnected = False |
+ self.client = '' |
+ self.input = None |
+ self.verbose = False |
+ self.extra_verbose = False |
+ self.output_stream = sys.stdout |
+ self.profile_dest = None |
+ |
+ def ReadOptions(self, args): |
+ '''Reads options from the start of args and returns the remainder.''' |
+ (opts, args) = getopt.getopt(args, 'g:dvxc:i:p:') |
+ for (key, val) in opts: |
+ if key == '-d': self.disconnected = True |
+ elif key == '-c': self.client = val |
+ elif key == '-i': self.input = val |
+ elif key == '-v': |
+ self.verbose = True |
+ util.verbose = True |
+ elif key == '-x': |
+ self.verbose = True |
+ util.verbose = True |
+ self.extra_verbose = True |
+ util.extra_verbose = True |
+ elif key == '-p': self.profile_dest = val |
+ |
+ if not self.input: |
+ if 'GRIT_INPUT' in os.environ: |
+ self.input = os.environ['GRIT_INPUT'] |
+ else: |
+ self.input = 'resource.grd' |
+ |
+ return args |
+ |
+ def __repr__(self): |
+ return '(disconnected: %d, verbose: %d, client: %s, input: %s)' % ( |
+ self.disconnected, self.verbose, self.client, self.input) |
+ |
+ |
+def _GetToolInfo(tool): |
+ '''Returns the info map for the tool named 'tool' or None if there is no |
+ such tool.''' |
+ matches = filter(lambda t: t[0] == tool, _TOOLS) |
+ if not len(matches): |
+ return None |
+ else: |
+ return matches[0][1] |
+ |
+ |
+def Main(args): |
+ '''Parses arguments and does the appropriate thing.''' |
+ util.ChangeStdoutEncoding() |
+ |
+ if not len(args) or len(args) == 1 and args[0] == 'help': |
+ PrintUsage() |
+ return 0 |
+ elif len(args) == 2 and args[0] == 'help': |
+ tool = args[1].lower() |
+ if not _GetToolInfo(tool): |
+ print "No such tool. Try running 'grit help' for a list of tools." |
+ return 2 |
+ |
+ print ("Help for 'grit %s' (for general help, run 'grit help'):\n" |
+ % (tool)) |
+ print _GetToolInfo(tool)[_CLASS].__doc__ |
+ return 0 |
+ else: |
+ options = Options() |
+ args = options.ReadOptions(args) # args may be shorter after this |
+ if not args: |
+ print "No tool provided. Try running 'grit help' for a list of tools." |
+ return 2 |
+ tool = args[0] |
+ if not _GetToolInfo(tool): |
+ print "No such tool. Try running 'grit help' for a list of tools." |
+ return 2 |
+ |
+ try: |
+ if _GetToolInfo(tool)[_REQUIRES_INPUT]: |
+ os.stat(options.input) |
+ except OSError: |
+ print ('Input file %s not found.\n' |
+ 'To specify a different input file:\n' |
+ ' 1. Use the GRIT_INPUT environment variable.\n' |
+ ' 2. Use the -i command-line option. This overrides ' |
+ 'GRIT_INPUT.\n' |
+ ' 3. Specify neither GRIT_INPUT or -i and GRIT will try to load ' |
+ "'resource.grd'\n" |
+ ' from the current directory.' % options.input) |
+ return 2 |
+ |
+ toolobject = _GetToolInfo(tool)[_CLASS]() |
+ if options.profile_dest: |
+ import hotshot |
+ prof = hotshot.Profile(options.profile_dest) |
+ prof.runcall(toolobject.Run, options, args[1:]) |
+ else: |
+ toolobject.Run(options, args[1:]) |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(Main(sys.argv[1:])) |
+ |
Property changes on: grit/grit_runner.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |