##// END OF EJS Templates
parsers: backout version mismatch detection from 21dafd8546d1...
Matt Mackall -
r20159:96b2dd77 default
parent child Browse files
Show More
@@ -1941,25 +1941,6 b' static void module_init(PyObject *mod)'
1941 dirstate_unset = Py_BuildValue("ciii", 'n', 0, -1, -1);
1941 dirstate_unset = Py_BuildValue("ciii", 'n', 0, -1, -1);
1942 }
1942 }
1943
1943
1944 static int check_python_version()
1945 {
1946 PyObject *sys = PyImport_ImportModule("sys");
1947 PyObject *hexversion = PyObject_GetAttrString(sys, "hexversion");
1948 long version = PyInt_AsLong(hexversion);
1949 /* sys.hexversion is a 32-bit number by default, so the -1 case
1950 * should only occur in unusual circumstances (e.g. if sys.hexversion
1951 * is manually set to an invalid value). */
1952 if ((version == -1) || (version >> 16 != PY_VERSION_HEX >> 16)) {
1953 PyErr_Format(PyExc_ImportError, "Python minor version mismatch: "
1954 "The Mercurial extension modules were compiled with Python "
1955 PY_VERSION ", but Mercurial is currently using Python with "
1956 "sys.hexversion=%ld: Python %s\n at: %s", version,
1957 Py_GetVersion(), Py_GetProgramFullPath());
1958 return -1;
1959 }
1960 return 0;
1961 }
1962
1963 #ifdef IS_PY3K
1944 #ifdef IS_PY3K
1964 static struct PyModuleDef parsers_module = {
1945 static struct PyModuleDef parsers_module = {
1965 PyModuleDef_HEAD_INIT,
1946 PyModuleDef_HEAD_INIT,
@@ -1971,8 +1952,6 b' static struct PyModuleDef parsers_module'
1971
1952
1972 PyMODINIT_FUNC PyInit_parsers(void)
1953 PyMODINIT_FUNC PyInit_parsers(void)
1973 {
1954 {
1974 if (check_python_version() == -1)
1975 return;
1976 PyObject *mod = PyModule_Create(&parsers_module);
1955 PyObject *mod = PyModule_Create(&parsers_module);
1977 module_init(mod);
1956 module_init(mod);
1978 return mod;
1957 return mod;
@@ -1980,8 +1959,6 b' PyMODINIT_FUNC PyInit_parsers(void)'
1980 #else
1959 #else
1981 PyMODINIT_FUNC initparsers(void)
1960 PyMODINIT_FUNC initparsers(void)
1982 {
1961 {
1983 if (check_python_version() == -1)
1984 return;
1985 PyObject *mod = Py_InitModule3("parsers", methods, parsers_doc);
1962 PyObject *mod = Py_InitModule3("parsers", methods, parsers_doc);
1986 module_init(mod);
1963 module_init(mod);
1987 }
1964 }
@@ -1,8 +1,6 b''
1 from mercurial import parsers
1 from mercurial import parsers
2 from mercurial.node import nullid, nullrev
2 from mercurial.node import nullid, nullrev
3 import struct
3 import struct
4 import subprocess
5 import sys
6
4
7 # This unit test compares the return value of the original Python
5 # This unit test compares the return value of the original Python
8 # implementation of parseindex and the new C implementation for
6 # implementation of parseindex and the new C implementation for
@@ -99,62 +97,7 b' def parse_index2(data, inline):'
99 index, chunkcache = parsers.parse_index2(data, inline)
97 index, chunkcache = parsers.parse_index2(data, inline)
100 return list(index), chunkcache
98 return list(index), chunkcache
101
99
102 def importparsers(hexversion):
103 """Import mercurial.parsers with the given sys.hexversion."""
104 # The file parsers.c inspects sys.hexversion to determine the version
105 # of the currently-running Python interpreter, so we monkey-patch
106 # sys.hexversion to simulate using different versions.
107 code = ("import sys; sys.hexversion=%s; "
108 "import mercurial.parsers" % hexversion)
109 cmd = "python -c \"%s\"" % code
110 # We need to do these tests inside a subprocess because parser.c's
111 # version-checking code happens inside the module init function, and
112 # when using reload() to reimport an extension module, "The init function
113 # of extension modules is not called a second time"
114 # (from http://docs.python.org/2/library/functions.html?#reload).
115 p = subprocess.Popen(cmd, shell=True,
116 stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
117 return p.communicate() # returns stdout, stderr
118
119 def printhexfail(testnumber, hexversion, msg):
120 try:
121 hexstring = hex(hexversion)
122 except TypeError:
123 hexstring = None
124 print ("%s) using Python %s and patched sys.hexversion %r (%r): %s" %
125 (testnumber, sys.version_info, hexversion, hexstring, msg))
126
127 def testversionokay(testnumber, hexversion):
128 stdout, stderr = importparsers(hexversion)
129 if stdout:
130 printhexfail(testnumber, hexversion,
131 "Expected no stdout but got: %r" % stdout)
132
133 def testversionfail(testnumber, hexversion):
134 stdout, stderr = importparsers(hexversion)
135 if not "ImportError: Python minor version mismatch" in stdout:
136 printhexfail(testnumber, hexversion,
137 "Expected stdout to contain %r but got: %r" %
138 (errstring, stdout))
139
140 def makehex(major, minor, micro):
141 return int("%x%02x%02x00" % (major, minor, micro), 16)
142
143 def runversiontests():
144 """Test importing parsers using different Python versions."""
145 info = sys.version_info
146 major, minor, micro = info[0], info[1], info[2]
147 # Test same major-minor versions.
148 testversionokay(1, makehex(major, minor, micro))
149 testversionokay(2, makehex(major, minor, micro + 1))
150 # Test different major-minor versions.
151 testversionfail(3, makehex(major + 1, minor, micro))
152 testversionfail(4, makehex(major, minor + 1, micro))
153 testversionfail(5, "'foo'")
154
155 def runtest() :
100 def runtest() :
156 runversiontests()
157
158 # Check that parse_index2() raises TypeError on bad arguments.
101 # Check that parse_index2() raises TypeError on bad arguments.
159 try:
102 try:
160 parse_index2(0, True)
103 parse_index2(0, True)
General Comments 0
You need to be logged in to leave comments. Login now