| """ |
| 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()) |