aboutsummaryrefslogtreecommitdiffstats
path: root/libbe
diff options
context:
space:
mode:
authorW. Trevor King <wking@drexel.edu>2011-09-07 22:47:14 -0400
committerW. Trevor King <wking@drexel.edu>2011-09-07 22:53:21 -0400
commitd5e6385f6fa162a4f41219d4f523cc27446defcd (patch)
tree5fd7fd12353ccd1a1446f69ce613409132ded185 /libbe
parentb004702a025814290d10403e0de0c296617ebf68 (diff)
downloadbugseverywhere-d5e6385f6fa162a4f41219d4f523cc27446defcd.tar.gz
Move Bzr.version_cmp to VCS.version_cmp.
The version comparison code will be useful for all VCSs.
Diffstat (limited to 'libbe')
-rw-r--r--libbe/storage/vcs/base.py91
-rw-r--r--libbe/storage/vcs/bzr.py92
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: