blob: 0438b64655a4e020bbc74733c42db50709767c6d [file] [log] [blame]
#!/usr/bin/python -t
import commands
import re
import entity
import utils
import logging
import os
import config
from sets import Set
SEVERYTY_NORMAL = 0;
SEVERYTY_HIGH = 1;
SEVERYTY = ["normal","high"]
class Bundle:
def __init__(self, id, version, oldVersion, severity, desc, pkgName = ""):
self.id = id
self.version = version
self.oldVersion = oldVersion
self.severity = severity
self.desc = desc
def __str__(self):
return "Bundle id: " + self.id \
+ "\nNew version: " + self.version \
+ "\nCurrent version: " + self.oldVersion \
+ "\nSeverity: " + self.severity \
+ "\nDescription: " + self.desc
class Package:
def __init__(self, packageName, refBundle = ""):
self.packageName = packageName
self.refBundle = refBundle
self.bundles = []
def __cmp__(self, other):
return cmp(self.packageName, other.packageName)
def __str__(self):
str = "Package: %s \nBundles:\n" % self.packageName
self.bundles = list(Set(self.bundles))
for b in self.bundles:
str += "%s %s => %s\n" % (b.id, b.oldVersion, b.version)
return str
class P2UpdateChecker:
def __init__(self):
logging.basicConfig(level=config.LOG_LEVEL,
format="%(asctime)s [%(levelname)s] %(message)s",
filename= "%s.log" % os.path.join(config.OUTPUT_DIR, config.APP_NAME),
filemode="aw")
self.log = logging.getLogger(config.APP_NAME)
console = logging.StreamHandler()
console.setLevel(config.LOG_LEVEL)
formatter = logging.Formatter('[%(levelname)s] %(message)s')
console.setFormatter(formatter)
logging.getLogger("").addHandler(console)
def _getUpdateThroughP2(self, startupJar, debug):
cmd = config.P2_UPDATE_CMD % startupJar
self.log.info("Get updates through P2: '%s'" % cmd)
if not debug:
updates = commands.getoutput(cmd)
else:
updates = "org.python.pydev.templates - 1.3.22 - 0 - null\norg.python.pydev.test2 - 1.3.22 - 0 - null\norg.python.pydev.test3 - 1.3.22 - 0 - null";
self.log.debug(updates)
return updates.splitlines()
def _getProvidesThroughOsgidepsScript(self, bundlesDirs, debug):
cmd = config.OSGIDEPS_CMD % bundlesDirs
self.log.info("Get provides through osgideps.pl script: '%s'" % cmd)
if not debug:
provides = commands.getoutput(cmd)
else:
provides = "osgi(org.python.pydev.templates) = 1.3.18\nosgi(org.python.pydev.refactoring) = 1.3.18]"
self.log.debug(provides)
return provides.splitlines()
def run(self, debug):
lastStartupJar = ""
lastBundlesDirs = ""
for distRelease in config.DISTRIB.releases:
self.log.info("TODO: init/update chroot for '%s'" % distRelease.name)
# we only run getUpdateThroughP2 when distRelease.startupJar have changes
if distRelease.startupJar != lastStartupJar:
updateList = self._getUpdateThroughP2(distRelease.startupJar, debug)
lastStartupJar = distRelease.startupJar
else:
self.log.info("get updates through P2 skipped.")
# Compare provides only when there is updates available
if len(updateList) > 2:
# we only run getProvidesThroughOsgidepsScript when distRelease.bundlesDirs have changes
if distRelease.bundlesDirs != lastBundlesDirs:
providelist = self._getProvidesThroughOsgidepsScript(distRelease.bundlesDirs, debug)
providelist = utils.removeDuplicate(providelist)
lastBundlesDirs = distRelease.bundlesDirs
else:
self.log.info("get provides through osgideps.pl skipped.")
toUpdates = []
output = ""
for update in updateList:
try:
update = update.split('-')
currentUpdate = update[0].strip();
updateVersion = update[1].strip();
updateSeverity = update[2].strip();
if str(update[3]) == "null":
updateDescription = "no update description"
else:
updateDescription = str(update[3])
except:
currentUpdate = update
for provide in providelist:
try:
m = re.search("(.*\()(.*)(\).*)", provide)
currentProvide = m.group(2)
except:
currentProvide = ""
self.log.error("error getting bundle id for '%s' with RE: (.*\()(.*)(\).*)" % provide)
try:
m = re.search("(.*[\ |\t|=]+)(.*)", provide)
provVersion = m.group(2)
except:
provVersion = ""
# sanity check
if currentProvide == currentUpdate:
if updateSeverity != 0 or updateSeverity != 1:
updateSeverity = 0
toUpdates.append(Bundle(currentUpdate, updateVersion, provVersion, SEVERYTY[updateSeverity], updateDescription))
toUpdates = utils.removeDuplicate(toUpdates)
pkgsToUpdate = []
for toUpdate in toUpdates:
if not debug:
status, pkgToUpdate = config.DISTRIB.getPackageName(toUpdate.id)
else:
status = 0
pkgToUpdate = "eclipse-pydev"
pkgToUpdate = pkgToUpdate.strip()
if status != 0:
self.log.debug(pkgToUpdate)
continue
pkg = Package(pkgToUpdate)
if pkgsToUpdate.count(pkg) > 0:
pkg = pkgsToUpdate.pop(pkgsToUpdate.index(pkg))
pkg.bundles.append(toUpdate)
else:
pkg.bundles.append(toUpdate)
pkgsToUpdate.append(pkg)
self.log.info(pkg)
self.log.info("Run %s..." % config.PROCESS.DESCRIPTION)
config.PROCESS.run(pkgsToUpdate, distRelease)
self.log.info("Done.")
if __name__ == '__main__':
P2UpdateChecker().run(config.APP_DEBUG)