summaryrefslogtreecommitdiffstats
path: root/Lib/lib2to3/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/lib2to3/main.py')
-rw-r--r--Lib/lib2to3/main.py50
1 files changed, 42 insertions, 8 deletions
diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py
index b286de8..4cb0362 100644
--- a/Lib/lib2to3/main.py
+++ b/Lib/lib2to3/main.py
@@ -15,10 +15,31 @@ class StdoutRefactoringTool(refactor.RefactoringTool):
Prints output to stdout.
"""
+ def __init__(self, fixers, options, explicit, nobackups):
+ self.nobackups = nobackups
+ super(StdoutRefactoringTool, self).__init__(fixers, options, explicit)
+
def log_error(self, msg, *args, **kwargs):
self.errors.append((msg, args, kwargs))
self.logger.error(msg, *args, **kwargs)
+ def write_file(self, new_text, filename, old_text):
+ if not self.nobackups:
+ # Make backup
+ backup = filename + ".bak"
+ if os.path.lexists(backup):
+ try:
+ os.remove(backup)
+ except os.error as err:
+ self.log_message("Can't remove backup %s", backup)
+ try:
+ os.rename(filename, backup)
+ except os.error as err:
+ self.log_message("Can't rename %s to %s", filename, backup)
+ # Actually write the new file
+ super(StdoutRefactoringTool, self).write_file(new_text,
+ filename, old_text)
+
def print_output(self, lines):
for line in lines:
print(line)
@@ -39,7 +60,9 @@ def main(fixer_pkg, args=None):
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")
+ help="Each FIX specifies a transformation; default: all")
+ parser.add_option("-x", "--nofix", action="append", default=[],
+ help="Prevent a fixer from being run.")
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",
@@ -48,10 +71,14 @@ def main(fixer_pkg, args=None):
help="More verbose logging")
parser.add_option("-w", "--write", action="store_true",
help="Write back modified files")
+ parser.add_option("-n", "--nobackups", action="store_true", default=False,
+ help="Don't write backups for modified files.")
# Parse command line arguments
refactor_stdin = False
options, args = parser.parse_args(args)
+ if not options.write and options.nobackups:
+ parser.error("Can't use -n without -w")
if options.list_fixes:
print("Available transformations for the -f/--fix option:")
for fixname in refactor.get_all_fix_names(fixer_pkg):
@@ -74,15 +101,22 @@ def main(fixer_pkg, args=None):
# Initialize the refactoring tool
rt_opts = {"print_function" : options.print_function}
- avail_names = refactor.get_fixers_from_package(fixer_pkg)
- explicit = []
+ avail_fixes = set(refactor.get_fixers_from_package(fixer_pkg))
+ unwanted_fixes = set(fixer_pkg + ".fix_" + fix for fix in options.nofix)
+ explicit = set()
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
+ all_present = False
+ for fix in options.fix:
+ if fix == "all":
+ all_present = True
+ else:
+ explicit.add(fixer_pkg + ".fix_" + fix)
+ requested = avail_fixes.union(explicit) if all_present else explicit
else:
- fixer_names = avail_names
- rt = StdoutRefactoringTool(fixer_names, rt_opts, explicit=explicit)
+ requested = avail_fixes.union(explicit)
+ fixer_names = requested.difference(unwanted_fixes)
+ rt = StdoutRefactoringTool(sorted(fixer_names), rt_opts, sorted(explicit),
+ options.nobackups)
# Refactor all files and directories passed as arguments
if not rt.errors: