diff --git a/Lib/difflib.py b/Lib/difflib.py index 529c78638c6..e82c703a7d8 100644 --- a/Lib/difflib.py +++ b/Lib/difflib.py @@ -572,6 +572,8 @@ def get_grouped_opcodes(self, n=3): """ codes = self.get_opcodes() + if not codes: + codes = [("equal", 0, 1, 0, 1)] # Fixup leading and trailing groups if they show no changes. if codes[0][0] == 'equal': tag, i1, i2, j1, j2 = codes[0] diff --git a/Lib/test/test_difflib.py b/Lib/test/test_difflib.py index 17037547f67..9819c845677 100644 --- a/Lib/test/test_difflib.py +++ b/Lib/test/test_difflib.py @@ -12,6 +12,13 @@ def test_ratio_for_null_seqn(self): self.assertEqual(s.quick_ratio(), 1) self.assertEqual(s.real_quick_ratio(), 1) + def test_comparing_empty_lists(self): + # Check fix for bug #979794 + group_gen = difflib.SequenceMatcher(None, [], []).get_grouped_opcodes() + self.assertRaises(StopIteration, group_gen.next) + diff_gen = difflib.unified_diff([], []) + self.assertRaises(StopIteration, diff_gen.next) + Doctests = doctest.DocTestSuite(difflib) test_support.run_unittest(TestSFbugs, Doctests) diff --git a/Misc/NEWS b/Misc/NEWS index 73abaa4a203..507c7a5cd4a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,6 +29,10 @@ Extension modules Library ------- +- Bug #979794: difflib.get_grouped_opcodes() now handles the case of when it is + comparing two empty lists. Was affecting both context_diff() and + unified_diff(). Was also a duplicate of bug #980117. + - Bug #980938: smtplib now prints debug output to sys.stderr. - Bug #930024: posixpath.realpath() now handles infinite loops in symlinks by