X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Foverride.py;h=0bda5e769996f64f6cbaed6996aa4e3190178277;hb=af486e867c2809515c09ae4f854a95355112010e;hp=258484ef189a7da7d40f83afb8dd6eea9583a80a;hpb=e2ae71066cbb134753d7bfceb16e87d0b76dfd6e;p=dak.git diff --git a/dak/override.py b/dak/override.py index 258484ef..0bda5e76 100755 --- a/dak/override.py +++ b/dak/override.py @@ -26,9 +26,10 @@ ################################################################################ import pg, sys -import apt_pkg, logging -import daklib.database -import daklib.utils +import apt_pkg +from daklib import logging +from daklib import database +from daklib import utils ################################################################################ @@ -37,9 +38,9 @@ projectB = None ################################################################################ -# Shamelessly stolen from 'dak rm'. Should probably end up in daklib.utils.py +# Shamelessly stolen from 'dak rm'. Should probably end up in utils.py def game_over(): - answer = daklib.utils.our_raw_input("Continue (y/N)? ").lower() + answer = utils.our_raw_input("Continue (y/N)? ").lower() if answer != "y": print "Aborted." sys.exit(1) @@ -47,7 +48,7 @@ def game_over(): def usage (exit_code=0): print """Usage: dak override [OPTIONS] package [section] [priority] -Make microchanges or microqueries of the overrides +Make microchanges or microqueries of the binary overrides -h, --help show this help and exit -d, --done=BUG# send priority/section change as closure to bug# @@ -59,7 +60,7 @@ Make microchanges or microqueries of the overrides def main (): global Cnf, projectB - Cnf = daklib.utils.get_conf() + Cnf = utils.get_conf() Arguments = [('h',"help","Override::Options::Help"), ('d',"done","Override::Options::Done", "HasArg"), @@ -67,27 +68,27 @@ def main (): ('s',"suite","Override::Options::Suite", "HasArg"), ] for i in ["help", "no-action"]: - if not Cnf.has_key("Override::Options::%s" % (i)): - Cnf["Override::Options::%s" % (i)] = "" + if not Cnf.has_key("Override::Options::%s" % (i)): + Cnf["Override::Options::%s" % (i)] = "" if not Cnf.has_key("Override::Options::Suite"): - Cnf["Override::Options::Suite"] = "unstable" + Cnf["Override::Options::Suite"] = "unstable" arguments = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv) Options = Cnf.SubTree("Override::Options") if Options["Help"]: - usage() + usage() projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"])) - daklib.database.init(Cnf, projectB) + database.init(Cnf, projectB) if not arguments: - daklib.utils.fubar("package name is a required argument.") + utils.fubar("package name is a required argument.") package = arguments.pop(0) suite = Options["Suite"] if arguments and len(arguments) > 2: - daklib.utils.fubar("Too many arguments") + utils.fubar("Too many arguments") if arguments and len(arguments) == 1: # Determine if the argument is a priority or a section... @@ -102,28 +103,46 @@ def main (): elif r[0][1] == 1: arguments = (".",arg) else: - daklib.utils.fubar("%s is not a valid section or priority" % (arg)) - + utils.fubar("%s is not a valid section or priority" % (arg)) # Retrieve current section/priority... - q = projectB.query(""" - SELECT priority.priority AS prio, section.section AS sect - FROM override, priority, section, suite + oldsection, oldsourcesection, oldpriority = None, None, None + for packagetype in ['source', 'binary']: + eqdsc = '!=' + if packagetype == 'source': + eqdsc = '=' + q = projectB.query(""" + SELECT priority.priority AS prio, section.section AS sect, override_type.type AS type + FROM override, priority, section, suite, override_type WHERE override.priority = priority.id + AND override.type = override_type.id + AND override_type.type %s 'dsc' AND override.section = section.id AND override.package = %s AND override.suite = suite.id AND suite.suite_name = %s - """ % (pg._quote(package,"str"), pg._quote(suite,"str"))) + """ % (eqdsc, pg._quote(package,"str"), pg._quote(suite,"str"))) - if q.ntuples() == 0: - daklib.utils.fubar("Unable to find package %s" % (package)) - if q.ntuples() > 1: - daklib.utils.fubar("%s is ambiguous. Matches %d packages" % (package,q.ntuples())) + if q.ntuples() == 0: + continue + if q.ntuples() > 1: + utils.fubar("%s is ambiguous. Matches %d packages" % (package,q.ntuples())) + + r = q.getresult() + if packagetype == 'binary': + oldsection = r[0][1] + oldpriority = r[0][0] + else: + oldsourcesection = r[0][1] + oldpriority = 'source' - r = q.getresult() - oldsection = r[0][1] - oldpriority = r[0][0] + if not oldpriority and not oldsourcesection: + utils.fubar("Unable to find package %s" % (package)) + if oldsection and oldsourcesection and oldsection != oldsourcesection: + # When setting overrides, both source & binary will become the same section + utils.warn("Source is in section '%s' instead of '%s'" % (oldsourcesection, oldsection)) + if not oldsection: + oldsection = oldsourcesection if not arguments: print "%s is in section '%s' at priority '%s'" % ( @@ -142,20 +161,23 @@ def main (): pg._quote(newsection,"str"))) if q.ntuples() == 0: - daklib.utils.fubar("Supplied section %s is invalid" % (newsection)) + utils.fubar("Supplied section %s is invalid" % (newsection)) newsecid = q.getresult()[0][0] q = projectB.query("SELECT id FROM priority WHERE priority=%s" % ( pg._quote(newpriority,"str"))) if q.ntuples() == 0: - daklib.utils.fubar("Supplied priority %s is invalid" % (newpriority)) + utils.fubar("Supplied priority %s is invalid" % (newpriority)) newprioid = q.getresult()[0][0] if newpriority == oldpriority and newsection == oldsection: print "I: Doing nothing" sys.exit(0) + if oldpriority == 'source' and newpriority != 'source': + utils.fubar("Trying to change priority of a source-only package") + # If we're in no-action mode if Options["No-Action"]: if newpriority != oldpriority: @@ -174,13 +196,13 @@ def main (): if not Options.has_key("Done"): pass - #daklib.utils.warn("No bugs to close have been specified. Noone will know you have done this.") + #utils.warn("No bugs to close have been specified. Noone will know you have done this.") else: print "I: Will close bug(s): %s" % (Options["Done"]) game_over() - Logger = daklib.logging.Logger(Cnf, "override") + Logger = logging.Logger(Cnf, "override") projectB.query("BEGIN WORK") # We're in "do it" mode, we have something to do... do it @@ -189,9 +211,10 @@ def main (): UPDATE override SET priority=%d WHERE package=%s + AND override.type != %d AND suite = (SELECT id FROM suite WHERE suite_name=%s)""" % ( newprioid, - pg._quote(package,"str"), + pg._quote(package,"str"), database.get_override_type_id("dsc"), pg._quote(suite,"str") )) Logger.log(["changed priority",package,oldpriority,newpriority]) @@ -204,7 +227,7 @@ def main (): newsecid, pg._quote(package,"str"), pg._quote(suite,"str") )) - Logger.log(["changed priority",package,oldsection,newsection]) + Logger.log(["changed section",package,oldsection,newsection]) projectB.query("COMMIT WORK") if Options.has_key("Done"): @@ -220,10 +243,11 @@ def main (): Subst["__BCC__"] = "Bcc: " + ", ".join(bcc) else: Subst["__BCC__"] = "X-Filler: 42" - Subst["__CC__"] = "X-DAK: dak override" + Subst["__CC__"] = "X-DAK: dak override\nX-Katie: alicia" Subst["__ADMIN_ADDRESS__"] = Cnf["Dinstall::MyAdminAddress"] Subst["__DISTRO__"] = Cnf["Dinstall::MyDistribution"] - Subst["__WHOAMI__"] = daklib.utils.whoami() + Subst["__WHOAMI__"] = utils.whoami() + Subst["__SOURCE__"] = package summary = "Concerning package %s...\n" % (package) summary += "Operating on the %s suite\n" % (suite) @@ -233,11 +257,11 @@ def main (): summary += "Changed section from %s to %s\n" % (oldsection,newsection) Subst["__SUMMARY__"] = summary - for bug in daklib.utils.split_args(Options["Done"]): + for bug in utils.split_args(Options["Done"]): Subst["__BUG_NUMBER__"] = bug - mail_message = daklib.utils.TemplateSubst( + mail_message = utils.TemplateSubst( Subst,Cnf["Dir::Templates"]+"/override.bug-close") - daklib.utils.send_mail(mail_message) + utils.send_mail(mail_message) Logger.log(["closed bug",bug]) Logger.close()