Skip to content

Commit

Permalink
Add new copydir_run_2to3() function, for use e.g. in test runners to …
Browse files Browse the repository at this point in the history
…transparently convert and run tests written for Python 2.
  • Loading branch information
birkenfeld committed Mar 31, 2009
1 parent bb93d17 commit 6d4a9cf
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions Lib/distutils/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,39 @@ def log_debug(self, msg, *args):
r = DistutilsRefactoringTool(fixer_names, options=options)
r.refactor(files, write=True)

def copydir_run_2to3(src, dest, template=None, fixer_names=None,
options=None, explicit=None):
"""Recursively copy a directory, only copying new and changed files,
running run_2to3 over all newly copied Python modules afterward.
If you give a template string, it's parsed like a MANIFEST.in.
"""
from distutils.dir_util import mkpath
from distutils.file_util import copy_file
from distutils.filelist import FileList
filelist = FileList()
curdir = os.getcwd()
os.chdir(src)
try:
filelist.findall()
finally:
os.chdir(curdir)
filelist.files[:] = filelist.allfiles
if template:
for line in template.splitlines():
line = line.strip()
if not line: continue
filelist.process_template_line(line)
copied = []
for filename in filelist.files:
outname = os.path.join(dest, filename)
mkpath(os.path.dirname(outname))
res = copy_file(os.path.join(src, filename), outname, update=1)
if res[1]: copied.append(outname)
run_2to3([fn for fn in copied if fn.lower().endswith('.py')],
fixer_names=fixer_names, options=options, explicit=explicit)
return copied

class Mixin2to3:
'''Mixin class for commands that run 2to3.
To configure 2to3, setup scripts may either change
Expand Down

0 comments on commit 6d4a9cf

Please sign in to comment.