]> granicus.if.org Git - python/commitdiff
convert ast versioning to mercurial
authorBenjamin Peterson <benjamin@python.org>
Sun, 13 Mar 2011 00:28:16 +0000 (18:28 -0600)
committerBenjamin Peterson <benjamin@python.org>
Sun, 13 Mar 2011 00:28:16 +0000 (18:28 -0600)
Doc/library/ast.rst
Misc/NEWS
Parser/Python.asdl
Parser/asdl.py
Parser/asdl_c.py
Python/Python-ast.c

index e2c0b6d17d96933dc1c4474b39f860bc9583592e..85081be39911a8116587ea3d5a7b7a1d5f20403c 100644 (file)
@@ -96,8 +96,8 @@ Node classes
 Abstract Grammar
 ----------------
 
-The module defines a string constant ``__version__`` which is the decimal
-Subversion revision number of the file shown below.
+The module defines a string constant ``__version__`` which is the Mercurial
+revision of the file shown below.
 
 The abstract grammar is currently defined as follows:
 
index 7cfd3fc10bd95dbce0830d8d951544351404f5a1..ce6bb05ca96323e53b0a3a9e98f77d8d9ac3c7a1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ What's New in Python 3.3 Alpha 1?
 Core and Builtins
 -----------------
 
+- _ast.__version__ is now a Mercurial integer and hex revision.
+
 - Issue #9856: Change object.__format__ with a non-empty format string
   to be a DeprecationWarning. In 3.2 it was a PendingDeprecationWarning.
   In 3.4 it will be a TypeError.
index 9407b2f18692e19b8edd2881c56ac81f348cdc52..8e2e1ac6acdbda088a60dd72157864ca880b3ebd 100644 (file)
@@ -1,6 +1,6 @@
 -- ASDL's four builtin types are identifier, int, string, object
 
-module Python version "$Revision$"
+module Python
 {
        mod = Module(stmt* body)
            | Interactive(stmt* body)
index 7b4e2dc81e20bf6ba641e4cb6fb6a7b7fb3a1a17..c63dfa7fb6be86d3689a0bcf6cb044f735450366 100644 (file)
@@ -114,28 +114,20 @@ class ASDLParser(spark.GenericParser, object):
         raise ASDLSyntaxError(tok.lineno, tok)
 
     def p_module_0(self, info):
-        " module ::= Id Id version { } "
-        module, name, version, _0, _1 = info
+        " module ::= Id Id { } "
+        module, name, _0, _1 = info
         if module.value != "module":
             raise ASDLSyntaxError(module.lineno,
                                   msg="expected 'module', found %s" % module)
-        return Module(name, None, version)
+        return Module(name, None)
 
     def p_module(self, info):
-        " module ::= Id Id version { definitions } "
-        module, name, version, _0, definitions, _1 = info
+        " module ::= Id Id { definitions } "
+        module, name, _0, definitions, _1 = info
         if module.value != "module":
             raise ASDLSyntaxError(module.lineno,
                                   msg="expected 'module', found %s" % module)
-        return Module(name, definitions, version)
-
-    def p_version(self, info):
-        "version ::= Id String"
-        version, V = info
-        if version.value != "version":
-            raise ASDLSyntaxError(version.lineno,
-                                  msg="expected 'version', found %" % version)
-        return V
+        return Module(name, definitions)
 
     def p_definition_0(self, definition):
         " definitions ::= definition "
@@ -246,10 +238,9 @@ class AST(object):
     pass # a marker class
 
 class Module(AST):
-    def __init__(self, name, dfns, version):
+    def __init__(self, name, dfns):
         self.name = name
         self.dfns = dfns
-        self.version = version
         self.types = {} # maps type name to value (from dfns)
         for type in dfns:
             self.types[type.name.value] = type.value
index d6555d6d7252bd40c9bdba410d93c29a10c71c76..d7aecb58c246cd271bbf9943f42b3c7fa6b61d6e 100755 (executable)
@@ -5,6 +5,7 @@
 # handle fields that have a type but no name
 
 import os, sys
+import subprocess
 
 import asdl
 
@@ -882,9 +883,6 @@ static int add_ast_fields(void)
             self.emit("if (!%s_singleton) return 0;" % cons.name, 1)
 
 
-def parse_version(mod):
-    return mod.version.value[12:-3]
-
 class ASTModuleVisitor(PickleVisitor):
 
     def visitModule(self, mod):
@@ -904,7 +902,7 @@ class ASTModuleVisitor(PickleVisitor):
         self.emit("return NULL;", 2)
         # Value of version: "$Revision$"
         self.emit('if (PyModule_AddStringConstant(m, "__version__", "%s") < 0)'
-                % parse_version(mod), 1)
+                % (mod.version,), 1)
         self.emit("return NULL;", 2)
         for dfn in mod.dfns:
             self.visit(dfn)
@@ -1137,6 +1135,18 @@ c_file_msg = """
 
 """
 
+
+def get_file_revision(f):
+    """Fish out the last change to a file in hg."""
+    args = ["hg", "log", "--template", "{rev}:{node|short}", "--limit", "1"]
+    p = subprocess.Popen(args, stdout=subprocess.PIPE)
+    out = p.communicate()[0]
+    if p.returncode:
+        print >> sys.stderr, "error return code from hg"
+        sys.exit(1)
+    return out
+
+
 def main(srcfile):
     argv0 = sys.argv[0]
     components = argv0.split(os.sep)
@@ -1145,6 +1155,7 @@ def main(srcfile):
     mod = asdl.parse(srcfile)
     if not asdl.check(mod):
         sys.exit(1)
+    mod.version = get_file_revision(srcfile)
     if INC_DIR:
         p = "%s/%s-ast.h" % (INC_DIR, mod.name)
         f = open(p, "w")
@@ -1164,7 +1175,7 @@ def main(srcfile):
         p = os.path.join(SRC_DIR, str(mod.name) + "-ast.c")
         f = open(p, "w")
         f.write(auto_gen_msg)
-        f.write(c_file_msg % parse_version(mod))
+        f.write(c_file_msg % (mod.version,))
         f.write('#include "Python.h"\n')
         f.write('#include "%s-ast.h"\n' % mod.name)
         f.write('\n')
index 2c09f96f0edd520f60b8e7f48d98415a55bc3561..726227cebbe3ee95d03e6023945ef4b4e10cee2a 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-   __version__ 82163.
+   __version__ 68409:c017695acf19.
 
    This module must be committed separately after each AST grammar change;
    The __version__ number is set to the revision number of the commit
@@ -6739,7 +6739,8 @@ PyInit__ast(void)
             NULL;
         if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
                 return NULL;
-        if (PyModule_AddStringConstant(m, "__version__", "82163") < 0)
+        if (PyModule_AddStringConstant(m, "__version__", "68409:c017695acf19")
+            < 0)
                 return NULL;
         if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return
             NULL;