encoding: avoid cyclic dependency around "parsers" in pure Python build
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Fri, 17 Oct 2014 02:07:04 +0900
changeset 22973 bcff9ecdaae0
parent 22972 44b16b59b80a
child 22974 6bd43614d387
encoding: avoid cyclic dependency around "parsers" in pure Python build 80f2b63dd83a brought "asciilower" and "import parsers" into "encoding.py". This works fine with "parsers" module in C implementation, but doesn't with one in pure Python implementation, because the latter causes cyclic dependency below and aborting execution: util => i18n => encoding => parsers => util This patch delays importing "parsers" module until it is really needed, to avoid cyclic dependency around "parsers" in pure Python build.
mercurial/encoding.py
--- a/mercurial/encoding.py	Tue Oct 14 01:40:04 2014 -0700
+++ b/mercurial/encoding.py	Fri Oct 17 02:07:04 2014 +0900
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-import error, parsers
+import error
 import unicodedata, locale, os
 
 def _getpreferredencoding():
@@ -258,14 +258,21 @@
             return concat(usub.encode(encoding))
     return ellipsis # no enough room for multi-column characters
 
-def asciilower(s):
+def _asciilower(s):
     '''convert a string to lowercase if ASCII
 
     Raises UnicodeDecodeError if non-ASCII characters are found.'''
     s.decode('ascii')
     return s.lower()
 
-asciilower = getattr(parsers, 'asciilower', asciilower)
+def asciilower(s):
+    # delay importing avoids cyclic dependency around "parsers" in
+    # pure Python build (util => i18n => encoding => parsers => util)
+    import parsers
+    impl = getattr(parsers, 'asciilower', _asciilower)
+    global asciilower
+    asciilower = impl
+    return impl(s)
 
 def lower(s):
     "best-effort encoding-aware case-folding of local string s"