################################################################################
-def reverse_depends_check(removals, suites, arches=None):
+def reverse_depends_check(removals, suite, 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 = {}
if arches:
all_arches = set(arches)
else:
- all_arches = set([x.arch_string for x in get_suite_architectures(suites[0])])
+ all_arches = set([x.arch_string for x in get_suite_architectures(suite)])
all_arches -= set(["source", "all"])
for architecture in all_arches:
deps = {}
sources = {}
virtual_packages = {}
for component in components:
- filename = "%s/dists/%s/%s/binary-%s/Packages.gz" % (cnf["Dir::Root"], suites[0], component, architecture)
+ filename = "%s/dists/%s/%s/binary-%s/Packages.gz" % (cnf["Dir::Root"], suite, component, architecture)
# apt_pkg.ParseTagFile needs a real file handle and can't handle a GzipFile instance...
(fd, temp_filename) = utils.temp_filename()
(result, output) = commands.getstatusoutput("gunzip -c %s > %s" % (filename, temp_filename))
if (result != 0):
utils.fubar("Gunzip invocation failed!\n%s\n" % (output), result)
# Also check for udebs
- filename = "%s/dists/%s/%s/debian-installer/binary-%s/Packages.gz" % (cnf["Dir::Root"], suites[0], component, architecture)
+ filename = "%s/dists/%s/%s/debian-installer/binary-%s/Packages.gz" % (cnf["Dir::Root"], suite, component, architecture)
if os.path.exists(filename):
(result, output) = commands.getstatusoutput("gunzip -c %s >> %s" % (filename, temp_filename))
if (result != 0):
# Check source dependencies (Build-Depends and Build-Depends-Indep)
all_broken.clear()
for component in components:
- filename = "%s/dists/%s/%s/source/Sources.gz" % (cnf["Dir::Root"], suites[0], component)
+ filename = "%s/dists/%s/%s/source/Sources.gz" % (cnf["Dir::Root"], suite, component)
# apt_pkg.ParseTagFile needs a real file handle and can't handle a GzipFile instance...
(fd, temp_filename) = utils.temp_filename()
result, output = commands.getstatusoutput("gunzip -c %s > %s" % (filename, temp_filename))
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:
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()
# Additional component processing
over_con_components = con_components.replace("c.id", "component")
+ # Don't do dependency checks on multiple suites
+ if Options["Rdep-Check"] and len(suites) > 1:
+ utils.fubar("Reverse dependency check on multiple suites is not implemented.")
+
print "Working...",
sys.stdout.flush()
to_remove = []
if Options["Rdep-Check"]:
arches = utils.split_args(Options["Architecture"])
- reverse_depends_check(removals, suites, arches)
+ reverse_depends_check(removals, suites[0], arches)
# If -n/--no-action, drop out here
if Options["No-Action"]:
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"]
summarymail = "%s\n------------------- Reason -------------------\n%s\n" % (summary, Options["Reason"])
summarymail += "----------------------------------------------\n"
Subst_close_rm["__SUMMARY__"] = summarymail
+
whereami = utils.where_am_i()
- Archive = cnf.SubTree("Archive::%s" % (whereami))
- Subst_close_rm["__MASTER_ARCHIVE__"] = Archive["OriginServer"]
- Subst_close_rm["__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_close_rm["__BUG_NUMBER__"] = bug
- mail_message = utils.TemplateSubst(Subst_close_rm,cnf["Dir::Templates"]+"/rm.bug-close")
+ 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
- # FIXME: We should also close possible WNPP bugs for that package, but
- # currently there's no sane way to determine them
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:
# 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:
+ 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.split("_", 1)[0]
- logfile.write("Also closing bugs: ")
- logfile822.write("Also-Bugs: ")
- for bug in bts.get_bugs('src', source.split("_", 1)[0], 'status', 'open'):
- Subst_close_other["__BUG_NUMBER_ALSO__"] += str(bug) + "-done@" + cnf["Dinstall::BugServer"] + ","
- logfile.write(" " + str(bug))
- logfile822.write(" " + str(bug))
+ 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")
- logfile822.write("\n")
+
logfile.write("=========================================================================\n")
logfile.close()