Expose Subversion revision number (calculated via "svnversion .") to Python.

Add C API function Py_GetBuildNumber(), add it to the interactive prompt
banner (i.e. Py_GetBuildInfo()), and add it as the sys.build_number
attribute.  The build number is a string instead of an int because it may
contain a trailing 'M' if there are local modifications.
This commit is contained in:
Barry Warsaw 2005-12-18 01:27:35 +00:00
parent 11ca77e6de
commit 2a38a86c1c
7 changed files with 32 additions and 4 deletions

View File

@ -272,6 +272,12 @@
\withsubitem{(in module sys)}{\ttindex{version}} \withsubitem{(in module sys)}{\ttindex{version}}
\end{cfuncdesc} \end{cfuncdesc}
\begin{cfuncdesc}{const char*}{Py_GetBuildNumber}{}
Return a string representing the Subversion revision that this Python
executable was built from. This number is a string because it may contain a
trailing 'M' if Python was built from a mixed revision source tree.
\end{cfuncdesc}
\begin{cfuncdesc}{const char*}{Py_GetPlatform}{} \begin{cfuncdesc}{const char*}{Py_GetPlatform}{}
Return the platform identifier for the current platform. On \UNIX, Return the platform identifier for the current platform. On \UNIX,
this is formed from the ``official'' name of the operating system, this is formed from the ``official'' name of the operating system,

View File

@ -27,6 +27,12 @@ It is always available.
\versionadded{2.0} \versionadded{2.0}
\end{datadesc} \end{datadesc}
\begin{datadesc}{build_number}
A string representing the Subversion revision that this Python executable
was built from. This number is a string because it may contain a trailing
'M' if Python was built from a mixed revision source tree.
\end{datadesc}
\begin{datadesc}{builtin_module_names} \begin{datadesc}{builtin_module_names}
A tuple of strings giving the names of all modules that are compiled A tuple of strings giving the names of all modules that are compiled
into this Python interpreter. (This information is not available in into this Python interpreter. (This information is not available in

View File

@ -108,6 +108,7 @@ PyAPI_FUNC(const char *) Py_GetPlatform(void);
PyAPI_FUNC(const char *) Py_GetCopyright(void); PyAPI_FUNC(const char *) Py_GetCopyright(void);
PyAPI_FUNC(const char *) Py_GetCompiler(void); PyAPI_FUNC(const char *) Py_GetCompiler(void);
PyAPI_FUNC(const char *) Py_GetBuildInfo(void); PyAPI_FUNC(const char *) Py_GetBuildInfo(void);
PyAPI_FUNC(const char *) Py_GetBuildNumber(void);
/* Internal -- various one-time initializations */ /* Internal -- various one-time initializations */
PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void);

View File

@ -349,7 +349,9 @@ buildno: $(PARSER_OBJS) \
$(SIGNAL_OBJS) \ $(SIGNAL_OBJS) \
$(MODOBJS) \ $(MODOBJS) \
$(srcdir)/Modules/getbuildinfo.c $(srcdir)/Modules/getbuildinfo.c
if test -f buildno; then \ if test -d .svn; then \
svnversion . >buildno; \
elif test -f buildno; then \
expr `cat buildno` + 1 >buildno1; \ expr `cat buildno` + 1 >buildno1; \
mv -f buildno1 buildno; \ mv -f buildno1 buildno; \
else echo 1 >buildno; fi else echo 1 >buildno; fi
@ -444,7 +446,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
# Special rules for object files # Special rules for object files
Modules/getbuildinfo.o: $(srcdir)/Modules/getbuildinfo.c buildno Modules/getbuildinfo.o: $(srcdir)/Modules/getbuildinfo.c buildno
$(CC) -c $(PY_CFLAGS) -DBUILD=`cat buildno` -o $@ $(srcdir)/Modules/getbuildinfo.c $(CC) -c $(PY_CFLAGS) -DBUILD=\"`cat buildno`\" -o $@ $(srcdir)/Modules/getbuildinfo.c
Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile
$(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \

View File

@ -12,6 +12,10 @@ What's New in Python 2.5 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- Patch #1382163: Expose Subversion revision number to Python. New C API
function Py_GetBuildNumber(). New attribute sys.build_number. Build number
is now displayed in interactive prompt banner.
- Implementation of PEP 341 - Unification of try/except and try/finally. - Implementation of PEP 341 - Unification of try/except and try/finally.
"except" clauses can now be written together with a "finally" clause in "except" clauses can now be written together with a "finally" clause in
one try statement instead of two nested ones. Patch #1355913. one try statement instead of two nested ones. Patch #1355913.

View File

@ -21,7 +21,7 @@
#endif #endif
#ifndef BUILD #ifndef BUILD
#define BUILD 0 #define BUILD "0"
#endif #endif
const char * const char *
@ -29,6 +29,12 @@ Py_GetBuildInfo(void)
{ {
static char buildinfo[50]; static char buildinfo[50];
PyOS_snprintf(buildinfo, sizeof(buildinfo), PyOS_snprintf(buildinfo, sizeof(buildinfo),
"#%d, %.20s, %.9s", BUILD, DATE, TIME); "%s, %.20s, %.9s", BUILD, DATE, TIME);
return buildinfo; return buildinfo;
} }
const char *
Py_GetBuildNumber(void)
{
return BUILD;
}

View File

@ -1003,6 +1003,9 @@ _PySys_Init(void)
PyDict_SetItemString(sysdict, "hexversion", PyDict_SetItemString(sysdict, "hexversion",
v = PyInt_FromLong(PY_VERSION_HEX)); v = PyInt_FromLong(PY_VERSION_HEX));
Py_XDECREF(v); Py_XDECREF(v);
PyDict_SetItemString(sysdict, "build_number",
v = PyString_FromString(Py_GetBuildNumber()));
Py_XDECREF(v);
/* /*
* These release level checks are mutually exclusive and cover * These release level checks are mutually exclusive and cover
* the field, so don't get too fancy with the pre-processor! * the field, so don't get too fancy with the pre-processor!