mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2024-12-31 18:27:00 +00:00
130 lines
3.6 KiB
Python
130 lines
3.6 KiB
Python
|
# Copyright (c) 2004-2007 Bryce "Zooko" Wilcox-O'Hearn
|
||
|
# mailto:zooko@zooko.com
|
||
|
# http://zooko.com/repos/pyutil
|
||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
# of this work to deal in this work without restriction (including the rights
|
||
|
# to use, modify, distribute, sublicense, and/or sell copies).
|
||
|
|
||
|
"""
|
||
|
extended version number class
|
||
|
"""
|
||
|
|
||
|
from distutils import version
|
||
|
|
||
|
# End users see version strings like this:
|
||
|
|
||
|
# "1.0.0"
|
||
|
# ^ ^ ^
|
||
|
# | | |
|
||
|
# | | '- micro version number
|
||
|
# | '- minor version number
|
||
|
# '- major version number
|
||
|
|
||
|
# The first number is "major version number". The second number is the "minor
|
||
|
# version number" -- it gets bumped whenever we make a new release that adds or
|
||
|
# changes functionality. The third version is the "micro version number" -- it
|
||
|
# gets bumped whenever we make a new release that doesn't add or change
|
||
|
# functionality, but just fixes bugs (including performance issues).
|
||
|
|
||
|
# Early-adopter end users see version strings like this:
|
||
|
|
||
|
# "1.0.0a1"
|
||
|
# ^ ^ ^^^
|
||
|
# | | |||
|
||
|
# | | ||'- release number
|
||
|
# | | |'- alpha or beta (or none)
|
||
|
# | | '- micro version number
|
||
|
# | '- minor version number
|
||
|
# '- major version number
|
||
|
|
||
|
# The optional "a" or "b" stands for "alpha release" or "beta release"
|
||
|
# respectively. The number after "a" or "b" gets bumped every time we
|
||
|
# make a new alpha or beta release. This has the same form and the same
|
||
|
# meaning as version numbers of releases of Python.
|
||
|
|
||
|
# Developers see "full version strings", like this:
|
||
|
|
||
|
# "1.0.0a1-55-UNSTABLE"
|
||
|
# ^ ^ ^^^ ^ ^
|
||
|
# | | ||| | |
|
||
|
# | | ||| | '- tags
|
||
|
# | | ||| '- nano version number
|
||
|
# | | ||'- release number
|
||
|
# | | |'- alpha or beta (or none)
|
||
|
# | | '- micro version number
|
||
|
# | '- minor version number
|
||
|
# '- major version number
|
||
|
|
||
|
# The next number is the "nano version number". It is meaningful only to
|
||
|
# developers. It gets bumped whenever a developer changes anything that another
|
||
|
# developer might care about.
|
||
|
|
||
|
# The last part is the "tags" separated by "_". Standard tags are
|
||
|
# "STABLE" and "UNSTABLE".
|
||
|
|
||
|
class Tag(str):
|
||
|
def __cmp__(t1, t2):
|
||
|
if t1 == t2:
|
||
|
return 0
|
||
|
if t1 == "UNSTABLE" and t2 == "STABLE":
|
||
|
return 1
|
||
|
if t1 == "STABLE" and t2 == "UNSTABLE":
|
||
|
return -1
|
||
|
return -2 # who knows
|
||
|
|
||
|
class Version:
|
||
|
def __init__(self, vstring=None):
|
||
|
if vstring:
|
||
|
self.parse(vstring)
|
||
|
|
||
|
def parse(self, vstring):
|
||
|
i = vstring.find('-')
|
||
|
if i:
|
||
|
svstring = vstring[:i]
|
||
|
estring = vstring[i+1:]
|
||
|
else:
|
||
|
svstring = vstring
|
||
|
estring = None
|
||
|
|
||
|
self.strictversion = version.StrictVersion(svstring)
|
||
|
|
||
|
if estring:
|
||
|
try:
|
||
|
(self.nanovernum, tags,) = estring.split('-')
|
||
|
except:
|
||
|
print estring
|
||
|
raise
|
||
|
self.tags = map(Tag, tags.split('_'))
|
||
|
self.tags.sort()
|
||
|
|
||
|
self.fullstr = '-'.join([str(self.strictversion), str(self.nanovernum), '_'.join(self.tags)])
|
||
|
|
||
|
def tags(self):
|
||
|
return self.tags
|
||
|
|
||
|
def user_str(self):
|
||
|
return self.strictversion.__str__()
|
||
|
|
||
|
def full_str(self):
|
||
|
return self.fullstr
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.full_str()
|
||
|
|
||
|
def __repr__(self):
|
||
|
return self.__str__()
|
||
|
|
||
|
def __cmp__ (self, other):
|
||
|
if isinstance(other, basestring):
|
||
|
other = Version(other)
|
||
|
|
||
|
res = cmp(self.strictversion, other.strictversion)
|
||
|
if res != 0:
|
||
|
return res
|
||
|
|
||
|
res = cmp(self.nanovernum, other.nanovernum)
|
||
|
if res != 0:
|
||
|
return res
|
||
|
|
||
|
return cmp(self.tags, other.tags)
|