From edfb04efc1b09d531290f91fbfe438027671cbed Mon Sep 17 00:00:00 2001
From: Joerg Jaspert <joerg@debian.org>
Date: Sat, 22 Mar 2008 15:11:41 +0100
Subject: [PATCH] * dak/transitions.py (load_transitions): Check if all our
 keys are   defined, if there are only keys defined we want and also the types
   of the various keys.

---
 ChangeLog          |  6 ++++++
 dak/transitions.py | 45 ++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 558c635c..9e951297 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-03-22  Joerg Jaspert  <joerg@debian.org>
+
+	* dak/transitions.py (load_transitions): Check if all our keys are
+	defined, if there are only keys defined we want and also the types
+	of the various keys.
+
 2008-03-22  Anthony Towns  <ajt@debian.org>
 
 	* dak/edit_transitions.py: Add --import option.
diff --git a/dak/transitions.py b/dak/transitions.py
index d8845a0b..2a4fc9bf 100755
--- a/dak/transitions.py
+++ b/dak/transitions.py
@@ -94,13 +94,56 @@ def load_transitions(trans_file):
     # Parse the yaml file
     sourcefile = file(trans_file, 'r')
     sourcecontent = sourcefile.read()
+    failure = False
     try:
         trans = syck.load(sourcecontent)
     except syck.error, msg:
         # Someone fucked it up
         print "ERROR: %s" % (msg)
         return None
-    # could do further validation here
+
+    # lets do further validation here
+    checkkeys = ["source", "reason", "packages", "new", "rm"]
+    for test in trans:
+        t = trans[test]
+
+        # First check if we know all the keys for the transition and if they have
+        # the right type (and for the packages also if the list has the right types
+        # included, ie. not a list in list, but only str in the list)
+        for key in t:
+            if key not in checkkeys:
+                print "ERROR: Unknown key %s in transition %s" % (key, test)
+                failure = True
+
+            if key == "packages":
+                if type(t[key]) != list:
+                    print "ERROR: Unknown type %s for packages in transition %s." % (type(t[key]), test)
+                    failure = True
+
+                try:
+                    for package in t["packages"]:
+                        if type(package) != str:
+                            print "ERROR: Packages list contains invalid type %s (as %s) in transition %s" % (type(package), package, test)
+                            failure = True
+                except TypeError:
+                    # In case someone has an empty packages list
+                    print "ERROR: No packages defined in transition %s" % (test)
+                    failure = True
+                    continue
+
+            elif type(t[key]) != str:
+                print "ERROR: Unknown type %s for key %s in transition %s" % (type(t[key]), key, test)
+                failure = True
+
+        # And now the other way round - are all our keys defined?
+        for key in checkkeys:
+            if key not in t:
+                print "ERROR: Missing key %s in transition %s" % (key, test)
+                failure = True
+
+    if failure:
+        return None
+
     return trans
 
 ################################################################################
-- 
2.39.5