contrib/check-py3-compat.py
changeset 27279 40eb385f798f
child 27331 35e69407b1ac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/check-py3-compat.py	Sun Dec 06 22:39:12 2015 -0800
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+#
+# check-py3-compat - check Python 3 compatibility of Mercurial files
+#
+# Copyright 2015 Gregory Szorc <gregory.szorc@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import, print_function
+
+import ast
+import sys
+
+def check_compat(f):
+    """Check Python 3 compatibility for a file."""
+    with open(f, 'rb') as fh:
+        content = fh.read()
+
+    root = ast.parse(content)
+    futures = set()
+    haveprint = False
+    for node in ast.walk(root):
+        if isinstance(node, ast.ImportFrom):
+            if node.module == '__future__':
+                futures |= set(n.name for n in node.names)
+        elif isinstance(node, ast.Print):
+            haveprint = True
+
+    if 'absolute_import' not in futures:
+        print('%s not using absolute_import' % f)
+    if haveprint and 'print_function' not in futures:
+        print('%s requires print_function' % f)
+
+if __name__ == '__main__':
+    for f in sys.argv[1:]:
+        check_compat(f)
+
+    sys.exit(0)