diff --git a/ChangeLog b/ChangeLog index 79a893b37b37fa98fb6524b185fca446ab8f4616..71933374a54ce538b303d02def2c72ce69c11ab6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-03-02 Joerg Jaspert + + * dak/process_unchecked.py (check_transition): Added. Checks if a + release team member defined a transition, and rejects based on + that data. + (process_it): Use it. + 2008-02-06 Joerg Jaspert * daklib/utils.py (check_signature): Make variable key available, diff --git a/config/debian/dak.conf b/config/debian/dak.conf index a62a510927044be4227130789cb8e0261c4205f3..3f7366cac58e86869050dee845eb9b9f3512a3e2 100644 --- a/config/debian/dak.conf +++ b/config/debian/dak.conf @@ -27,6 +27,7 @@ Dinstall StableDislocationSupport "false"; DefaultSuite "unstable"; UserExtensions "/srv/ftp.debian.org/dak/config/debian/extensions.py"; + ReleaseTransitions "/srv/ftp.debian.org/testing/hints/transitions.yaml"; QueueBuildSuites { unstable; diff --git a/dak/process_unchecked.py b/dak/process_unchecked.py index 4a4cfd6b341d35f1f4e07e4425d2d30349eb9aeb..ab8993a1a4d5305f58237f7434b22754426b1fd2 100755 --- a/dak/process_unchecked.py +++ b/dak/process_unchecked.py @@ -36,6 +36,8 @@ import daklib.queue import daklib.utils from types import * +from syck import * + ################################################################################ @@ -1139,6 +1141,79 @@ def upload_too_new(): os.chdir(cwd) return too_new +################################################################################ +################################################################################ + +# We reject packages if the release team defined a transition for them +def check_transition(): + to_dump = 0 + + # Only check if there is a file defined with checks. It's a little bit + # specific to Debian, not much use for others, so return early there. + if not Cnf.has_key("Dinstall::Reject::ReleaseTransitions"): + return + + # No need to do anything if this upload has no source included + if not changes["architecture"].has_key("source"): + return + + # We first load the current set of transitions, if any + if not os.path.exists("%s" % (Cnf["Dinstall::Reject::ReleaseTransitions"])): + # Nothing to do, no file exists + return + # Parse the yaml file + sourcefile = file(Cnf["Dinstall::Reject::ReleaseTransitions"], 'r') + transitions = load(sourcefile) + + # Now look through all defined transitions + for trans in transition: + t = transition[trans] + # We check if the transition is still valid + # If not we remove the whole setting from the dictionary and later dump it, + # so we don't process it again. + source = t["source"] + new_vers = t["new"] + q = Upload.projectB.query(""" + SELECT s.version FROM source s, suite su, src_associations sa + WHERE sa.source=s.id + AND sa.suite=su.id + AND su.suite_name='testing' + AND s.source='%s'""" + % (source)) + ql = q.getresult() + if ql: + current_vers = ql[0][0] + if apt_pkg.VersionCompare(new_vers, current_vers) == 1: + # This is still valid, the current version in database is older than + # the new version we wait for + + # Check if the source we look at is affected by this. + if changes["source"] in t['packages']: + # The source is affected, lets reject it. + reject("""%s: part of the %s transition. + + Your package is part of a testing transition to get %s migrated. + + Transition reason: %s + + This transition will finish when %s, version %s, reaches testing. + This transition is managed by the Release Team and %s + is the Release-Team member responsible for it. + Please contact them or debian-release@lists.debian.org if you + need further assistance. + """ + % (changes["source"], trans, source, t["reason"], source, new_vers, t["rm"])) + return 0 + else: + # We either have the wanted or a newer version in testing, or the package got + # removed completly. In that case we don't need to keep the transition blocker + del transition[trans] + to_dump = 1 + + if to_dump: + destfile = file(Cnf["Dinstall::Reject::ReleaseTransitions"], 'w') + dump(transition, destfile) + ################################################################################ def action (): @@ -1522,6 +1597,7 @@ def process_it (changes_file): check_urgency() check_timestamps() check_signed_by_key() + check_transition() Upload.update_subst(reject_message) action() except SystemExit: diff --git a/docs/transitions.yaml.example b/docs/transitions.yaml.example new file mode 100644 index 0000000000000000000000000000000000000000..43ef278cb3849f250d2c0f16297d3afe592fa541 --- /dev/null +++ b/docs/transitions.yaml.example @@ -0,0 +1,54 @@ +# vim:syntax=yaml: + +# Dont use tabs for indentation, use spaces. +# Or if you use tabs - use them throughout the file. One style of +# indentation pleae, not multiple. +# +# Strings should be within "", but normally work without. +# Exception: Version-numbers with an epoch really do want to be in "" +# +# keys: +# +# short_tag: A short tag for the transition, like apt_update +# reason: One-line reason what is intended with it +# source: Source package that needs to transition +# new: New version of the target package +# rm: Name of the Release Team member responsible for this transition +# packages: Array of package names that are affected by this transition +# +# +# The following example wants to update apt to version 0.7.12, the +# responsible Release Team member is Andreas Barth, and it affects some +# apt related packages. + +apt_update: + reason: "Apt needs to transition to testing to get foo and bar done" + source: apt + new: 0.7.12 + rm: Andreas Barth + packages: + - apt + - synaptic + - cron-apt + - debtags + - feta + - apticron + - aptitude +foo_broken: + reason: "Something else thats broken" + source: foo + new: 1.3-1 + rm: Someone + packages: + - foo + - baz + - bar +bar_breaks_it: + reason: We dont want bar to break it + source: bar + new: "9:99" + rm: Ganneff + packages: + - kdelibs + - qt4-x11 + - libqt-perl