Automatically get version info from the patchlevel.h file.

This commit is contained in:
Georg Brandl 2007-08-01 16:06:45 +00:00
parent 0bccf4d944
commit ca78ec11e9
6 changed files with 91 additions and 11 deletions

2
TODO
View File

@ -3,7 +3,7 @@ Global TODO
- "often used" combo box in sidebar - "often used" combo box in sidebar
- discuss and debug comments system - discuss and debug comments system
- write new Makefile, handle automatic version info and checkout - write new Makefile, handle automatic checkout
- write a "printable" builder (export to latex, most probably) - write a "printable" builder (export to latex, most probably)
- discuss lib -> ref section move - discuss lib -> ref section move
- prepare for databases other than sqlite for comments - prepare for databases other than sqlite for comments

View File

@ -6,11 +6,17 @@
# that aren't pickleable (module imports are okay, they're removed automatically). # that aren't pickleable (module imports are okay, they're removed automatically).
# #
# The default replacements for |version| and |release|: # The default replacements for |version| and |release|.
# If 'auto', Sphinx looks for the Include/patchlevel.h file in the current Python
# source tree and replaces the values accordingly.
#
# The short X.Y version. # The short X.Y version.
version = '2.6' # version = '2.6'
version = 'auto'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '2.6a0' # release = '2.6a0'
release = 'auto'
# There are two options for replacing |today|: either, you set today to some # There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used: # non-false value, then it is used:
today = '' today = ''

View File

@ -17,17 +17,22 @@ during a build run.
These variables are: These variables are:
release : string
A string that is used as a replacement for the ``|release|`` reST
substitution. It should be the full version string including
alpha/beta/release candidate tags, e.g. ``2.5.2b3``.
version : string version : string
A string that is used as a replacement for the ``|version|`` reST A string that is used as a replacement for the ``|version|`` reST
substitution. It should be the Python version the documentation refers to. substitution. It should be the Python version the documentation refers to.
This consists only of the major and minor version parts, e.g. ``2.5``, even This consists only of the major and minor version parts, e.g. ``2.5``, even
for version 2.5.1. for version 2.5.1.
release : string
A string that is used as a replacement for the ``|release|`` reST
substitution. It should be the full version string including
alpha/beta/release candidate tags, e.g. ``2.5.2b3``.
Both ``release`` and ``version`` can be ``'auto'``, which means that they are
determined at runtime from the ``Include/patchlevel.h`` file, if a complete
Python source distribution can be found, or else from the interpreter running
Sphinx.
today_fmt : string today_fmt : string
A ``strftime`` format that is used to format a replacement for the A ``strftime`` format that is used to format a replacement for the
``|today|`` reST substitution. ``|today|`` reST substitution.
@ -37,7 +42,7 @@ today : string
output literally. If this is nonzero, it is used instead of output literally. If this is nonzero, it is used instead of
``strftime(today_fmt)``. ``strftime(today_fmt)``.
unused_file : list of strings unused_files : list of strings
A list of reST filenames that are to be disregarded during building. This A list of reST filenames that are to be disregarded during building. This
could be docs for temporarily disabled modules or documentation that's not could be docs for temporarily disabled modules or documentation that's not
yet ready for public consumption. yet ready for public consumption.

View File

@ -31,6 +31,7 @@ from .util import (get_matching_files, attrdict, status_iterator,
from .writer import HTMLWriter from .writer import HTMLWriter
from .util.console import bold, purple, green from .util.console import bold, purple, green
from .htmlhelp import build_hhx from .htmlhelp import build_hhx
from .patchlevel import get_version_info, get_sys_version_info
from .environment import BuildEnvironment from .environment import BuildEnvironment
from .highlighting import pygments, get_stylesheet from .highlighting import pygments, get_stylesheet
@ -96,6 +97,18 @@ class Builder(object):
for key, val in self.config.items(): for key, val in self.config.items():
if isinstance(val, types.ModuleType): if isinstance(val, types.ModuleType):
del self.config[key] del self.config[key]
# replace version info if 'auto'
if self.config['version'] == 'auto' or self.config['revision'] == 'auto':
try:
version, release = get_version_info(srcdirname)
except (IOError, OSError):
print >>warning_stream, 'WARNING: Can\'t get version info from ' \
'Include/patchlevel.h, using version of this interpreter.'
version, release = get_sys_version_info()
if self.config['version'] == 'auto':
self.config['version'] = version
if self.config['release'] == 'auto':
self.config['release'] = release
if confoverrides: if confoverrides:
self.config.update(confoverrides) self.config.update(confoverrides)

56
sphinx/patchlevel.py Normal file
View File

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
"""
sphinx.patchlevel
~~~~~~~~~~~~~~~~~
Extract version info from Include/patchlevel.h.
Adapted from Doc/tools/getversioninfo.
:copyright: 2007 by Georg Brandl.
:license: Python license.
"""
from __future__ import with_statement
import os
import re
import sys
def get_version_info(srcdir):
patchlevel_h = os.path.join(srcdir, '..', "Include", "patchlevel.h")
# This won't pick out all #defines, but it will pick up the ones we
# care about.
rx = re.compile(r"\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)")
d = {}
with open(patchlevel_h) as f:
for line in f:
m = rx.match(line)
if m is not None:
name, value = m.group(1, 2)
d[name] = value
release = version = "%s.%s" % (d["PY_MAJOR_VERSION"], d["PY_MINOR_VERSION"])
micro = int(d["PY_MICRO_VERSION"])
if micro != 0:
release += "." + str(micro)
level = d["PY_RELEASE_LEVEL"]
suffixes = {
"PY_RELEASE_LEVEL_ALPHA": "a",
"PY_RELEASE_LEVEL_BETA": "b",
"PY_RELEASE_LEVEL_GAMMA": "c",
}
if level != "PY_RELEASE_LEVEL_FINAL":
release += suffixes[level] + str(int(d["PY_RELEASE_SERIAL"]))
return version, release
def get_sys_version_info():
major, minor, micro, level, serial = sys.version_info
release = version = '%s.%s' % (major, minor)
if micro:
release += '.%s' % micro
if level != 'final':
release += '%s%s' % (level[0], serial)
return version, release

View File

@ -23,7 +23,7 @@
{% elif builder == 'html' %} {% elif builder == 'html' %}
<li><a href="{{ pathto(sourcename, true)|e }}">Show Source</a></li> <li><a href="{{ pathto(sourcename, true)|e }}">Show Source</a></li>
{% endif %} {% endif %}
<li><a href="http://bugs.python.org/XXX?page={{ sourcename|e }}">Report Bug</a></li> {# <li><a href="http://bugs.python.org/XXX?page={{ sourcename|e }}">Report Bug</a></li> #}
</ul> </ul>
{% endif %} {% endif %}
{% if current_page_name == "index" %} {% if current_page_name == "index" %}