[Oval-commits] r50 - in trunk/tools: . oval/definition
Pavel Vinogradov
blaze-guest at alioth.debian.org
Fri Jun 15 16:34:44 UTC 2007
Author: blaze-guest
Date: 2007-06-15 16:34:43 +0000 (Fri, 15 Jun 2007)
New Revision: 50
Modified:
trunk/tools/
trunk/tools/oval/definition/generator.py
Log:
Update algorithm of architectures handling
Property changes on: trunk/tools
___________________________________________________________________
Name: svn:ignore
- *.pyc
+ *.pyc
.settings
.project
.pydevproject
Modified: trunk/tools/oval/definition/generator.py
===================================================================
--- trunk/tools/oval/definition/generator.py 2007-06-15 06:33:15 UTC (rev 49)
+++ trunk/tools/oval/definition/generator.py 2007-06-15 16:34:43 UTC (rev 50)
@@ -3,6 +3,7 @@
import datetime
import xml.dom.ext
import xml.dom.minidom
+from copy import deepcopy
def __createXMLElement (name, descr = None, attrs = {}):
"""
@@ -25,49 +26,78 @@
return (element)
-eq = {}
-eq_arch = []
-di = {}
-
-def __dictAdd (dic, pkey, key, value):
- if dic.has_key (pkey):
- dic[pkey][key] = value
- else:
- dic[pkey] = {key : value}
+class Differ:
+ __equal = {}
+ __differ = {}
+ __equalArch = []
+
+ def __init__ (self):
+ pass
+
+ def __dictAdd (self, dic, pkey, key, value):
+ if dic.has_key (pkey):
+ dic[pkey][key] = value
+ else:
+ dic[pkey] = {key : value}
+ def Clean (self):
+ self.__equal = {}
+ self.__differ = {}
+ self.__equalArch = []
-def __dictDiff (arch, packages):
+ def getEqual (self):
+ return (self.__equal)
- global eq, di, eq_arch
+ def getDiffer(self):
+ return (self.__differ)
+
+ def getArchs(self):
+ return (self.__equalArch)
+
+ def Init (self, architecture, packages):
+ self.__equalArch = [architecture, ]
+ self.__equal = packages
+ self.__differ = {}
+
+ def compareElement (self, architecture, packages):
+ #We already inspected this arch
+ if architecture in self.__equalArch:
+ logging.log(logging.WARNING, "Architecture " + architecture + "already inspected")
+ return (0)
- if len(eq) == 0:
- eq = packages
- eq_arch = [arch, ]
- return (0)
- else:
- p_keys = packages.keys()
- eq_keys = eq.keys()
+ #We don't have inspected base
+ if len(self.__equal) == 0:
+ self.Init(architecture, packages)
+ return (0)
- for p in p_keys:
- if p in eq_keys:
- if packages[p] != eq[p]:
- __dictAdd(di, arch, p, packages[p])
- for ar in eq_arch:
- __dictAdd (di, ar, p, eq[p])
- del (eq[p])
+ equalC = deepcopy(self.getEqual())
+ differC = deepcopy(self.getDiffer())
+
+ for package in packages.keys():
+ if package in equalC.keys():
+ if packages[package] != equalC[package]:
+ self.__dictAdd(differC, architecture, package, packages[package])
+ for arch in self.__equalArch:
+ self.__dictAdd (differC, arch, package, equalC[package])
+ del (equalC[package])
else:
- __dictAdd (di, arch, p, packages[p])
+ #New package that not present in qeual dictionary
+ self.__dictAdd (differC, architecture, package, packages[package])
- for p in eq_keys:
- if p in p_keys:
- pass
- else:
- for ar in eq_arch:
- __dictAdd (di, ar, p, eq[p])
- del (eq[p])
-
- if len(eq):
- eq_arch.append(arch)
- return (0)
+ #Compare equals dictionary with packages of given architecture
+ for package in equalC.keys():
+ if not package in packages.keys():
+ for arch in self.__equalArch:
+ self.__dictAdd (differC, arch, package, equalC[package])
+ del (equalC[package])
+
+ if len(self.getEqual()) - len(equalC) < len(self.getEqual())/4:
+ self.__equalArch.append(architecture)
+ self.__equal = equalC
+ self.__differ = differC
+ else:
+ logging.log(logging.WARNING, "Architecture " + architecture + " too differens")
+ self.__differ[architecture] = packages
+ return (1)
namespace = "oval:org.debian.oval"
tests = __createXMLElement ("tests")
@@ -200,24 +230,25 @@
archCriteria.appendChild (archIndepCriteria)
+ diff = Differ ()
for i in range(2):
- global eq, eq_arch, di
- eq = {}
- eq_arch = []
if i == 0:
- dt =data
+ dsaData = data
else:
- dt = di
- di = {}
-
- for (key, value) in dt.iteritems():
+ dsaData = diff.getDiffer()
+
+ diff.Clean()
+ for (key, value) in dsaData.iteritems():
if key != "all":
- __dictDiff (key, value)
-
+ diff.compareElement(key, value)
+
+ eq = diff.getEqual()
+ di = diff.getDiffer()
+
archDependCriteria = __createXMLElement ("criteria", attrs={"comment" : "Architecture depended section", "operation" : "AND"})
supportedArchCriteria = __createXMLElement ("criteria", attrs={"comment" : "Supported architectures section", "operation" : "OR"})
- for arch in eq_arch:
+ for arch in diff.getArchs():
supportedArchCriteria.appendChild ( __createXMLElement ("criterion", attrs = {"test_ref" : __createTest("arch", arch), "comment" : "%s architecture" % arch}))
archDependCriteria.appendChild (supportedArchCriteria)
@@ -243,8 +274,7 @@
supportedPlatformCriteria.appendChild (packageCriteria)
archDependCriteria.appendChild (supportedPlatformCriteria)
- archCriteria.appendChild (archDependCriteria)
-
+ archCriteria.appendChild (archDependCriteria)
# # We must check that bpackages for all supported architectures is qeuals
# stdPkg = None
More information about the Oval-commits
mailing list