diff options
-rw-r--r-- | libbe/storage/vcs/base.py | 91 | ||||
-rw-r--r-- | libbe/storage/vcs/bzr.py | 92 |
2 files changed, 91 insertions, 92 deletions
diff --git a/libbe/storage/vcs/base.py b/libbe/storage/vcs/base.py index d377398..22874a5 100644 --- a/libbe/storage/vcs/base.py +++ b/libbe/storage/vcs/base.py @@ -521,6 +521,97 @@ class VCS (libbe.storage.base.VersionedStorage): self._version = self._vcs_version() return self._version + def version_cmp(self, *args): + """Compare the installed VCS version `V_i` with another version + `V_o` (given in `*args`). Returns + + === =============== + 1 if `V_i > V_o` + 0 if `V_i == V_o` + -1 if `V_i < V_o` + === =============== + + Examples + -------- + + >>> v = VCS(repo='.') + >>> v._version = '2.3.1 (release)' + >>> v.version_cmp(2,3,1) + 0 + >>> v.version_cmp(2,3,2) + -1 + >>> v.version_cmp(2,3,'a',5) + 1 + >>> v.version_cmp(2,3,0) + 1 + >>> v.version_cmp(2,3,1,'a',5) + 1 + >>> v.version_cmp(2,3,1,1) + -1 + >>> v.version_cmp(3) + -1 + >>> v._version = '2.0.0pre2' + >>> v._parsed_version = None + >>> v.version_cmp(3) + -1 + >>> v.version_cmp(2,0,1) + -1 + >>> v.version_cmp(2,0,0,'pre',1) + 1 + >>> v.version_cmp(2,0,0,'pre',2) + 0 + >>> v.version_cmp(2,0,0,'pre',3) + -1 + >>> v.version_cmp(2,0,0,'a',3) + 1 + >>> v.version_cmp(2,0,0,'rc',1) + -1 + """ + if not hasattr(self, '_parsed_version') \ + or self._parsed_version == None: + num_part = self.version().split(' ')[0] + self._parsed_version = [] + for num in num_part.split('.'): + try: + self._parsed_version.append(int(num)) + except ValueError, e: + # bzr version number might contain non-numerical tags + splitter = re.compile(r'[\D]') # Match non-digits + splits = splitter.split(num) + # if len(tag) > 1 some splits will be empty; remove + splits = filter(lambda s: s != '', splits) + tag_starti = len(splits[0]) + num_starti = num.find(splits[1], tag_starti) + tag = num[tag_starti:num_starti] + self._parsed_version.append(int(splits[0])) + self._parsed_version.append(tag) + self._parsed_version.append(int(splits[1])) + for current,other in zip(self._parsed_version, args): + if type(current) != type (other): + # one of them is a pre-release string + if type(current) != types.IntType: + return -1 + else: + return 1 + c = cmp(current,other) + if c != 0: + return c + # see if one is longer than the other + verlen = len(self._parsed_version) + arglen = len(args) + if verlen == arglen: + return 0 + elif verlen > arglen: + if type(self._parsed_version[arglen]) != types.IntType: + return -1 # self is a prerelease + else: + return 1 + else: + if type(args[verlen]) != types.IntType: + return 1 # args is a prerelease + else: + return -1 + def installed(self): if self.version() != None: return True diff --git a/libbe/storage/vcs/bzr.py b/libbe/storage/vcs/bzr.py index 6b625c2..c01b6c7 100644 --- a/libbe/storage/vcs/bzr.py +++ b/libbe/storage/vcs/bzr.py @@ -40,7 +40,6 @@ import re import shutil import StringIO import sys -import types import libbe import base @@ -68,97 +67,6 @@ class Bzr(base.VCS): return None return bzrlib.__version__ - def version_cmp(self, *args): - """Compare the installed Bazaar version `V_i` with another version - `V_o` (given in `*args`). Returns - - === =============== - 1 if `V_i > V_o` - 0 if `V_i == V_o` - -1 if `V_i < V_o` - === =============== - - Examples - -------- - - >>> b = Bzr(repo='.') - >>> b._version = '2.3.1 (release)' - >>> b.version_cmp(2,3,1) - 0 - >>> b.version_cmp(2,3,2) - -1 - >>> b.version_cmp(2,3,'a',5) - 1 - >>> b.version_cmp(2,3,0) - 1 - >>> b.version_cmp(2,3,1,'a',5) - 1 - >>> b.version_cmp(2,3,1,1) - -1 - >>> b.version_cmp(3) - -1 - >>> b._version = '2.0.0pre2' - >>> b._parsed_version = None - >>> b.version_cmp(3) - -1 - >>> b.version_cmp(2,0,1) - -1 - >>> b.version_cmp(2,0,0,'pre',1) - 1 - >>> b.version_cmp(2,0,0,'pre',2) - 0 - >>> b.version_cmp(2,0,0,'pre',3) - -1 - >>> b.version_cmp(2,0,0,'a',3) - 1 - >>> b.version_cmp(2,0,0,'rc',1) - -1 - """ - if not hasattr(self, '_parsed_version') \ - or self._parsed_version == None: - num_part = self.version().split(' ')[0] - self._parsed_version = [] - for num in num_part.split('.'): - try: - self._parsed_version.append(int(num)) - except ValueError, e: - # bzr version number might contain non-numerical tags - splitter = re.compile(r'[\D]') # Match non-digits - splits = splitter.split(num) - # if len(tag) > 1 some splits will be empty; remove - splits = filter(lambda s: s != '', splits) - tag_starti = len(splits[0]) - num_starti = num.find(splits[1], tag_starti) - tag = num[tag_starti:num_starti] - self._parsed_version.append(int(splits[0])) - self._parsed_version.append(tag) - self._parsed_version.append(int(splits[1])) - for current,other in zip(self._parsed_version, args): - if type(current) != type (other): - # one of them is a pre-release string - if type(current) != types.IntType: - return -1 - else: - return 1 - c = cmp(current,other) - if c != 0: - return c - # see if one is longer than the other - verlen = len(self._parsed_version) - arglen = len(args) - if verlen == arglen: - return 0 - elif verlen > arglen: - if type(self._parsed_version[arglen]) != types.IntType: - return -1 # self is a prerelease - else: - return 1 - else: - if type(args[verlen]) != types.IntType: - return 1 # args is a prerelease - else: - return -1 - def _vcs_get_user_id(self): # excerpted from bzrlib.builtins.cmd_whoami.run() try: |