summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rwxr-xr-xcnucnu.py84
-rw-r--r--cnucnu/bugzilla_reporter.py123
-rw-r--r--cnucnu/checkshell.py55
-rwxr-xr-xcnucnu/cvs.py4
-rw-r--r--cnucnu/helper.py33
-rwxr-xr-xcnucnu/html_reporter.py35
-rw-r--r--cnucnu/package_list.py141
-rwxr-xr-xcnucnu/tests/helper_test.py100
-rwxr-xr-xruntests.sh1
10 files changed, 317 insertions, 261 deletions
diff --git a/Makefile b/Makefile
index 052c446..dc53168 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/cnucnu.py b/cnucnu.py
index 0ad8b2d..b38e1fc 100755
--- a/cnucnu.py
+++ b/cnucnu.py
@@ -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