From 49880bb7bea2c3dd95403184629fe66547458148 Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Fri, 26 Nov 2010 15:31:08 -0200 Subject: initial commit --- checkbump.py | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 checkbump.py diff --git a/checkbump.py b/checkbump.py new file mode 100644 index 0000000..89008bc --- /dev/null +++ b/checkbump.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from ConfigParser import ConfigParser +from contextlib import closing +from datetime import datetime +from subprocess import Popen, PIPE +from urllib2 import urlopen + +from portage import portagetree +from portage.versions import pkgsplit, vercmp + +import os, sys + + +class PackageException(Exception): + pass + + +class Package(object): + + def __init__(self, atom, url): + self.atom = atom + self.url = url + self.upstream_version = '' + try: + with closing(urlopen(url)) as fp: + self._content = fp.read() + except: + raise PackageException('Fetch failed: %r' % url) + + @property + def gentoo_version(self): + portage = portagetree() + versions = portage.dep_match(self.atom) + if len(versions) == 0: + raise PackageException('Package not found: %r' % self.atom) + last_atom = versions[-1] + cp, pv, rev = pkgsplit(last_atom) + return pv + + @property + def up2date(self): + return vercmp(self.gentoo_version, self.upstream_version) == 0 + + def run_command(self, command): + p = Popen(command, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + stdout, stderr = p.communicate(self._content) + if p.returncode != os.EX_OK: + raise PackageException('Command failed: %r' % command) + self.upstream_version += stdout.strip() + + +class PackageList(list): + + def __init__(self, ini_file): + self._parser = ConfigParser() + parsed_file = self._parser.read(ini_file) + if not len(parsed_file) == 1: + raise PackageException('Failed to load config: %r' % ini_file) + list.__init__(self) + atoms = self._parser.sections() + atoms.sort() + for atom in atoms: + print >> sys.stderr, 'Fetching: %s' % atom + url = None + commands = None + for name, value in self._parser.items(atom): + if name == 'url': + url = value + elif name == 'command': + commands = value + if url is None or commands is None: + raise PackageException('Invalid url/command: %r' % atom) + package = Package(atom, url) + for command in commands.split('\n'): + package.run_command(command.strip()) + self.append(package) + + +class HTMLReport(object): + + def __init__(self, ini_file): + self._ini_file = ini_file + self._pkg_list = PackageList(self._ini_file) + + def _header(self): + return """\ + + + + Version bump checker + + + +

Version bump checker

+ + + + + + + + + + +""" + + def _footer(self): + return """\ + + + +
PackageOur versionUpstream versionUp-to-date?
+
+

+ Last update: %s UTC +

+ + +""" % datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') + + def _package(self, pkg): + return """\ + + %(atom)s + %(gentoo_version)s + %(upstream_version)s + %(up2date)s + +""" % { + 'atom': pkg.atom, + 'gentoo_version': pkg.gentoo_version, + 'upstream_version': pkg.upstream_version, + 'color': pkg.up2date and 'green' or 'red', + 'up2date': pkg.up2date and 'Yes' or 'No', + } + + def __str__(self): + tmp = self._header() + for pkg in self._pkg_list: + tmp += self._package(pkg) + tmp += self._footer() + return tmp + + +if __name__ == '__main__': + print HTMLReport('sci-electronics.ini') -- cgit v1.2.3-65-gdbad