\versionadded{2.0}
\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.
+\begin{datadesc}{subversion}
+ A triple (repo, branch, version) representing the Subversion
+ information of the Python interpreter.
+ \var{repo} is the name of the repository, \code{'CPython'}.
+ \var{branch} is the a string of one of the forms \code{'trunk'},
+ \code{'branches/name'} or \code{'tags/name'}.
+ \var{version} is the output of \code{svnversion}, if the
+ interpreter was built from a Subversion checkout; it contains
+ the revision number (range) and possibly a trailing 'M' if
+ there were local modifications. If the tree was exported
+ (or svnversion was not available), it is the revision of
+ \code{Include/patchlevel.h} if the branch is a tag. Otherwise,
+ it is \code{None}.
\versionadded{2.5}
\end{datadesc}
#endif
#endif
-static const char revision[] = "$Revision$";
-static const char headurl[] = "$HeadURL$";
-
const char *
Py_GetBuildInfo(void)
{
static char buildinfo[50];
-#ifdef SVNVERSION
- static char svnversion[50] = SVNVERSION;
-#else
- static char svnversion[50] = "exported";
-#endif
- if (strcmp(svnversion, "exported") == 0 &&
- strstr(headurl, "/tags/") != NULL) {
- int start = 11;
- int stop = strlen(revision)-2;
- strncpy(svnversion, revision+start, stop-start);
- svnversion[stop-start] = '\0';
- }
+ char *revision = Py_SubversionRevision();
+ char *sep = revision ? ":" : "";
+ char *branch = Py_SubversionShortBranch();
PyOS_snprintf(buildinfo, sizeof(buildinfo),
- "%s, %.20s, %.9s", svnversion, DATE, TIME);
+ "%s%s%s, %.20s, %.9s", branch, sep, revision,
+ DATE, TIME);
return buildinfo;
}
const char *
-Py_GetBuildNumber(void)
+_Py_svnversion(void)
{
- return "0";
+#ifdef SVNVERSION
+ return SVNVERSION;
+#else
+ return "exported";
+#endif
}
return fflush (stream) || prev_fail ? EOF : 0;
}
+/* Subversion branch and revision management */
+static const char _patchlevel_revision[] = PY_PATCHLEVEL_REVISION;
+static const char headurl[] = "$HeadURL$";
+static int svn_initialized;
+static char patchlevel_revision[50]; /* Just the number */
+static char branch[50];
+static char shortbranch[50];
+static const char *svn_revision;
+
+static void svnversion_init(void)
+{
+ const char *python, *br_start, *br_end, *br_end2, *svnversion;
+ int len, istag;
+
+ if (svn_initialized)
+ return;
+
+ python = strstr(headurl, "/python/");
+ if (!python)
+ Py_FatalError("subversion keywords missing");
+
+ br_start = python + 8;
+ br_end = strchr(br_start, '/');
+ /* Works even for trunk,
+ as we are in trunk/Python/sysmodule.c */
+ br_end2 = strchr(br_end+1, '/');
+
+ istag = strncmp(br_start, "tags", 4) == 0;
+ if (strncmp(br_start, "trunk", 5) == 0) {
+ strcpy(branch, "trunk");
+ strcpy(shortbranch, "trunk");
+
+ }
+ else if (istag || strncmp(br_start, "branches", 8) == 0) {
+ len = br_end2 - br_start;
+ strncpy(branch, br_start, len);
+ branch[len] = '\0';
+
+ len = br_end2 - (br_end + 1);
+ strncpy(shortbranch, br_end + 1, len);
+ shortbranch[len] = '\0';
+ }
+ else {
+ Py_FatalError("bad HeadURL");
+ return;
+ }
+
+
+ svnversion = _Py_svnversion();
+ if (strcmp(svnversion, "exported") != 0)
+ svn_revision = svnversion;
+ else if (istag) {
+ len = strlen(_patchlevel_revision);
+ strncpy(patchlevel_revision, _patchlevel_revision + 11,
+ len - 13);
+ patchlevel_revision[len - 13] = '\0';
+ svn_revision = patchlevel_revision;
+ }
+ else
+ svn_revision = "";
+
+ svn_initialized = 1;
+}
+
+/* Return svnversion output if available.
+ Else return Revision of patchlevel.h if on branch.
+ Else return empty string */
+const char*
+Py_SubversionRevision()
+{
+ svnversion_init();
+ return svn_revision;
+}
+
+const char*
+Py_SubversionShortBranch()
+{
+ svnversion_init();
+ return shortbranch;
+}
+
PyObject *
_PySys_Init(void)
{
PyDict_SetItemString(sysdict, "hexversion",
v = PyInt_FromLong(PY_VERSION_HEX));
Py_XDECREF(v);
- PyDict_SetItemString(sysdict, "build_number",
- v = PyString_FromString(Py_GetBuildNumber()));
+ svnversion_init();
+ v = Py_BuildValue("(ssz)", "CPython", branch, svn_revision);
+ PyDict_SetItemString(sysdict, "subversion", v);
Py_XDECREF(v);
/*
* These release level checks are mutually exclusive and cover