diff --git a/AUTHORS b/AUTHORS index bda8efe77ef..bc5c44b3351 100644 --- a/AUTHORS +++ b/AUTHORS @@ -136,6 +136,7 @@ answer newbie questions, and generally made Django that much better: Joe Heck Joel Heenan hipertracker@gmail.com + Deryck Hodge Brett Hoerner Ian Holsman Kieran Holland diff --git a/django/__init__.py b/django/__init__.py index 17d8c519ccf..de473fa4e9e 100644 --- a/django/__init__.py +++ b/django/__init__.py @@ -4,5 +4,6 @@ def get_version(): "Returns the version as a human-format string." v = '.'.join([str(i) for i in VERSION[:-1]]) if VERSION[-1]: - v += '-' + VERSION[-1] + from django.utils.version import get_svn_revision + v = '%s-%s-%s' % (v, VERSION[-1], get_svn_revision()) return v diff --git a/django/utils/version.py b/django/utils/version.py new file mode 100644 index 00000000000..dd8345d8d2f --- /dev/null +++ b/django/utils/version.py @@ -0,0 +1,33 @@ +import django +import os.path +import re + +def get_svn_revision(): + """ + Returns the SVN revision in the form SVN-XXXX, + where XXXX is the revision number. + + Returns SVN-unknown if anything goes wrong, such as an unexpected + format of internal SVN files. + """ + rev = None + entries_path = '%s/.svn/entries' % django.__path__[0] + + if os.path.exists(entries_path): + entries = open(entries_path, 'r').read() + # Versions >= 7 of the entries file are flat text. The first line is + # the version number. The next set of digits after 'dir' is the revision. + if re.match('(\d+)', entries): + rev_match = re.search('\d+\s+dir\s+(\d+)', entries) + if rev_match: + rev = rev_match.groups()[0] + # Older XML versions of the file specify revision as an attribute of + # the first entries node. + else: + from xml.dom import minidom + dom = minidom.parse(entries_path) + rev = dom.getElementsByTagName('entry')[0].getAttribute('revision') + + if rev: + return u'SVN-%s' % rev + return u'SVN-unknown'