X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Frm.py;h=3b13d8e964f15b26d59d555a4f4978df4a95b7f1;hb=a03ea235c6f9ad874104eeb38a87e9e1496388a9;hp=536e6ddac96e94bf059270b1671c12ba2562f0ba;hpb=651efe1dd248dac0facf7c9e517efcd419cc0483;p=dak.git diff --git a/dak/rm.py b/dak/rm.py index 536e6dda..3b13d8e9 100755 --- a/dak/rm.py +++ b/dak/rm.py @@ -2,6 +2,7 @@ """ General purpose package removal tool for ftpmaster """ # Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 James Troup +# Copyright (C) 2010 Alexander Reichle-Schmehl # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -51,6 +52,7 @@ from daklib.dbconn import * from daklib import utils from daklib.dak_exceptions import * from daklib.regexes import re_strip_source_version, re_build_dep_arch +import debianbts as bts ################################################################################ @@ -100,7 +102,7 @@ def reverse_depends_check(removals, suites, arches=None): cnf = Config() print "Checking reverse dependencies..." - components = cnf.ValueList("Suite::%s::Components" % suites[0]) + components = get_component_names() dep_problem = 0 p2c = {} all_broken = {} @@ -281,7 +283,7 @@ def main (): for i in [ "architecture", "binary-only", "carbon-copy", "component", "done", "help", "no-action", "partial", "rdep-check", "reason", - "source-only" ]: + "source-only", "Do-Close" ]: if not cnf.has_key("Rm::Options::%s" % (i)): cnf["Rm::Options::%s" % (i)] = "" if not cnf.has_key("Rm::Options::Suite"): @@ -307,6 +309,8 @@ def main (): if Options["Architecture"] and not Options["Partial"]: utils.warn("-a/--architecture implies -p/--partial.") Options["Partial"] = "true" + if Options["Do-Close"] and not Options["Done"]: + utils.fubar("No.") if Options["Do-Close"] and Options["Binary-Only"]: utils.fubar("No.") if Options["Do-Close"] and Options["Source-Only"]: @@ -331,10 +335,14 @@ def main (): carbon_copy = [] for copy_to in utils.split_args(Options.get("Carbon-Copy")): if copy_to.isdigit(): - carbon_copy.append(copy_to + "@" + cnf["Dinstall::BugServer"]) + if cnf.has_key("Dinstall::BugServer"): + carbon_copy.append(copy_to + "@" + cnf["Dinstall::BugServer"]) + else: + utils.fubar("Asked to send mail to #%s in BTS but Dinstall::BugServer is not configured" % copy_to) elif copy_to == 'package': for package in arguments: - carbon_copy.append(package + "@" + cnf["Dinstall::PackagesServer"]) + if cnf.has_key("Dinstall::PackagesServer"): + carbon_copy.append(package + "@" + cnf["Dinstall::PackagesServer"]) if cnf.has_key("Dinstall::TrackingServer"): carbon_copy.append(package + "@" + cnf["Dinstall::TrackingServer"]) elif '@' in copy_to: @@ -360,8 +368,8 @@ def main (): s = get_suite(suite, session=session) if s is not None: suite_ids_list.append(s.suite_id) - if suite == "stable": - print "**WARNING** About to remove from the stable suite!" + if suite in ("oldstable", "stable"): + print "**WARNING** About to remove from the (old)stable suite!" print "This should only be done just prior to a (point) release and not at" print "any other time." game_over() @@ -475,6 +483,7 @@ def main (): summary = "" removals = d.keys() removals.sort() + versions = [] for package in removals: versions = d[package].keys() versions.sort(apt_pkg.VersionCompare) @@ -489,6 +498,8 @@ def main (): print "Will also close bugs: "+Options["Done"] if carbon_copy: print "Will also send CCs to: " + ", ".join(carbon_copy) + if Options["Do-Close"]: + print "Will also close associated bug reports." print print "------------------- Reason -------------------" print Options["Reason"] @@ -518,7 +529,6 @@ def main (): logfile.write("Closed bugs: %s\n" % (Options["Done"])) logfile.write("\n------------------- Reason -------------------\n%s\n" % (Options["Reason"])) logfile.write("----------------------------------------------\n") - logfile.flush() # Do the same in rfc822 format logfile822 = utils.open_file(cnf["Rm::LogFile822"], 'a') @@ -547,9 +557,6 @@ def main (): logfile822.write("Reason: %s\n" % Options["Reason"].replace('\n', '\n ')) if Options["Done"]: logfile822.write("Bug: %s\n" % Options["Done"]) - logfile822.write("\n") - logfile822.flush() - logfile822.close() dsc_type_id = get_override_type('dsc', session).overridetype_id deb_type_id = get_override_type('deb', session).overridetype_id @@ -582,43 +589,122 @@ def main (): session.commit() print "done." + # If we don't have a Bug server configured, we're done + if not cnf.has_key("Dinstall::BugServer"): + if Options["Done"] or Options["Do-Close"]: + print "Cannot send mail to BugServer as Dinstall::BugServer is not configured" + + logfile.write("=========================================================================\n") + logfile.close() + + logfile822.write("\n") + logfile822.close() + + return + + # read common subst variables for all bug closure mails + Subst_common = {} + Subst_common["__RM_ADDRESS__"] = cnf["Dinstall::MyEmailAddress"] + Subst_common["__BUG_SERVER__"] = cnf["Dinstall::BugServer"] + Subst_common["__CC__"] = "X-DAK: dak rm" + if carbon_copy: + Subst_common["__CC__"] += "\nCc: " + ", ".join(carbon_copy) + Subst_common["__SUITE_LIST__"] = suites_list + Subst_common["__SUBJECT__"] = "Removed package(s) from %s" % (suites_list) + Subst_common["__ADMIN_ADDRESS__"] = cnf["Dinstall::MyAdminAddress"] + Subst_common["__DISTRO__"] = cnf["Dinstall::MyDistribution"] + Subst_common["__WHOAMI__"] = whoami + # Send the bug closing messages if Options["Done"]: - Subst = {} - Subst["__RM_ADDRESS__"] = cnf["Rm::MyEmailAddress"] - Subst["__BUG_SERVER__"] = cnf["Dinstall::BugServer"] + Subst_close_rm = Subst_common bcc = [] if cnf.Find("Dinstall::Bcc") != "": bcc.append(cnf["Dinstall::Bcc"]) if cnf.Find("Rm::Bcc") != "": bcc.append(cnf["Rm::Bcc"]) if bcc: - Subst["__BCC__"] = "Bcc: " + ", ".join(bcc) + Subst_close_rm["__BCC__"] = "Bcc: " + ", ".join(bcc) else: - Subst["__BCC__"] = "X-Filler: 42" - Subst["__CC__"] = "X-DAK: dak rm" - if carbon_copy: - Subst["__CC__"] += "\nCc: " + ", ".join(carbon_copy) - Subst["__SUITE_LIST__"] = suites_list + Subst_close_rm["__BCC__"] = "X-Filler: 42" summarymail = "%s\n------------------- Reason -------------------\n%s\n" % (summary, Options["Reason"]) summarymail += "----------------------------------------------\n" - Subst["__SUMMARY__"] = summarymail - Subst["__SUBJECT__"] = "Removed package(s) from %s" % (suites_list) - Subst["__ADMIN_ADDRESS__"] = cnf["Dinstall::MyAdminAddress"] - Subst["__DISTRO__"] = cnf["Dinstall::MyDistribution"] - Subst["__WHOAMI__"] = whoami + Subst_close_rm["__SUMMARY__"] = summarymail + whereami = utils.where_am_i() - Archive = cnf.SubTree("Archive::%s" % (whereami)) - Subst["__MASTER_ARCHIVE__"] = Archive["OriginServer"] - Subst["__PRIMARY_MIRROR__"] = Archive["PrimaryMirror"] + Archive = get_archive(whereami, session) + if Archive is None: + utils.warn("Cannot find archive %s. Setting blank values for origin" % whereami) + Subst_close_rm["__MASTER_ARCHIVE__"] = "" + Subst_close_rm["__PRIMARY_MIRROR__"] = "" + else: + Subst_close_rm["__MASTER_ARCHIVE__"] = Archive.origin_server + Subst_close_rm["__PRIMARY_MIRROR__"] = Archive.primary_mirror + for bug in utils.split_args(Options["Done"]): - Subst["__BUG_NUMBER__"] = bug - mail_message = utils.TemplateSubst(Subst,cnf["Dir::Templates"]+"/rm.bug-close") + Subst_close_rm["__BUG_NUMBER__"] = bug + if Options["Do-Close"]: + mail_message = utils.TemplateSubst(Subst_close_rm,cnf["Dir::Templates"]+"/rm.bug-close-with-related") + else: + mail_message = utils.TemplateSubst(Subst_close_rm,cnf["Dir::Templates"]+"/rm.bug-close") + utils.send_mail(mail_message) + + # close associated bug reports + if Options["Do-Close"]: + Subst_close_other = Subst_common + bcc = [] + wnpp = utils.parse_wnpp_bug_file() + if len(versions) == 1: + Subst_close_other["__VERSION__"] = versions[0] + else: + utils.fubar("Closing bugs with multiple package versions is not supported. Do it yourself.") + if bcc: + Subst_close_other["__BCC__"] = "Bcc: " + ", ".join(bcc) + else: + Subst_close_other["__BCC__"] = "X-Filler: 42" + # at this point, I just assume, that the first closed bug gives + # some useful information on why the package got removed + Subst_close_other["__BUG_NUMBER__"] = utils.split_args(Options["Done"])[0] + if len(sources) == 1: + source_pkg = source.split("_", 1)[0] + else: + utils.fubar("Closing bugs for multiple source pakcages is not supported. Do it yourself.") + Subst_close_other["__BUG_NUMBER_ALSO__"] = "" + Subst_close_other["__SOURCE__"] = source_pkg + other_bugs = bts.get_bugs('src', source_pkg, 'status', 'open') + if other_bugs: + logfile.write("Also closing bug(s):") + logfile822.write("Also-Bugs:") + for bug in other_bugs: + Subst_close_other["__BUG_NUMBER_ALSO__"] += str(bug) + "-done@" + cnf["Dinstall::BugServer"] + "," + logfile.write(" " + str(bug)) + logfile822.write(" " + str(bug)) + logfile.write("\n") + logfile822.write("\n") + if source_pkg in wnpp.keys(): + logfile.write("Also closing WNPP bug(s):") + logfile822.write("Also-WNPP:") + for bug in wnpp[source_pkg]: + # the wnpp-rm file we parse also contains our removal + # bugs, filtering that out + if bug != Subst_close_other["__BUG_NUMBER__"]: + Subst_close_other["__BUG_NUMBER_ALSO__"] += str(bug) + "-done@" + cnf["Dinstall::BugServer"] + "," + logfile.write(" " + str(bug)) + logfile822.write(" " + str(bug)) + logfile.write("\n") + logfile822.write("\n") + + mail_message = utils.TemplateSubst(Subst_close_other,cnf["Dir::Templates"]+"/rm.bug-close-related") + if Subst_close_other["__BUG_NUMBER_ALSO__"]: utils.send_mail(mail_message) + logfile.write("=========================================================================\n") logfile.close() + logfile822.write("\n") + logfile822.close() + ####################################################################################### if __name__ == '__main__':