X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=dak%2Ftransitions.py;h=5636624f716a4e8a4d755d4a352e690e22713751;hb=f89e353cb89593444b3e841cadc7175a3f4e9081;hp=1082fa7c9821fb00864242053e3199e5ccba8211;hpb=6c40d317e65b2f420d838595b991c9da692526b7;p=dak.git diff --git a/dak/transitions.py b/dak/transitions.py old mode 100755 new mode 100644 index 1082fa7c..5636624f --- a/dak/transitions.py +++ b/dak/transitions.py @@ -75,7 +75,7 @@ def init(): projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"])) daklib.database.init(Cnf, projectB) - + ################################################################################ def usage (exit_code=0): @@ -122,49 +122,56 @@ def load_transitions(trans_file): trans = "" return trans - 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 - if re_broken_package.match(package): - # Someone had a space too much (or not enough), we have something looking like - # "package1 - package2" now. - print "ERROR: Invalid indentation of package list in transition %s, around package(s): %s" % (test, package) - failure = True - except TypeError: - # In case someone has an empty packages list - print "ERROR: No packages defined in transition %s" % (test) + try: + 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 - continue - elif type(t[key]) != str: - if t[key] == "new" and type(t[key]) == int: - # Ok, debian native version - else: - print "ERROR: Unknown type %s for key %s in transition %s" % (type(t[key]), key, test) + 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 + if re_broken_package.match(package): + # Someone had a space too much (or not enough), we have something looking like + # "package1 - package2" now. + print "ERROR: Invalid indentation of package list in transition %s, around package(s): %s" % (test, package) + 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: + if key == "new" and type(t[key]) == int: + # Ok, debian native version + continue + else: + 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 + except TypeError: + # In case someone defined very broken things + print "ERROR: Unable to parse the file" + 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 @@ -206,7 +213,7 @@ def write_transitions(from_trans): trans_file = Cnf["Dinstall::Reject::ReleaseTransitions"] trans_temp = trans_file + ".tmp" - + trans_lock = lock_file(trans_file) temp_lock = lock_file(trans_temp) @@ -236,7 +243,7 @@ def write_transitions_from_file(from_file): sys.exit(3) if Options["sudo"]: - os.spawnl(os.P_WAIT, "/usr/bin/sudo", "/usr/bin/sudo", "-u", "dak", "-H", + os.spawnl(os.P_WAIT, "/usr/bin/sudo", "/usr/bin/sudo", "-u", "dak", "-H", "/usr/local/bin/dak", "transitions", "--import", from_file) else: trans = load_transitions(from_file) @@ -250,7 +257,7 @@ def temp_transitions_file(transitions): # NB: file is unlinked by caller, but fd is never actually closed. # We need the chmod, as the file is (most possibly) copied from a # sudo-ed script and would be unreadable if it has default mkstemp mode - + (fd, path) = tempfile.mkstemp("", "transitions", Cnf["Transitions::TempPath"]) os.chmod(path, 0644) f = open(path, "w") @@ -270,7 +277,7 @@ def edit_transitions(): if result != 0: os.unlink(edit_file) daklib.utils.fubar("%s invocation failed for %s, not removing tempfile." % (editor, edit_file)) - + # Now try to load the new file test = load_transitions(edit_file) @@ -285,8 +292,8 @@ def edit_transitions(): print "------------------------------------------------------------------------" transition_info(test) - prompt = "[S]ave, Edit again, Drop changes?" - default = "S" + prompt = "[S]ave, Edit again, Drop changes?" + default = "S" answer = "XXX" while prompt.find(answer) == -1: @@ -370,7 +377,7 @@ def check_transitions(transitions): print "Committing" for remove in to_remove: del transitions[remove] - + edit_file = temp_transitions_file(transitions) write_transitions_from_file(edit_file) @@ -382,14 +389,14 @@ def check_transitions(transitions): ################################################################################ def print_info(trans, source, expected, rm, reason, packages): - print """Looking at transition: %s - Source: %s - New Version: %s - Responsible: %s - Description: %s - Blocked Packages (total: %d): %s + print """Looking at transition: %s +Source: %s +New Version: %s +Responsible: %s +Description: %s +Blocked Packages (total: %d): %s """ % (trans, source, expected, rm, reason, len(packages), ", ".join(packages)) - return + return ################################################################################ @@ -428,7 +435,7 @@ def main(): #### This can run within sudo !! #### ##################################### init() - + # Check if there is a file defined (and existant) transpath = Cnf.get("Dinstall::Reject::ReleaseTransitions", "") if transpath == "": @@ -447,7 +454,7 @@ def main(): daklib.utils.warn("Temporary path %s not found." % (Cnf["Transitions::TempPath"])) sys.exit(1) - + if Options["import"]: try: write_transitions_from_file(Options["import"]) @@ -478,7 +485,7 @@ def main(): transition_info(transitions) sys.exit(0) - + ################################################################################ if __name__ == '__main__':