diff options
-rw-r--r-- | Makefile | 2 | ||||
-rwxr-xr-x | cnucnu.py | 84 | ||||
-rw-r--r-- | cnucnu/bugzilla_reporter.py | 123 | ||||
-rw-r--r-- | cnucnu/checkshell.py | 55 | ||||
-rwxr-xr-x | cnucnu/cvs.py | 4 | ||||
-rw-r--r-- | cnucnu/helper.py | 33 | ||||
-rwxr-xr-x | cnucnu/html_reporter.py | 35 | ||||
-rw-r--r-- | cnucnu/package_list.py | 141 | ||||
-rwxr-xr-x | cnucnu/tests/helper_test.py | 100 | ||||
-rwxr-xr-x | runtests.sh | 1 |
10 files changed, 317 insertions, 261 deletions
@@ -1,6 +1,6 @@ html: FORCE rm -rf html - epydoc --builtins --html --no-private --output html -v cnucnu/ + epydoc --html --no-private --output html -v cnucnu/ #find -type f -name "*.html" -print0 | xargs -0 sed -i 's,"encoding=iso8859-1",encoding="utf-8",' view: html @@ -20,57 +20,16 @@ import sys import os -from cnucnu.config import Config +from cnucnu.config import global_config from cnucnu.package_list import Repository, PackageList, Package from cnucnu.checkshell import CheckShell from cnucnu.bugzilla_reporter import BugzillaReporter +from cnucnu.cvs import CVS import pprint as pprint_module pp = pprint_module.PrettyPrinter(indent=4) pprint = pp.pprint -import pickle - -def analyse_packages(packages): - package_nr = 0 - - if package_nr == 0: - mode = "w" - else: - mode = "a" - - - outdated_f = open("cnucnu-outdated.log", mode) - too_new_f = open("cnucnu-too_new.log", mode) - error_f = open("cnucnu-error.log", mode) - - for package in packages[package_nr:]: - sys.stderr.write("Testing: %i - %s\n" % (package_nr, package.name)) - - try: - if package.upstream_newer: - print "Outdated package %(name)s: Rawhide version: %(repo_version)s, Upstream latest: %(latest_upstream)s" % package - outdated_f.write("%(name)s %(repo_version)s %(latest_upstream)s\n" % package) - elif package.repo_newer: - print "Rawhide newer %(name)s: Rawhide version: %(repo_version)s, Upstream latest: %(latest_upstream)s" % package - too_new_f.write("%(name)s %(repo_version)s %(latest_upstream)s\n" % package) - - except cc_errors.UpstreamVersionRetrievalError, e: - sys.stderr.write("%s\n" % str(e)) - sys.stderr.write("Rawhide Version: %s\n" % package.repo_version) - error_f.write("%s: %s - Rawhide Version: %s\n" % (package.name, str(e), package.repo_version)) - except KeyError, ke: - sys.stderr.write("Package not found in Rawhide: %s\n" % str(ke)) - - package_nr = package_nr + 1 - - outdated_f.close() - too_new_f.close() - error_f.close() - pickle_file = open("data.pickle", "wb") - pickle.dump(packages, pickle_file) - pickle_file.close() - if __name__ == '__main__': import re import cnucnu.errors as cc_errors @@ -88,10 +47,8 @@ if __name__ == '__main__': (options, args) = parser.parse_args() - config = Config() - if options.action == "dump-default-config": - sys.stdout.write(config.yaml) + sys.stdout.write(global_config.yaml) sys.exit(0) yaml_file = options.config_filename @@ -101,35 +58,35 @@ if __name__ == '__main__': yaml_file = new_yaml_file if yaml_file: - config.update_yaml_file(yaml_file) + global_config.update_yaml_file(yaml_file) if options.action == "dump-config": - sys.stdout.write(config.yaml) + sys.stdout.write(global_config.yaml) sys.exit(0) if options.action == "shell": - shell = CheckShell(config=config) + shell = CheckShell(config=global_config) while True: - try: - if not shell.cmdloop(): - break - except Exception, ex: - print 'Exception occured:' - print repr(ex) + if not shell.cmdloop(): break + elif options.action == "create-bugs": - bugzilla_config = config.bugzilla_config - br = BugzillaReporter(bugzilla_config) + br = BugzillaReporter(global_config.bugzilla_config) + repo = Repository(**global_config.config["repo"]) + cvs = CVS(**global_config.config["cvs"]) - repo = Repository(**config.config["repo"]) - pl = PackageList(repo=repo, **config.config["package list"]) + outdated = [] + + pl = PackageList(repo=repo, cvs=cvs, br=br, **global_config.config["package list"]) for p in pl: print "testing: %s" % p.name try: if p.upstream_newer: - br.report_outdated(p, dry_run=options.dry_run) + pprint(p.report_outdated(dry_run=options.dry_run)) except Exception, e: pprint(e) + + elif options.action == "fm-outdated-all": print "checking all against FM" repo = Repository() @@ -138,10 +95,3 @@ if __name__ == '__main__': packages = PackageList(packages=pl) repo.package_list = packages analyse_packages(packages) - - else: - print "default..." - repo = Repository() - plist = PackageList(repo=repo) - packages = plist.packages - analyse_packages(packages) diff --git a/cnucnu/bugzilla_reporter.py b/cnucnu/bugzilla_reporter.py index 7c67640..7dd37fc 100644 --- a/cnucnu/bugzilla_reporter.py +++ b/cnucnu/bugzilla_reporter.py @@ -18,10 +18,9 @@ # }}} from bugzilla import Bugzilla -from config import Config +from config import global_config from helper import filter_dict from helper import pprint -from cvs import CVS class BugzillaReporter(object): base_query = {'query_format': ['advanced'], 'emailreporter1': ['1'], 'emailtype1': ['exact']} @@ -37,13 +36,9 @@ class BugzillaReporter(object): # 'status': 'ASSIGNED', } - def __init__(self, config): - rpc_conf = filter_dict(config, ["url", "user", "password"]) - bz = Bugzilla(**rpc_conf) - self.bz = bz + def __init__(self, config=global_config.bugzilla_config): + self._bz = None - if "password" in rpc_conf and rpc_conf["password"]: - self.bz.login() self.config = config self.base_query['product'] = config['product'] @@ -54,7 +49,16 @@ class BugzillaReporter(object): self.new_bug['version'] = config['version'] self.bugzilla_username = config['user'] - self.cvs = CVS() + + @property + def bz(self): + if not self._bz: + rpc_conf = filter_dict(self.config, ["url", "user", "password"]) + self._bz = Bugzilla(**rpc_conf) + if "password" in rpc_conf and rpc_conf["password"]: + self._bz.login() + return self._bz + def bug_url(self, bug): @@ -65,72 +69,69 @@ class BugzillaReporter(object): return "%s%s" % (self.config['bug url prefix'], bug_id) - def create_new_bug(self, package, dry_run=True): - bug = {'component': package.name, + def report_outdated(self, package, dry_run=True): + if not package.exact_outdated_bug: + if not package.open_outdated_bug: + new_bug, change_status = self.create_outdated_bug(package, dry_run) + else: + open_bug = package.open_outdated_bug + summary = open_bug.summary + + # summary should be '<name>-<version> <some text>' + # To extract the version get everything before the first space + # with split and then remove the name and '-' via slicing + bug_version = summary.split(" ")[0][len(package.name)+1:] + + if bug_version != package.latest_upstream: + update = {'short_desc': self.config["summary template"] % package, + 'comment': self.config["description template"] % package + } + print repr(update) + res = self.bz._update_bugs(open_bug.bug_id, update) + print res + return res + else: + bug = package.exact_outdated_bug + print "bug already filed:%s %s" % (self.bug_url(bug), bug.bug_status) + + + def create_outdated_bug(self, package, dry_run=True): + bug_dict = {'component': package.name, 'summary': self.config["summary template"] % package, 'description': self.config["description template"] % package } - bug.update(self.new_bug) + bug_dict.update(self.new_bug) if not dry_run: new_bug = self.bz.createbug(**bug) - return new_bug + status = self.config['bug status'] + change_status = None + if status != "NEW": + change_status = self.bz._proxy.bugzilla.changeStatus(new_bug.bug_id, status, self.config['user'], "", "", False, False, 1) + print "status changed", change_status + return (new_bug, change_status) else: - return bug + return bug_dict - - def report_outdated(self, package, dry_run=True): - if package.upstream_newer: - if self.cvs.has_upstream_version(package): - print "Upstream Version found in CVS, skipping bug report: %(name)s U:%(latest_upstream)s R:%(repo_version)s" % package - return False - - matching_bugs = self.get_bug(package) - # TODO: warning in case of more than one matching bug, then something is wrong - if not matching_bugs: - open = self.get_open(package) - if not open: - new_bug = self.create_new_bug(package, dry_run) - if not dry_run: - status = self.config['bug status'] - if status != "NEW": - change_status = self.bz._proxy.bugzilla.changeStatus(new_bug.bug_id, status, self.config['user'], "", "", False, False, 1) - print "status changed", change_status - print self.bug_url(new_bug) - else: - pprint(new_bug) - else: - open_bug = open[0] - summary = open_bug.summary - - # summary should be '<name>-<version> <some text>' - # To extract the version get everything before the first space - # with split and then remove the name and '-' via slicing - bug_version = summary.split(" ")[0][len(package.name)+1:] - - if bug_version != package.latest_upstream: - update = {'short_desc': self.config["summary template"] % package, - 'comment': self.config["description template"] % package - } - print repr(update) - res = self.bz._update_bugs(open_bug.bug_id, update) - print res - return res - else: - for bug in matching_bugs: - print "bug already filed:%s %s" % (self.bug_url(bug), bug.bug_status) - - def get_bug(self, package): + def get_exact_outdated_bug(self, package): + summary_pattern = '%(name)s-%(latest_upstream)s ' % package q = {'component': [package.name], 'bug_status': self.bug_status_open + self.bug_status_closed, - 'short_desc': ['%(name)s-%(latest_upstream)s' % package], + 'short_desc': [summary_pattern], 'short_desc_type': ['substring'] } q.update(self.base_query) - bugs = self.bz.query(q) - return bugs + # TODO if more than one bug, manual intervention is required + bug = self.bz.query(q)[0] + + # The summary_pattern contains a space at the end, which is currently + # not recognized by bugzilla. Therefore this test is required: + if bug.summary.startswith(summary_pattern): + return bug + else: + return None - def get_open(self, package): + def get_open_outdated_bug(self, package): q = {'component': [package.name], 'bug_status': self.bug_status_open } diff --git a/cnucnu/checkshell.py b/cnucnu/checkshell.py index cff18f2..8f6f9b5 100644 --- a/cnucnu/checkshell.py +++ b/cnucnu/checkshell.py @@ -23,12 +23,14 @@ import readline from package_list import Package, PackageList, Repository from bugzilla_reporter import BugzillaReporter +from helper import pprint from cvs import CVS class CheckShell(cmd.Cmd): def __init__(self, config): cmd.Cmd.__init__(self) readline.set_completer_delims(' ') + self.repo = Repository() self.package = Package("", None, None, self.repo) self._package_list = None @@ -49,11 +51,12 @@ class CheckShell(cmd.Cmd): @property def br(self): if not self._br: + bugzilla_config = self.config.bugzilla_config try: - bugzilla_config = self.config.bugzilla_config self._br = BugzillaReporter(bugzilla_config) + except Exception, e: - print "Cannot query bugzilla, maybe config is faulty or missing", e + print "Cannot query bugzilla, maybe config is faulty or missing", repr(e), dict(e), str(e) return self._br def update_prompt(self): @@ -76,7 +79,7 @@ class CheckShell(cmd.Cmd): self.package.url = "FM-DEFAULT" def do_report(self, args): - self.br.report_outdated(self.package, dry_run=False) + pprint(self.package.report_outdated(dry_run)) def do_inspect(self, args): try: @@ -116,34 +119,22 @@ class CheckShell(cmd.Cmd): self.update_prompt() if self.package.url and self.package.regex: - try: - print "Versions:", self.package.upstream_versions - print "Latest:", self.package.latest_upstream - if self.package.name: - if self.package.status: - status = " %s" % self.package.status - else: - status = "" - print "Repo Version: %s%s" % (self.package.repo_version, status) - - if self.package.upstream_newer: - if self.cvs: - sourcefile = self.cvs.has_upstream_version(self.package) - if sourcefile: - print "Found in CVS:", sourcefile - else: - print "Not Found in CVS" - - if self.br: - bugs = self.br.get_open(self.package) - if bugs: - for bug in bugs: - print "Open Bug:", "%s %s:%s" % (self.br.bug_url(bug), bug.bug_status, bug.summary) - bugs = self.br.get_bug(self.package) - if bugs: - for bug in bugs: - print "Matching Bug:", "%s %s:%s" % (self.br.bug_url(bug), bug.bug_status, bug.summary) - except Exception, e: - print e + print "Upstream Versions:", self.package.upstream_versions + print "Latest:", self.package.latest_upstream + + if self.package.name: + print "%(repo_name)s Version: %(repo_version)s %(repo_release)s %(status)s" % self.package + + sourcefile = self.package.upstream_version_in_cvs + if sourcefile: + print "Found in CVS:", sourcefile + else: + print "Not Found in CVS" + bug = self.package.exact_outdated_bug + if bug: + print "Exact Bug:", "%s %s:%s" % (self.br.bug_url(bug), bug.bug_status, bug.summary) + bug = self.package.open_outdated_bug + if bug: + print "Open Bug:", "%s %s:%s" % (self.br.bug_url(bug), bug.bug_status, bug.summary) return stop diff --git a/cnucnu/cvs.py b/cnucnu/cvs.py index bc19d93..e4e4fb1 100755 --- a/cnucnu/cvs.py +++ b/cnucnu/cvs.py @@ -22,13 +22,13 @@ import pycurl import StringIO from helper import secure_download -from config import Config +from config import global_config class CVS(object): """ cainfo: filename :-/ """ def __init__(self, viewvc_url="", cainfo=""): - defaults = Config().config["cvs"] + defaults = global_config.config["cvs"] if not viewvc_url: viewvc_url = defaults["viewvc_url"] diff --git a/cnucnu/helper.py b/cnucnu/helper.py index 70b31d5..f6dfb1b 100644 --- a/cnucnu/helper.py +++ b/cnucnu/helper.py @@ -55,7 +55,7 @@ def rpm_max(list): list.sort(cmp=rpm_cmp) return list[-1] -def cnucnu_cmp(v1, v2): +def upstream_cmp(v1, v2): import rpm v1, rc1 = split_rc(v1) @@ -82,18 +82,39 @@ def cnucnu_cmp(v1, v2): def split_rc(version): import re - RC = re.compile("([^-rp]*)(-?(rc|pre)([0-9]))?") + RC = re.compile("([^-rp]*)(-?(([Rr][Cc]|[Pp][Rr][Ee])[0-9]))?") match = RC.match(version) v = match.groups()[0] - rc = match.groups()[3] + rc = match.groups()[2] + if rc: + return (v, rc) + else: + return (v, "") + +def get_rc(release): + import re + RC = re.compile(r'0\.[0-9]*\.(([Rr][Cc]|[Pp][Rr][Ee])[0-9])') + match = RC.match(release) - return (v, rc) + if match: + rc = match.groups()[0] + return rc + else: + return "" -def cnucnu_max(list): - list.sort(cmp=cnucnu_cmp) +def upstream_max(list): + list.sort(cmp=upstream_cmp) return list[-1] +def cmp_upstream_repo(upstream_v, repo_vr): + repo_rc = get_rc(repo_vr[1]) + + repo_version = "%s%s" % (repo_vr[0], repo_rc) + + return upstream_cmp(upstream_v, repo_version) + + """ return a dict that only contains keys that are in key_list """ diff --git a/cnucnu/html_reporter.py b/cnucnu/html_reporter.py new file mode 100755 index 0000000..12514ce --- /dev/null +++ b/cnucnu/html_reporter.py @@ -0,0 +1,35 @@ +#!/usr/bin/python +# vim: fileencoding=utf8 foldmethod=marker +# {{{ License header: GPLv2+ +# This file is part of cnucnu. +# +# Cnucnu is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# Cnucnu is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cnucnu. If not, see <http://www.gnu.org/licenses/>. +# }}} +""" :author: Till Maas + :contact: till.maas@till.name + :license: GPLv2+ +""" +__docformat__ = "restructuredtext" + +#from genshi.template import MarkupTemplate +from genshi.template import TemplateLoader +from package_list import PackageList + +if __name__ == "__main__": + loader = TemplateLoader(["templates"]) + tmpl = loader.load('status.html') + packages = PackageList() + stream = tmpl.generate(packages=packages) + print stream.render() + diff --git a/cnucnu/package_list.py b/cnucnu/package_list.py index d5e1c6e..72d62c2 100644 --- a/cnucnu/package_list.py +++ b/cnucnu/package_list.py @@ -26,12 +26,60 @@ import sys import re import errors as cc_errors -from helper import cnucnu_cmp -from config import Config +from helper import upstream_cmp, cmp_upstream_repo +from config import global_config +from cvs import CVS +from bugzilla_reporter import BugzillaReporter + +class Repository: + def __init__(self, name="", path=""): + if not (name and path): + c = global_config.config["repo"] + name = c["name"] + path = c["path"] + + import string + self.name = name + self.path = path + self.repoid = "cnucnu-%s" % "".join(c for c in name if c in string.letters) + + self.repofrompath = "%s,%s" % (self.repoid, self.path) + + self._nvr_dict = None + + @property + def nvr_dict(self): + if not self._nvr_dict: + self._nvr_dict = self.repoquery() + return self._nvr_dict + + def repoquery(self, package_names=[]): + import subprocess as sp + # TODO: get rid of repofrompath message even with --quiet + cmdline = ["/usr/bin/repoquery", "--quiet", "--archlist=src", "--all", "--repoid", self.repoid, "--qf", "%{name}\t%{version}\t%{release}"] + if self.repofrompath: + cmdline.extend(['--repofrompath', self.repofrompath]) + cmdline.extend(package_names) + + repoquery = sp.Popen(cmdline, stdout=sp.PIPE) + (list, stderr) = repoquery.communicate() + new_nvr_dict = {} + for line in list.split("\n"): + if line != "": + name, version, release = line.split("\t") + new_nvr_dict[name] = (version, release) + return new_nvr_dict + + def package_version(self, package): + return self.nvr_dict[package.name][0] + + def package_release(self, package): + return self.nvr_dict[package.name][1] + class Package(object): - def __init__(self, name, regex, url, repo): + def __init__(self, name, regex, url, repo=Repository(), cvs=CVS(), br=BugzillaReporter()): # :TODO: add some sanity checks self.name = name @@ -41,10 +89,14 @@ class Package(object): self._latest_upstream = None self._upstream_versions = None self._repo_version = None + self._repo_release = None self._rpm_diff = None + self.repo = repo self.repo_name = repo.name + self.cvs = cvs + self.br = br def _invalidate_caches(self): self._latest_upstream = None @@ -109,8 +161,8 @@ class Package(object): @property def latest_upstream(self): if not self._latest_upstream: - from cnucnu.helper import cnucnu_max - self._latest_upstream = cnucnu_max(self.upstream_versions) + from cnucnu.helper import upstream_max + self._latest_upstream = upstream_max(self.upstream_versions) # invalidate _rpm_diff cache self._rpm_diff = None @@ -122,20 +174,26 @@ class Package(object): if not self._repo_version: self._repo_version = self.repo.package_version(self) return self._repo_version + + @property + def repo_release(self): + if not self._repo_release: + self._repo_release = self.repo.package_release(self) + return self._repo_release @property def rpm_diff(self): if not self._rpm_diff: - self._rpm_diff = cnucnu_cmp(self.repo_version, self.latest_upstream) + self._rpm_diff = cmp_upstream_repo(self.latest_upstream, (self.repo_version, self.repo_release)) return self._rpm_diff @property def upstream_newer(self): - return self.rpm_diff == -1 + return self.rpm_diff == 1 @property def repo_newer(self): - return self.rpm_diff == 1 + return self.rpm_diff == -1 @property def status(self): @@ -146,71 +204,48 @@ class Package(object): else: return "" + @property + def upstream_version_in_cvs(self): + return self.cvs.has_upstream_version(self) -class Repository: - def __init__(self, name="", path=""): - if not (name and path): - c = Config().config["repo"] - name = c["name"] - path = c["path"] - - import string - self.name = name - self.path = path - self.repoid = "cnucnu-%s" % "".join(c for c in name if c in string.letters) - - self.repofrompath = "%s,%s" % (self.repoid, self.path) - - self._nvr_dict = None + @property + def exact_outdated_bug(self): + return self.br.get_exact_outdated_bug(self) @property - def nvr_dict(self): - if not self._nvr_dict: - self._nvr_dict = self.repoquery() - return self._nvr_dict + def open_outdated_bug(self): + return self.br.get_open_outdated_bug(self)[0] - def repoquery(self, package_names=[]): - import subprocess as sp - # TODO: get rid of repofrompath message even with --quiet - cmdline = ["/usr/bin/repoquery", "--quiet", "--archlist=src", "--all", "--repoid", self.repoid, "--qf", "%{name}\t%{version}\t{release}"] - if self.repofrompath: - cmdline.extend(['--repofrompath', self.repofrompath]) - cmdline.extend(package_names) + def report_outdated(self, dry_run=True): + if not self.upstream_newer: + print "Upstream of package not newer, report_outdated aborted!" + str(self) + return None - repoquery = sp.Popen(cmdline, stdout=sp.PIPE) - (list, stderr) = repoquery.communicate() - new_nvr_dict = {} - for line in list.split("\n"): - if line != "": - name, version, release = line.split("\t") - new_nvr_dict[name] = (version, release) - return new_nvr_dict + if self.upstream_version_in_cvs: + print "Upstream Version found in CVS, skipping bug report: %(name)s U:%(latest_upstream)s R:%(repo_version)s" % self + return None + + return self.br.report_outdated(self, dry_run) - def package_version(self, package): - return self.nvr_dict[package.name][0] - - def package_release(self, package): - return self.nvr_dict[package.name][1] class PackageList: - def __init__(self, repo=None, mediawiki=False, packages=None): + def __init__(self, repo=Repository(), cvs=CVS(), br=BugzillaReporter(), mediawiki=False, packages=None): """ A list of packages to be checked. :Parameters: repo : `cnucnu.Repository` Repository to compare with upstream + cvs : `cnucnu.CVS` + CVS to compares sources files with upstream version mediawiki : dict Get a list of package names, urls and regexes from a mediawiki page defined in the dict. packages : [cnucnu.Package] List of packages to populate the package_list with """ - if not repo: - repo = Repository() - if not mediawiki: - mediawiki = Config().config["package list"]["mediawiki"] + mediawiki = global_config.config["package list"]["mediawiki"] if not packages and mediawiki: from wiki import MediaWiki @@ -227,7 +262,7 @@ class PackageList: for package in match: (name, regex, url) = package - packages.append(Package(name, regex, url, repo)) + packages.append(Package(name, regex, url, repo, cvs, br)) self.packages = packages self.append = self.packages.append diff --git a/cnucnu/tests/helper_test.py b/cnucnu/tests/helper_test.py index 1240268..8182133 100755 --- a/cnucnu/tests/helper_test.py +++ b/cnucnu/tests/helper_test.py @@ -22,68 +22,90 @@ import unittest import sys sys.path.insert(0, '../..') -from cnucnu.helper import cnucnu_cmp, cnucnu_max, split_rc +from cnucnu.helper import upstream_cmp, upstream_max, split_rc, cmp_upstream_repo, get_rc class HelperTest(unittest.TestCase): - def test_cnucnu_cmp_basic(self): + def test_upstream_cmp_basic(self): # equal - self.assertEqual(cnucnu_cmp("0", "0"), 0) + self.assertEqual(upstream_cmp("0", "0"), 0) # first newer - self.assertEqual(cnucnu_cmp("1", "0"), 1) + self.assertEqual(upstream_cmp("1", "0"), 1) # second newer - self.assertEqual(cnucnu_cmp("0", "1"), -1) + self.assertEqual(upstream_cmp("0", "1"), -1) def test_split_rc(self): - self.assertEqual(split_rc("4.0.0-rc1"), ("4.0.0", "1")) - self.assertEqual(split_rc("4.0.0"), ("4.0.0", None)) - self.assertEqual(split_rc("0"), ("0", None)) - self.assertEqual(split_rc("1"), ("1", None)) + self.assertEqual(split_rc("4.0.0-rc1"), ("4.0.0", "rc1")) + self.assertEqual(split_rc("4.0.0-pre2"), ("4.0.0", "pre2")) + self.assertEqual(split_rc("4.0.0"), ("4.0.0", "")) + self.assertEqual(split_rc("0"), ("0", "")) + self.assertEqual(split_rc("1"), ("1", "")) - self.assertEqual(split_rc("4.0.0rc1"), ("4.0.0", "1")) + self.assertEqual(split_rc("4.0.0rc1"), ("4.0.0", "rc1")) - def test_cnucnu_cmp_rc(self): - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0"), 0) - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0-rc1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0", "3.9.9-rc1"), 1) - self.assertEqual(cnucnu_cmp("4.0.1-rc1", "4.0.0-rc1"), 1) - self.assertEqual(cnucnu_cmp("4.0.1-rc1", "4.0.0"), 1) + def test_upstream_cmp_rc(self): + self.assertEqual(upstream_cmp("4.0.0", "4.0.0"), 0) + self.assertEqual(upstream_cmp("4.0.0", "4.0.0-rc1"), 1) + self.assertEqual(upstream_cmp("4.0.0", "4.0.0-RC1"), 1) + self.assertEqual(upstream_cmp("4.0.0", "3.9.9-rc1"), 1) + self.assertEqual(upstream_cmp("4.0.1-rc1", "4.0.0-rc1"), 1) + self.assertEqual(upstream_cmp("4.0.1-rc1", "4.0.0"), 1) + self.assertEqual(upstream_cmp("4.0.1-RC1", "4.0.0"), 1) - self.assertEqual(cnucnu_cmp("4.0.1rc1", "4.0.0"), 1) - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0rc1"), 1) + self.assertEqual(upstream_cmp("4.0.1rc1", "4.0.0"), 1) + self.assertEqual(upstream_cmp("4.0.1RC1", "4.0.0"), 1) + self.assertEqual(upstream_cmp("4.0.0", "4.0.0rc1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0-rc2", "4.0.0-rc1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0-rc2", "4.0.0rc1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0-rc2"), 1) + self.assertEqual(upstream_cmp("4.0.0-rc2", "4.0.0-rc1"), 1) + self.assertEqual(upstream_cmp("4.0.0-rc2", "4.0.0rc1"), 1) + self.assertEqual(upstream_cmp("4.0.0", "4.0.0-rc2"), 1) - self.assertEqual(cnucnu_cmp("1.0.0", "1.0.0-rc1"), 1) + self.assertEqual(upstream_cmp("1.0.0", "1.0.0-rc1"), 1) - def test_cnucnu_cmp_pre(self): - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0"), 0) - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0-pre1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0", "3.9.9-pre1"), 1) - self.assertEqual(cnucnu_cmp("4.0.1-pre1", "4.0.0-pre1"), 1) - self.assertEqual(cnucnu_cmp("4.0.1-pre1", "4.0.0"), 1) - - self.assertEqual(cnucnu_cmp("4.0.1pre1", "4.0.0"), 1) - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0pre1"), 1) + def test_upstream_cmp_pre(self): + self.assertEqual(upstream_cmp("4.0.0", "4.0.0"), 0) + self.assertEqual(upstream_cmp("4.0.0", "4.0.0-pre1"), 1) + self.assertEqual(upstream_cmp("4.0.0", "3.9.9-pre1"), 1) + self.assertEqual(upstream_cmp("4.0.1-pre1", "4.0.0-pre1"), 1) + self.assertEqual(upstream_cmp("4.0.1-pre1", "4.0.0"), 1) + + self.assertEqual(upstream_cmp("4.0.1pre1", "4.0.0"), 1) + self.assertEqual(upstream_cmp("4.0.0", "4.0.0pre1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0-pre2", "4.0.0-pre1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0-pre2", "4.0.0pre1"), 1) - self.assertEqual(cnucnu_cmp("4.0.0", "4.0.0-pre2"), 1) + self.assertEqual(upstream_cmp("4.0.0-pre2", "4.0.0-pre1"), 1) + self.assertEqual(upstream_cmp("4.0.0-pre2", "4.0.0pre1"), 1) + self.assertEqual(upstream_cmp("4.0.0", "4.0.0-pre2"), 1) - self.assertEqual(cnucnu_cmp("1.0.0", "1.0.0-pre1"), 1) + self.assertEqual(upstream_cmp("1.0.0", "1.0.0-pre1"), 1) - def test_cnucnu_max_rc(self): + def test_upstream_max_rc(self): versions = ["4.0.1", "4.0.0", "4.0.0-rc2", "4.0.0rc1"] for i in range(0,len(versions) - 1): - self.assertEqual(cnucnu_max(versions[i:]), versions[i]) + self.assertEqual(upstream_max(versions[i:]), versions[i]) - def test_cnucnu_max_pre(self): + def test_upstream_max_pre(self): versions = ["4.0.1", "4.0.0", "4.0.0-pre2", "4.0.0pre1"] for i in range(0,len(versions) - 1): - self.assertEqual(cnucnu_max(versions[i:]), versions[i]) + self.assertEqual(upstream_max(versions[i:]), versions[i]) + + + def test_get_rc(self): + self.assertEqual(get_rc("0.4.pre2.fc11"), "pre2") + + def test_cmp_upstream_repo(self): + self.assertEqual(cmp_upstream_repo("0.1.0", ("0.1.0", "5.fc10")), 0) + self.assertEqual(cmp_upstream_repo("0.1.0", ("0.1.0", "")), 0) + self.assertEqual(cmp_upstream_repo("0.1.1", ("0.1.0", "5.fc10")), 1) + self.assertEqual(cmp_upstream_repo("0.1.0", ("0.2.0", "5.fc10")), -1) + def test_cmp_upstream_repo_pre(self): + upstream_v = "0.6.0pre2" + repo_vr = ("0.6.0", "0.4.pre2.fc11") + repo_vr_older = ("0.5.9", "0.4.pre2.fc11") + repo_vr_newer = ("0.6.0", "1.fc11") + self.assertEqual(cmp_upstream_repo(upstream_v, repo_vr), 0) + self.assertEqual(cmp_upstream_repo(upstream_v, repo_vr_older), 1) + self.assertEqual(cmp_upstream_repo(upstream_v, repo_vr_newer), -1) diff --git a/runtests.sh b/runtests.sh index dc14b64..d51ee36 100755 --- a/runtests.sh +++ b/runtests.sh @@ -22,3 +22,4 @@ cnucnu/tests/package_list_test.py cnucnu/tests/mail_test.py cnucnu/tests/config_test.py +cnucnu/tests/helper_test.py |