diff --git a/britney.conf b/britney.conf
index bd4c228..35900d3 100644
--- a/britney.conf
+++ b/britney.conf
@@ -46,7 +46,6 @@ HINTS_ABA = ALL
HINTS_HE = ALL
HINTS_LUK = ALL
HINTS_JOEYH = STANDARD force
-HINTS_DJPIG = STANDARD
HINTS_ADEODATO = STANDARD
HINTS_ZOBEL = STANDARD
HINTS_BALLOMBE = STANDARD
diff --git a/britney.py b/britney.py
index d9c55a0..3e5f409 100644
--- a/britney.py
+++ b/britney.py
@@ -299,6 +299,8 @@ class Britney:
help="override architectures from configuration file")
self.parser.add_option("", "--actions", action="store", dest="actions", default=None,
help="override the list of actions to be performed")
+ self.parser.add_option("", "--hint-tester", action="store_true", dest="hint_tester", default=None,
+ help="provide a command line interface to test hints")
self.parser.add_option("", "--dry-run", action="store_true", dest="dry_run", default=False,
help="disable all outputs to the testing directory")
self.parser.add_option("", "--compatible", action="store_true", dest="compatible", default=False,
@@ -1496,18 +1498,18 @@ 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")
-
- f = open(self.options.excuses_output, 'w')
- f.write("\n")
- f.write("
excuses...")
- f.write("\n")
- f.write("Generated: " + time.strftime("%Y.%m.%d %H:%M:%S %z", time.gmtime(time.time())) + "
\n")
- f.write("\n")
- for e in self.excuses:
- f.write("- %s" % e.html())
- f.write("
\n")
- f.close()
+ if not self.options.dry_run:
+ self.__log("> Writing Excuses to %s" % self.options.excuses_output, type="I")
+ f = open(self.options.excuses_output, 'w')
+ f.write("\n")
+ f.write("excuses...")
+ f.write("\n")
+ f.write("Generated: " + time.strftime("%Y.%m.%d %H:%M:%S %z", time.gmtime(time.time())) + "
\n")
+ f.write("\n")
+ for e in self.excuses:
+ f.write("- %s" % e.html())
+ f.write("
\n")
+ f.close()
self.__log("Update Excuses generation completed", type="I")
@@ -2165,22 +2167,24 @@ class Britney:
nuninst[arch].remove(p)
# broken packages (second round, reverse dependencies of the first round)
- while to_check:
- j = to_check.pop(0)
- if j not in binaries[arch][0]: continue
- for p in binaries[arch][0][j][RDEPENDS]:
- if p in broken or p not in binaries[arch][0]: continue
- r = systems[arch].is_installable(p)
- if not r and p not in broken:
- broken.append(p)
- to_check.append(p)
- if not (skip_archall and binaries[arch][0][p][ARCHITECTURE] == 'all'):
- nuninst[arch].append(p)
- elif r and p in nuninst[arch + "+all"]:
- broken.remove(p)
- to_check.append(p)
- if not (skip_archall and binaries[arch][0][p][ARCHITECTURE] == 'all'):
- nuninst[arch].remove(p)
+ # XXX: let's disable this block, we don't need the list of all the broken packages
+ # in the archive after an upgrade from unstable to testing.
+ # while to_check:
+ # j = to_check.pop(0)
+ # if j not in binaries[arch][0]: continue
+ # for p in binaries[arch][0][j][RDEPENDS]:
+ # if p in broken or p not in binaries[arch][0]: continue
+ # r = systems[arch].is_installable(p)
+ # if not r and p not in broken:
+ # broken.append(p)
+ # to_check.append(p)
+ # if not (skip_archall and binaries[arch][0][p][ARCHITECTURE] == 'all'):
+ # nuninst[arch].append(p)
+ # elif r and p in nuninst[arch + "+all"]:
+ # broken.remove(p)
+ # to_check.append(p)
+ # if not (skip_archall and binaries[arch][0][p][ARCHITECTURE] == 'all'):
+ # nuninst[arch].remove(p)
# if we are processing hints, go ahead
if hint:
@@ -2484,6 +2488,30 @@ class Britney:
self.__output.close()
self.__log("Test completed!", type="I")
+ def hint_tester(self):
+ """Run a command line interface to test hints
+
+ This methods provides a command line interface for the release team to
+ try hints and evaulate the results.
+ """
+ self.__log("> Calculating current uninstallability counters", type="I")
+ self.nuninst_orig = self.get_nuninst()
+
+ while True:
+ # read the command from the command line
+ try:
+ input = raw_input('britney> ').lower().split()
+ except EOFError:
+ print ""
+ break
+ # quit the hint tester
+ if input[0] in ('quit', 'exit'):
+ break
+ # run a hint
+ elif input[0] in ('easy', 'hint', 'force-hint'):
+ self.do_hint(input[0], 'hint-tester',
+ [k.rsplit("/", 1) for k in input[1:] if "/" in k])
+
def do_hint(self, type, who, pkgvers):
"""Process hints
@@ -2634,7 +2662,10 @@ class Britney:
def output_write(self, msg):
"""Simple wrapper for output writing"""
- self.__output.write(msg)
+ if self.options.hint_tester:
+ print msg,
+ else:
+ self.__output.write(msg)
def main(self):
"""Main method
@@ -2648,10 +2679,15 @@ class Britney:
if not self.options.compatible:
self.sort_actions()
# otherwise, use the actions provided by the command line
- else: self.upgrade_me = self.options.actions.split()
+ else:
+ self.upgrade_me = self.options.actions.split()
+ # run the hint tester
+ if self.options.hint_tester:
+ self.hint_tester()
# run the upgrade test
- self.upgrade_testing()
+ else:
+ self.upgrade_testing()
if __name__ == '__main__':
Britney().main()