Skip to content

Commit

Permalink
Merged changes from the trunk (rev. 25322):
Browse files Browse the repository at this point in the history
ZopeVersion now know about Subversion
  • Loading branch information
Dmitry Vasiliev committed Jun 10, 2004
0 parents commit 5acffd9
Show file tree
Hide file tree
Showing 2 changed files with 212 additions and 0 deletions.
124 changes: 124 additions & 0 deletions tests/test_zopeversion.py
@@ -0,0 +1,124 @@
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Zope Version Tests
$Id$
"""
import os
import shutil
import tempfile
import unittest

from zope.interface.verify import verifyObject
from zope.app.applicationcontrol.interfaces import IZopeVersion
from zope.app.applicationcontrol.zopeversion import ZopeVersion

class Test(unittest.TestCase):

def setUp(self):
self.tmpdir = tempfile.mkdtemp(prefix="test-zopeversion-")

def tearDown(self):
shutil.rmtree(self.tmpdir)

def prepare(self, version, tag):
if version:
f = open(os.path.join(self.tmpdir, "version.txt"), "w")
f.write(version)
if not version.endswith("\n"):
f.write("\n")
f.close()
if tag:
os.mkdir(os.path.join(self.tmpdir, ".svn"))
f = open(os.path.join(self.tmpdir, ".svn", "entries"), "w")
f.write(tag)
if not tag.endswith("\n"):
f.write("\n")
f.close()

def _Test__new(self):
return ZopeVersion(self.tmpdir)

def test_IVerify(self):
verifyObject(IZopeVersion, self._Test__new())

# In .svn/entries we check only two attributes:
# 'url' - repository path
# 'revision' - checked out revision number

def test_ZopeVersion(self):
self.prepare(None, None)
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(), "Development/Unknown")

def test_ZopeVersion_svntrunk(self):
self.prepare(None, """
url="svn+ssh://svn.zope.org/repos/main/Zope3/trunk/src/zope"
revision="10000"
""")
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(),
"Development/Revision: 10000")

def test_ZopeVersion_svnbranch(self):
self.prepare(None, """
url="svn+ssh://svn.zope.org/repos/main/Zope3/branches/Zope3-1.0/src/zope"
revision="10000"
""")
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(),
"Development/Revision: 10000/Branch: Zope3-1.0")

def test_ZopeVersion_svntag(self):
self.prepare(None, """
url="svn+ssh://svn.zope.org/repos/main/Zope3/tags/Zope3-1.0/src/zope"
revision="10000"
""")
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(),
"Development/Revision: 10000/Tag: Zope3-1.0")

def test_ZopeVersion_svn_unknown(self):
self.prepare(None, "")
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(), "Development/Unknown")

def test_ZopeVersion_release(self):
self.prepare("Zope 3 1.0.0", None)
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(),
"Zope 3 1.0.0")

def test_ZopeVersion_release_empty(self):
self.prepare(" ", None)
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(), "Development/Unknown")

def test_ZopeVersion_release_svntrunk(self):
# demonstrate that the version.txt data is discarded if
# there's revision-control metadata:
self.prepare("Zope 3 1.0.0", """
url="svn+ssh://svn.zope.org/repos/main/Zope3/trunk/src/zope"
revision="10000"
""")
zope_version = self._Test__new()
self.assertEqual(zope_version.getZopeVersion(),
"Development/Revision: 10000")


def test_suite():
return unittest.makeSuite(Test)

if __name__ == '__main__':
unittest.main(defaultTest="test_suite")
88 changes: 88 additions & 0 deletions zopeversion.py
@@ -0,0 +1,88 @@
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Utility to retrieve the Zope version.
$Id$
"""
import os
import re

import zope
from zope.app.applicationcontrol.interfaces import IZopeVersion
from zope.interface import implements

class ZopeVersion(object):
implements(IZopeVersion)

__entries = re.compile(r'(url|revision)\s*=\s*"([^"]+)"')
__tags = re.compile(r'/(tags|branches)/([^/]+)/')

def __init__(self, path=None):
if path is None:
path = os.path.dirname(os.path.abspath(zope.__file__))
self.path = path
self.result = None

def getZopeVersion(self):
"""See zope.app.applicationcontrol.interfaces.IZopeVersion"""
if self.result is not None:
return self.result

self.result = "Development/Unknown"

# is this a SVN checkout?
svndir = os.path.join(self.path, ".svn")
if os.path.isdir(svndir):
self.__setSVNVersion(svndir)
else:
# try to get official Zope release information
versionfile = os.path.join(self.path, "version.txt")
if os.path.isfile(versionfile):
f = file(versionfile)
self.result = f.readline().strip() or self.result
f.close()
return self.result

def __setSVNVersion(self, svndir):
entriesfile = os.path.join(svndir, "entries")

# get the version information
if os.path.isfile(entriesfile):
f = file(entriesfile)
url, revision = "", ""
for line in f:
match = self.__entries.search(line)
if match is not None:
name, value = match.group(1, 2)
if name == "url":
url = value
elif name == "revision":
revision = value
if url and revision:
break
f.close()

if revision and url:
match = self.__tags.search(url)
tag = ""
if match is not None:
type, value = match.group(1, 2)
if type == "tags":
tag = "/Tag: %s" % value
elif type == "branches":
tag = "/Branch: %s" % value
self.result = "Development/Revision: %s%s" \
% (revision, tag)

ZopeVersionUtility = ZopeVersion()

0 comments on commit 5acffd9

Please sign in to comment.