diff --git a/britney.py b/britney.py index b1f0459..25913cb 100644 --- a/britney.py +++ b/britney.py @@ -383,7 +383,7 @@ class Britney: if source: dpkg['source'] = source.split(" ")[0] if "(" in source: - dpkg['source-ver'] = source.split("(")[1].split(")")[0] + dpkg['source-ver'] = source[source.find("(")+1:source.find(")")] # if the source package is available in the distribution, then register this binary package if dpkg['source'] in sources[distribution]: @@ -450,7 +450,7 @@ class Britney: filename = os.path.join(basedir, "Bugs") self.__log("Loading RC bugs count from %s" % filename) for line in open(filename): - l = line.strip().split() + l = line.split() if len(l) != 2: continue try: bugs[l[0]] = int(l[1]) @@ -529,7 +529,7 @@ class Britney: filename = os.path.join(basedir, "Dates") self.__log("Loading upload data from %s" % filename) for line in open(filename): - l = line.strip().split() + l = line.split() if len(l) != 3: continue try: dates[l[0]] = (l[1], int(l[2])) @@ -555,7 +555,7 @@ class Britney: filename = os.path.join(basedir, "Urgency") self.__log("Loading upload urgencies from %s" % filename) for line in open(filename): - l = line.strip().split() + l = line.split() if len(l) != 3: continue # read the minimum days associated to the urgencies @@ -603,7 +603,7 @@ class Britney: filename = os.path.join(basedir, "Approved", approver) self.__log("Loading approvals list from %s" % filename) for line in open(filename): - l = line.strip().split() + l = line.split() if len(l) != 2: continue approvals["%s_%s" % (l[0], l[1])] = approver return approvals @@ -1407,7 +1407,7 @@ class Britney: self.upgrade_me = sorted(upgrade_me) # write excuses to the output file - self.__log("Writing Excuses to %s" % self.options.excuses_output, type="I") + self.__log("> Writing Excuses to %s" % self.options.excuses_output, type="I") f = open(self.options.excuses_output, 'w') f.write("\n") @@ -1589,7 +1589,7 @@ class Britney: # local copies for better performances excuse_unsat_deps = self.excuse_unsat_deps - binaries = self.binaries + binaries = self.binaries['testing'] sources = self.sources architectures = self.options.architectures nobreakall_arches = self.options.nobreakall_arches @@ -1612,28 +1612,31 @@ class Britney: skip_archall = True else: skip_archall = False - broken = [] nuninst[arch] = nuninst_comp[arch][:] - - l = -1 - while len(broken) > l and not (l == 0 and l == len(broken)): - l = len(broken) - for p in filter(lambda x: x[1] == arch, affected): - if p[0] not in binaries['testing'][arch][0] or \ - skip_archall and binaries['testing'][arch][0][p[0]]['architecture'] == 'all': continue - r = excuse_unsat_deps(p[0], None, arch, 'testing', None, excluded=broken, conflicts=True) - if not r and p[0] not in broken: - broken.append(p[0]) - elif r and p[0] in nuninst[arch]: - nuninst[arch].remove(p[0]) + broken = nuninst[arch][:] + to_check = [x[0] for x in affected if x[1] == arch] + + old_broken = None + while old_broken != broken: + old_broken = broken[:] + for p in to_check: + if p not in binaries[arch][0] or \ + skip_archall and binaries[arch][0][p]['architecture'] == 'all': continue + r = excuse_unsat_deps(p, None, arch, 'testing', None, excluded=broken, conflicts=True) + if not r and p not in broken: + broken.append(p) + elif r and p in nuninst[arch]: + broken.remove(p) + nuninst[arch].remove(p) l = 0 while l < len(broken): l = len(broken) for j in broken: - for p in binaries['testing'][arch][0][j]['rdepends']: - if p[0] not in binaries['testing'][arch][0] or \ - skip_archall and binaries['testing'][arch][0][p[0]]['architecture'] == 'all': continue + if j not in binaries[arch][0]: continue + for p in binaries[arch][0][j]['rdepends']: + if p[0] not in binaries[arch][0] or \ + skip_archall and binaries[arch][0][p[0]]['architecture'] == 'all': continue r = excuse_unsat_deps(p[0], None, arch, 'testing', None, excluded=broken, conflicts=True) if not r and p[0] not in broken: broken.append(p[0]) @@ -1677,12 +1680,12 @@ class Britney: if pkg in sources[suite]: for p in sources[suite][pkg]['binaries']: binary, arch = p.split("/") - del binaries['testing'][arch][0][binary] + del binaries[arch][0][binary] # undo the changes (binaries) for p in undo['binaries'].keys(): binary, arch = p.split("/") - binaries['testing'][arch][0][binary] = undo['binaries'][p] + binaries[arch][0][binary] = undo['binaries'][p] output.write(" finish: [%s]\n" % ",".join(self.selected)) output.write("endloop: %s\n" % (self.eval_nuninst(self.nuninst_orig))) @@ -1694,10 +1697,12 @@ class Britney: return (nuninst_comp, extra) def do_all(self, output, maxdepth=0, init=None): + self.__log("> Calculating current uninstallability counters", type="I") nuninst_start = self.get_nuninst() output.write("start: %s\n" % self.eval_nuninst(nuninst_start)) output.write("orig: %s\n" % self.eval_nuninst(nuninst_start)) + self.__log("> First loop on the packages with depth = 0", type="I") self.selected = [] self.nuninst_orig = nuninst_start (nuninst_end, extra) = self.iter_packages(self.upgrade_me[:], output)