Merged revisions 66173 via svnmerge from
svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3

........
  r66173 | benjamin.peterson | 2008-09-02 18:57:48 -0500 (Tue, 02 Sep 2008) | 8 lines

  A little 2to3 refactoring #3637

  This moves command line logic from refactor.py to a new file called
  main.py.  RefactoringTool now merely deals with the actual fixers and
  refactoring; options processing for example is abstracted out.

  This patch was reviewed by Gregory P. Smith.
........
diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py
new file mode 100644
index 0000000..c092886
--- /dev/null
+++ b/Lib/lib2to3/main.py
@@ -0,0 +1,86 @@
+"""
+Main program for 2to3.
+"""
+
+import sys
+import os
+import logging
+import optparse
+
+from . import refactor
+
+
+def main(fixer_pkg, args=None):
+    """Main program.
+
+    Args:
+        fixer_pkg: the name of a package where the fixers are located.
+        args: optional; a list of command line arguments. If omitted,
+              sys.argv[1:] is used.
+
+    Returns a suggested exit status (0, 1, 2).
+    """
+    # Set up option parser
+    parser = optparse.OptionParser(usage="refactor.py [options] file|dir ...")
+    parser.add_option("-d", "--doctests_only", action="store_true",
+                      help="Fix up doctests only")
+    parser.add_option("-f", "--fix", action="append", default=[],
+                      help="Each FIX specifies a transformation; default all")
+    parser.add_option("-l", "--list-fixes", action="store_true",
+                      help="List available transformations (fixes/fix_*.py)")
+    parser.add_option("-p", "--print-function", action="store_true",
+                      help="Modify the grammar so that print() is a function")
+    parser.add_option("-v", "--verbose", action="store_true",
+                      help="More verbose logging")
+    parser.add_option("-w", "--write", action="store_true",
+                      help="Write back modified files")
+
+    # Parse command line arguments
+    refactor_stdin = False
+    options, args = parser.parse_args(args)
+    if options.list_fixes:
+        print "Available transformations for the -f/--fix option:"
+        for fixname in refactor.get_all_fix_names(fixer_pkg):
+            print fixname
+        if not args:
+            return 0
+    if not args:
+        print >>sys.stderr, "At least one file or directory argument required."
+        print >>sys.stderr, "Use --help to show usage."
+        return 2
+    if "-" in args:
+        refactor_stdin = True
+        if options.write:
+            print >>sys.stderr, "Can't write to stdin."
+            return 2
+
+    # Set up logging handler
+    level = logging.DEBUG if options.verbose else logging.INFO
+    logging.basicConfig(format='%(name)s: %(message)s', level=level)
+
+    # Initialize the refactoring tool
+    rt_opts = {"print_function" : options.print_function}
+    avail_names = refactor.get_fixers_from_package(fixer_pkg)
+    explicit = []
+    if options.fix:
+        explicit = [fixer_pkg + ".fix_" + fix
+                    for fix in options.fix if fix != "all"]
+        fixer_names = avail_names if "all" in options.fix else explicit
+    else:
+        fixer_names = avail_names
+    rt = refactor.RefactoringTool(fixer_names, rt_opts, explicit=explicit)
+
+    # Refactor all files and directories passed as arguments
+    if not rt.errors:
+        if refactor_stdin:
+            rt.refactor_stdin()
+        else:
+            rt.refactor(args, options.write, options.doctests_only)
+        rt.summarize()
+
+    # Return error status (0 if rt.errors is zero)
+    return int(bool(rt.errors))
+
+
+if __name__ == "__main__":
+    sys.exit(main())