[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