Misc.genpatches.py Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-standalone Show documentation
Show all versions of jython-standalone Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
#!/usr/bin/env python
"""
This script generates patches containing the Jython-specific deviations from the stdlib
modules. It looks for the string "svn.python.org" in the changeset summary and generates
a patch for all the changes made after that in each module.
The script expects to be run in the jython root directory and there should be a "cpython"
directory in the parent directory. That directory should be a clone of the CPython release
against which the modules in Lib/ have currently been patched.
Only modules that are common to Lib/, lib-python/ and ../cpython/Lib will be included in
the patches.
"""
from StringIO import StringIO
import os.path
import subprocess
import sys
import shutil
def get_modules(path):
modules = set()
for dirpath, dirnames, filenames in os.walk(path):
for filename in filenames:
if filename.endswith('.py'):
cutoff = len(path) + 1
fullpath = os.path.join(dirpath[cutoff:], filename)
modules.add(fullpath)
return modules
if not os.path.exists('lib-python'):
print >>sys.stderr, 'You need to run this script from the Jython root directory.'
sys.exit(1)
if not os.path.exists('../cpython'):
print >>sys.stderr, 'You need to have the CPython clone in ../cpython.'
sys.exit(1)
jymodules = get_modules(u'Lib')
cpymodules = get_modules(u'lib-python')
cpy25modules = get_modules(u'../cpython/Lib')
common_modules = jymodules.intersection(cpy25modules).intersection(cpymodules)
# Run mercurial to get the changesets where each file was last synced with CPython stdlib
print 'Parsing mercurial logs for the last synchronized changesets'
changesets = {}
for mod in common_modules:
path = 'Lib/' + mod
pipe = subprocess.Popen(['hg', 'log', '-v', path], stdout=subprocess.PIPE)
stdoutdata, stderrdata = pipe.communicate()
if pipe.returncode != 0:
print >>sys.stderr, stderrdata
sys.exit(1)
buf = StringIO(stdoutdata)
changeset = None
found = False
iterator = iter(list(buf))
for line in iterator:
if line.startswith('changeset:'):
changeset = line.split(':')[1].strip()
if line.startswith('description:'):
for descline in iterator:
if descline == '\n':
break
if 'svn.python.org' in descline:
found = True
break
if found:
break
if not found:
print >>sys.stderr,'No sync changeset found for %s' % path
else:
changesets[path] = changeset
if os.path.exists('patches'):
shutil.rmtree('patches')
os.mkdir('patches')
print 'Generating patches'
for path, changeset in changesets.iteritems():
patchname = 'patches/%s.patch' % path[4:]
patch_dir = os.path.dirname(patchname)
if not os.path.exists(patch_dir):
os.makedirs(patch_dir)
retcode = os.system('hg diff -r {} {} > {}'.format(changeset, path, patchname))
if retcode != 0:
print >>sys.stderr, "Error creating patch for %s" % path
sys.exit(3)
print 'All done. You can now run applypatches.py to update and patch the modules.'