[tor-commits] [gettor/master] Make GetTor packaging a bit more intelligent
kaner at torproject.org
kaner at torproject.org
Sat Sep 3 12:35:54 UTC 2011
commit 23896d40da89538c4133e9192e726a593f8e6859
Author: Christian Fromme <kaner at strace.org>
Date: Tue Aug 30 16:12:42 2011 +0200
Make GetTor packaging a bit more intelligent
- If we see more than one version of a package:
- Throw out -alpha versions
- Throw out -beta versions
- Throw out -rc versions
- Look up the latest version
---
lib/gettor/packages.py | 92 +++++++++++++++++++++++++++++++++++++++++++++++-
lib/gettor/utils.py | 11 ++++++
2 files changed, 102 insertions(+), 1 deletions(-)
diff --git a/lib/gettor/packages.py b/lib/gettor/packages.py
index c3dbe65..9d42b55 100644
--- a/lib/gettor/packages.py
+++ b/lib/gettor/packages.py
@@ -12,6 +12,48 @@ import gettor.utils
import re
import glob
+# Stolen from Mike's TorCtl:
+class RouterVersion:
+ """ Represents a Router's version. Overloads all comparison operators
+ to check for newer, older, or equivalent versions. """
+ def __init__(self, version):
+ if version:
+ v = re.search("(\d+)\.(\d+)\.(\d+)\.(\d+)", version).groups()
+ self.version = int(v[0])*0x1000000 + int(v[1])*0x10000 + int(v[2])*0x100 + int(v[3])
+ self.ver_string = version
+ else:
+ self.version = version
+ self.ver_string = "unknown"
+
+ def __lt__(self, other): return self.version < other.version
+ def __gt__(self, other): return self.version > other.version
+ def __ge__(self, other): return self.version >= other.version
+ def __le__(self, other): return self.version <= other.version
+ def __eq__(self, other): return self.version == other.version
+ def __ne__(self, other): return self.version != other.version
+ def __str__(self): return self.ver_string
+
+class TBBVersion:
+ """ Represents a TBB's version. Overloads all comparison operators
+ to check for newer, older, or equivalent versions. """
+ def __init__(self, version):
+ if version:
+ v = re.search("(\d+)\.(\d+)\.(\d+)", version).groups()
+ self.version = int(v[0])*0x10000 + int(v[1])*0x100 + int(v[2])
+ self.ver_string = version
+ else:
+ self.version = version
+ self.ver_string = "unknown"
+
+ def __lt__(self, other): return self.version < other.version
+ def __gt__(self, other): return self.version > other.version
+ def __ge__(self, other): return self.version >= other.version
+ def __le__(self, other): return self.version <= other.version
+ def __eq__(self, other): return self.version == other.version
+ def __ne__(self, other): return self.version != other.version
+ def __str__(self): return self.ver_string
+
+
class Packages:
def __init__(self, config, silent=False):
@@ -32,7 +74,55 @@ class Packages:
fileName = os.path.join(self.distDir, regex)
fileList = glob.glob(fileName)
if len(fileList) != 1:
- return ""
+ # Looks like we have more than one file to choose from. Great.
+ # Let's do some more or less intelligent tricks.
+
+ # Remove all alphas
+ fileList = gettor.utils.removeFromListByRegex(fileList, "-alpha")
+ if len(fileList) == 1:
+ return fileList[0]
+
+ # Remove all betas
+ fileList = gettor.utils.removeFromListByRegex(fileList, "-beta")
+ if len(fileList) == 1:
+ return fileList[0]
+
+ # Remove all release candidates
+ fileList = gettor.utils.removeFromListByRegex(fileList, "-rc")
+ if len(fileList) == 1:
+ return fileList[0]
+
+ # Still more than 1 file? Look at the version strings.
+ r = RouterVersion("0.0.0.0")
+ ret = None
+ for f in fileList:
+ try:
+ if RouterVersion(f) > r:
+ r = RouterVersion(f)
+ ret = f
+ except:
+ return ""
+
+ if ret is not None:
+ logging.debug("Of the list %s, I return %s" % (fileList, ret))
+ return ret
+
+ # Still no result? Sort by TBB versions
+ r = TBBVersion("0.0.0")
+ ret = None
+ for f in fileList:
+ try:
+ if TBBVersion(f) > r:
+ r = TBBVersion(f)
+ ret = f
+ except:
+ return ""
+
+ if ret is not None:
+ logging.debug("Of the list %s, I return %s" % (fileList, ret))
+ return ret
+
+ return ""
return fileList[0]
diff --git a/lib/gettor/utils.py b/lib/gettor/utils.py
index f29ddf6..d7f0725 100644
--- a/lib/gettor/utils.py
+++ b/lib/gettor/utils.py
@@ -289,3 +289,14 @@ def getHash(string):
"""Return hash of given string
"""
return str(hashlib.sha1(string).hexdigest())
+
+def removeFromListByRegex(l, string):
+ """Remove entries from a list that match a certain regular expression
+ """
+ for f in l:
+ m = re.search(string, f)
+ if m:
+ l.remove(f)
+
+ return l
+
More information about the tor-commits
mailing list