summaryrefslogtreecommitdiffstats
path: root/src/lib/version.py
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2013-06-06 06:38:30 -0700
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2013-06-06 06:38:30 -0700
commit7e6ede9d0a9ef1d0d2abb87aa361c45c2d3f9911 (patch)
tree12c0156def93c5707eeb0c97c4ec4c6eb426775f /src/lib/version.py
parentfc47d3f057344bf12d2eef1cce9cb986795620a6 (diff)
parentfdaefe7b62e9e61a4ad1d59baee37340d7d5c1ee (diff)
downloadbcfg2-7e6ede9d0a9ef1d0d2abb87aa361c45c2d3f9911.tar.gz
bcfg2-7e6ede9d0a9ef1d0d2abb87aa361c45c2d3f9911.tar.bz2
bcfg2-7e6ede9d0a9ef1d0d2abb87aa361c45c2d3f9911.zip
Merge pull request #82 from gaurdro/maint-1.2
added feature to allow clients to declare their version to server
Diffstat (limited to 'src/lib/version.py')
-rw-r--r--src/lib/version.py115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/lib/version.py b/src/lib/version.py
new file mode 100644
index 000000000..3f9501dda
--- /dev/null
+++ b/src/lib/version.py
@@ -0,0 +1,115 @@
+import re
+
+__version__ = "1.2.4"
+
+class Bcfg2VersionInfo(tuple):
+ v_re = re.compile(r'(\d+)(\w+)(\d+)')
+
+ def __new__(cls, vstr):
+ (major, minor, rest) = vstr.split(".")
+ match = cls.v_re.match(rest)
+ if match:
+ micro, releaselevel, serial = match.groups()
+ else:
+ micro = rest
+ releaselevel = 'final'
+ serial = 0
+ return tuple.__new__(cls, [int(major), int(minor), int(micro),
+ releaselevel, int(serial)])
+
+ def __init__(self, vstr):
+ tuple.__init__(self)
+ self.major, self.minor, self.micro, self.releaselevel, self.serial = \
+ tuple(self)
+
+ def __repr__(self):
+ return "(major=%s, minor=%s, micro=%s, releaselevel=%s, serial=%s)" % \
+ tuple(self)
+
+ def _release_cmp(self, r1, r2):
+ if r1 == r2:
+ return 0
+ elif r1 == "final":
+ return -1
+ elif r2 == "final":
+ return 1
+ elif r1 == "rc":
+ return -1
+ elif r2 == "rc":
+ return 1
+ # should never get to anything past this point
+ elif r1 == "pre":
+ return -1
+ elif r2 == "pre":
+ return 1
+ else:
+ # wtf?
+ return 0
+
+ def __gt__(self, version):
+ if version is None:
+ # older bcfg2 clients didn't report their version, so we
+ # handle this case specially and assume that any reported
+ # version is newer than any indeterminate version
+ return True
+ try:
+ for i in range(3):
+ if self[i] > version[i]:
+ return True
+ elif self[i] < version[i]:
+ return False
+ rel = self._release_cmp(self[3], version[3])
+ if rel < 0:
+ return True
+ elif rel > 0:
+ return False
+ if self[4] > version[4]:
+ return True
+ else:
+ return False
+ except TypeError:
+ return self > Bcfg2VersionInfo(version)
+
+ def __lt__(self, version):
+ if version is None:
+ # older bcfg2 clients didn't report their version, so we
+ # handle this case specially and assume that any reported
+ # version is newer than any indeterminate version
+ return False
+ try:
+ for i in range(3):
+ if self[i] < version[i]:
+ return True
+ elif self[i] > version[i]:
+ return False
+ rel = self._release_cmp(self[3], version[3])
+ if rel > 0:
+ return True
+ elif rel < 0:
+ return False
+ if self[4] < version[4]:
+ return True
+ else:
+ return False
+ except TypeError:
+ return self < Bcfg2VersionInfo(version)
+
+ def __eq__(self, version):
+ if version is None:
+ # older bcfg2 clients didn't report their version, so we
+ # handle this case specially and assume that any reported
+ # version is newer than any indeterminate version
+ return False
+ try:
+ rv = True
+ for i in range(len(self)):
+ rv &= self[i] == version[i]
+ return rv
+ except TypeError:
+ return self == Bcfg2VersionInfo(version)
+
+ def __ge__(self, version):
+ return not self < version
+
+ def __le__(self, version):
+ return not self > version