X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Frm.py;h=1e523d2e0a0dc4662bc90452fe24232c0b47f421;hb=391f5ec09a119131dc846b796ca791f4cecc69e4;hp=b479325508847ca99b7820b683efda99405e4eaf;hpb=ac84e3ea94787e97cc8354ac9132dcbf9dc922da;p=dak.git diff --git a/daklib/rm.py b/daklib/rm.py index b4793255..1e523d2e 100644 --- a/daklib/rm.py +++ b/daklib/rm.py @@ -41,6 +41,7 @@ import commands import apt_pkg +import fcntl from re import sub from collections import defaultdict from regexes import re_build_dep_arch @@ -77,18 +78,18 @@ class ReverseDependencyChecker(object): self._session = session dbsuite = get_suite(suite, session) suite_archs2id = dict((x.arch_string, x.arch_id) for x in get_suite_architectures(suite)) - package_dependencies, arch_providors_of, arch_provided_by = self._load_package_information(session, + package_dependencies, arch_providers_of, arch_provided_by = self._load_package_information(session, dbsuite.suite_id, suite_archs2id) self._package_dependencies = package_dependencies - self._arch_providors_of = arch_providors_of + self._arch_providers_of = arch_providers_of self._arch_provided_by = arch_provided_by self._archs_in_suite = set(suite_archs2id) @staticmethod def _load_package_information(session, suite_id, suite_archs2id): package_dependencies = defaultdict(lambda: defaultdict(set)) - arch_providors_of = defaultdict(lambda: defaultdict(set)) + arch_providers_of = defaultdict(lambda: defaultdict(set)) arch_provided_by = defaultdict(lambda: defaultdict(set)) source_deps = defaultdict(set) metakey_d = get_or_set_metadatakey("Depends", session) @@ -108,7 +109,7 @@ class ReverseDependencyChecker(object): deps = defaultdict(set) providers_of = defaultdict(set) provided_by = defaultdict(set) - arch_providors_of[architecture] = providers_of + arch_providers_of[architecture] = providers_of arch_provided_by[architecture] = provided_by package_dependencies[architecture] = deps @@ -177,7 +178,7 @@ class ReverseDependencyChecker(object): except ValueError as e: print "Error for package %s: %s" % (source, e) - return package_dependencies, arch_providors_of, arch_provided_by + return package_dependencies, arch_providers_of, arch_provided_by def check_reverse_depends(self, removal_requests): """Bulk check reverse dependencies @@ -205,7 +206,7 @@ class ReverseDependencyChecker(object): removals_by_arch = defaultdict(set) affected_virtual_by_arch = defaultdict(set) package_dependencies = self._package_dependencies - arch_providors_of = self._arch_providors_of + arch_providers_of = self._arch_providers_of arch_provided_by = self._arch_provided_by arch_provides2removal = defaultdict(lambda: defaultdict(set)) dep_problems = defaultdict(set) @@ -227,7 +228,7 @@ class ReverseDependencyChecker(object): arch_all_removals.add(pkg) continue removals_by_arch[arch].add(pkg) - if pkg in arch_providors_of[arch]: + if pkg in arch_providers_of[arch]: affected_virtual_by_arch[arch].add(pkg) if arch_all_removals: @@ -236,7 +237,7 @@ class ReverseDependencyChecker(object): continue removals_by_arch[arch].update(arch_all_removals) for pkg in arch_all_removals: - if pkg in arch_providors_of[arch]: + if pkg in arch_providers_of[arch]: affected_virtual_by_arch[arch].add(pkg) if not removals_by_arch: @@ -349,10 +350,11 @@ def remove(session, reason, suites, removals, binaries = [] whitelists = [] versions = [] + newest_source = '' suite_ids_list = [] suites_list = utils.join_with_commas_and(suites) cnf = utils.get_conf() - con_components = None + con_components = '' ####################################################################################################### @@ -371,7 +373,7 @@ def remove(session, reason, suites, removals, if date is None: date = commands.getoutput("date -R") - if partial: + if partial and components: component_ids_list = [] for componentname in components: @@ -380,7 +382,8 @@ def remove(session, reason, suites, removals, raise ValueError("component '%s' not recognised." % componentname) else: component_ids_list.append(component.component_id) - con_components = "AND component IN (%s)" % ", ".join([str(i) for i in component_ids_list]) + if component_ids_list: + con_components = "AND component IN (%s)" % ", ".join([str(i) for i in component_ids_list]) for i in removals: package = i[0] @@ -393,11 +396,13 @@ def remove(session, reason, suites, removals, if architecture not in d[package][version]: d[package][version].append(architecture) - for package in sorted(removals): + for package in sorted(d): versions = sorted(d[package], cmp=apt_pkg.version_compare) for version in versions: d[package][version].sort(utils.arch_compare_sw) summary += "%10s | %10s | %s\n" % (package, version, ", ".join(d[package][version])) + if apt_pkg.version_compare(version, newest_source) > 0: + newest_source = version for package in summary.split("\n"): for row in package.split("\n"): @@ -422,6 +427,9 @@ def remove(session, reason, suites, removals, log_filename = cnf["Rm::LogFile"] log822_filename = cnf["Rm::LogFile822"] with utils.open_file(log_filename, "a") as logfile, utils.open_file(log822_filename, "a") as logfile822: + fcntl.lockf(logfile, fcntl.LOCK_EX) + fcntl.lockf(logfile822, fcntl.LOCK_EX) + logfile.write("=========================================================================\n") logfile.write("[Date: %s] [ftpmaster: %s]\n" % (date, whoami)) logfile.write("Removed the following packages from %s:\n\n%s" % (suites_list, summary)) @@ -460,7 +468,7 @@ def remove(session, reason, suites, removals, session.execute("DELETE FROM bin_associations WHERE bin = :packageid AND suite = :suiteid", {'packageid': package_id, 'suiteid': suite_id}) # Delete from the override file - if partial: + if not partial: if architecture == "source": type_id = dsc_type_id else: @@ -522,13 +530,19 @@ def remove(session, reason, suites, removals, Subst_close_other = Subst_common bcc = [] wnpp = utils.parse_wnpp_bug_file() - versions = list(set([re_bin_only_nmu.sub('', v) for v in versions])) - if len(versions) == 1: - Subst_close_other["__VERSION__"] = versions[0] + newest_source = re_bin_only_nmu.sub('', newest_source) + if len(set(s.split("_", 1)[0] for s in sources)) == 1: + source_pkg = source.split("_", 1)[0] + else: + logfile.write("=========================================================================\n") + logfile822.write("\n") + raise ValueError("Closing bugs for multiple source packages is not supported. Please do it yourself.") + if newest_source != '': + Subst_close_other["__VERSION__"] = newest_source else: logfile.write("=========================================================================\n") logfile822.write("\n") - raise ValueError("Closing bugs with multiple package versions is not supported. Do it yourself.") + raise ValueError("No versions can be found. Close bugs yourself.") if bcc: Subst_close_other["__BCC__"] = "Bcc: " + ", ".join(bcc) else: @@ -536,12 +550,6 @@ def remove(session, reason, suites, removals, # 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__"] = done_bugs[0] - if len(sources) == 1: - source_pkg = source.split("_", 1)[0] - else: - logfile.write("=========================================================================\n") - logfile822.write("\n") - raise ValueError("Closing bugs for multiple source packages is not supported. Please do it yourself.") Subst_close_other["__BUG_NUMBER_ALSO__"] = "" Subst_close_other["__SOURCE__"] = source_pkg merged_bugs = set()