[diffoscope] 06/06: html-dir: Show start of diff on parent page, even when split over child pages
Ximin Luo
infinity0 at debian.org
Mon Sep 5 19:19:35 CEST 2016
This is an automated email from the git hooks/post-receive script.
infinity0 pushed a commit to branch better-lazy-loading
in repository diffoscope.
commit ebbf88382a0762166f10e3d6cd9489b8ee790113
Author: Ximin Luo <infinity0 at debian.org>
Date: Mon Sep 5 19:14:01 2016 +0200
html-dir: Show start of diff on parent page, even when split over child pages
Also change the functionality of the flags so they are more consistent across
different output modes. Previously, the behaviour of the flags differed wildly
across both --html and --html-dir output, such that it was hard to control one
output without affecting the other in a counterintuitive way. For example:
1. max-diff-block-lines applied to the entire diff block even when it was split
across child pages. This meant that max-report-size as applied to the parent
page, gave wildly different results. For --html output, each diff block would
be relatively large and so not many diff blocks would be shown (for a given
max-report-size), but for --html-dir, many diff blocks would be shown since
lots of them would go onto child pages. However, if one wanted to increase
max-report-size to allow more diff blocks to be shown for --html, this would
*also* increase the amount of diff shown for each child page for --html-dir.
2. separate-file-diff-size would affect the parent page in unpredictable ways:
if the diff block had N lines, it would be shown on the parent page, but if it
had N+1 lines, then 0 of these lines would be shown on the parent page. This
would also affect how how many diff blocks are shown later as part of the
max-report-size limits.
In this commit, we remove separate-file-diff-size, and change the semantics of
max-diff-block-lines to display this many lines of diff on the parent page
regardless of how large the whole diff block is. This prevents any unintuitive
{N -> N, N+1 -> 0} "jumps" in behaviour, and the behaviour of the parent page
is also more predictable and intuitive. To control the child pages, we add
max-diff-block-lines-html-dir. This limits the number of lines shown across all
split children for a given diff block; the size of each child page is capped to
roughly max-report-size / 4. Notably, this *only* affects the child pages and
*not* the parent page; and max-diff-block-lines now has the same effect for
both --html and --html-dir output.
In order to do this, we have to also ditch the previous behaviour where
max-diff-block-lines would interfere with diff's output on a deeper level,
hiding it from *all* readers. If this is really needed, we can add it back in
under a different name, that makes it obvious it operates at this deeper level
instead of merely affecting the diff visual output.
---
diffoscope/config.py | 21 ++--
diffoscope/difference.py | 12 ---
diffoscope/main.py | 44 +++++---
diffoscope/presenters/html.py | 150 +++++++++++++++------------
tests/data/ps_internal_expected_diff | 194 ++++++++++++++++++++++++++++++++++-
tests/test_difference.py | 7 --
6 files changed, 318 insertions(+), 110 deletions(-)
diff --git a/diffoscope/config.py b/diffoscope/config.py
index 97a1182..89d9a1c 100644
--- a/diffoscope/config.py
+++ b/diffoscope/config.py
@@ -28,12 +28,13 @@ class classproperty(property):
class Config(object):
def __init__(self):
# 0 to disable max
- self._max_diff_block_lines = 8192
- self._max_diff_input_lines = 2 ** 20 # GNU diff cannot process arbitrary large files :(
self._max_report_size = 2000 * 2 ** 10 # 2000 kB
- self._separate_file_diff_size = 200 * 2 ** 10 # 200kB
+ self._max_diff_block_lines = 50
+ self._max_diff_block_lines_html_dir = 1024
+ self._max_diff_input_lines = 2 ** 20 # GNU diff cannot process arbitrary large files :(
self._fuzzy_threshold = 60
self._new_file = False
+ self._html_dir_parent_child_ratio = 4
@classproperty
def general(cls):
@@ -42,6 +43,10 @@ class Config(object):
return cls._general_config
@property
+ def html_dir_parent_child_ratio(self):
+ return self._html_dir_parent_child_ratio
+
+ @property
def max_diff_block_lines(self):
return self._max_diff_block_lines
@@ -66,12 +71,12 @@ class Config(object):
self._max_report_size = value
@property
- def separate_file_diff_size(self):
- return self._separate_file_diff_size
+ def max_diff_block_lines_html_dir(self):
+ return self._max_diff_block_lines_html_dir
- @separate_file_diff_size.setter
- def separate_file_diff_size(self, value):
- self._separate_file_diff_size = value
+ @max_diff_block_lines_html_dir.setter
+ def max_diff_block_lines_html_dir(self, value):
+ self._max_diff_block_lines_html_dir = value
@property
def fuzzy_threshold(self):
diff --git a/diffoscope/difference.py b/diffoscope/difference.py
index edffc72..67a88af 100644
--- a/diffoscope/difference.py
+++ b/diffoscope/difference.py
@@ -109,23 +109,11 @@ class DiffParser(object):
self._diff.write(line)
if line[0] in ('-', '+') and line[0] == self._direction:
self._block_len += 1
- max_lines = Config.general.max_diff_block_lines
- if max_lines > 0 and self._block_len >= max_lines:
- return self.skip_block
else:
self._block_len = 1
self._direction = line[0]
return self.read_hunk
- def skip_block(self, line):
- if self._remaining_hunk_lines == 0 or line[0] != self._direction:
- self._diff.write('%s[ %d lines removed ]\n' % (self._direction, self._block_len - Config.general.max_diff_block_lines))
- return self.read_hunk(line)
- self._block_len += 1
- self._remaining_hunk_lines -= 1
- return self.skip_block
-
-
DIFF_CHUNK = 4096
diff --git a/diffoscope/main.py b/diffoscope/main.py
index 1a65b65..2d92eb7 100644
--- a/diffoscope/main.py
+++ b/diffoscope/main.py
@@ -67,32 +67,46 @@ def create_parser():
parser.add_argument('--text', metavar='output', dest='text_output',
help='write plain text output to given file (use - for stdout)')
parser.add_argument('--no-max-limits', action='store_true', default=False,
- help='Disable all default limits.')
+ help='Disable all default limits. Note that text output '
+ 'already ignores all limits, both manual and default.')
parser.add_argument('--max-report-size', metavar='BYTES',
dest='max_report_size', type=int,
- help='maximum bytes written in report (default: %d, 0 to disable)' %
- Config.general.max_report_size,
+ help='maximum bytes written in report. in html-dir '
+ 'output, this is instead the max bytes of the parent '
+ 'page, and %d * the max bytes of the child page. '
+ '(default: %d, 0 to disable)' %
+ (Config.general.html_dir_parent_child_ratio,
+ Config.general.max_report_size),
default=None).completer=RangeCompleter(0,
Config.general.max_report_size, 200000)
- parser.add_argument('--separate-file-diff-size', metavar='BYTES',
- dest='separate_file_diff_size', type=int,
- help='diff size to load diff on demand, with --html-dir (default: %(default)s)',
- default=Config.general.separate_file_diff_size).completer=RangeCompleter(0,
- Config.general.separate_file_diff_size, 20000)
- parser.add_argument('--max-diff-block-lines', dest='max_diff_block_lines', type=int,
- help='maximum number of lines per diff block (default: %d, 0 to disable)' %
+ parser.add_argument('--max-diff-block-lines', dest='max_diff_block_lines',
+ metavar='LINES', type=int,
+ help='maximum number of lines output per diff block. '
+ 'for --html-dir, this is the maximum number of lines '
+ 'output on the parent page; extra lines are output on '
+ 'child pages up to --max-diff-block-lines-html-dir '
+ 'lines. (default: %d, 0 to disable)' %
Config.general.max_diff_block_lines,
default=None).completer=RangeCompleter(0,
Config.general.max_diff_block_lines, 5)
- parser.add_argument('--max-diff-input-lines', dest='max_diff_input_lines', type=int,
- help='maximum number of lines fed to diff (default: %d, 0 to disable)' %
+ parser.add_argument('--max-diff-block-lines-html-dir', dest='max_diff_block_lines_html_dir',
+ metavar='LINES', type=int,
+ help='in --html-dir output, this is maximum number of '
+ 'lines (over all pages) output per diff block, '
+ '(default: %d, 0 to disable)' %
+ Config.general.max_diff_block_lines_html_dir,
+ default=None).completer=RangeCompleter(0,
+ Config.general.max_diff_block_lines_html_dir, 200)
+ parser.add_argument('--max-diff-input-lines', dest='max_diff_input_lines',
+ metavar='LINES', type=int,
+ help='maximum number of lines fed to diff(1) '
+ '(default: %d, 0 to disable)' %
Config.general.max_diff_input_lines,
default=None).completer=RangeCompleter(0,
Config.general.max_diff_input_lines, 5000)
parser.add_argument('--fuzzy-threshold', dest='fuzzy_threshold', type=int,
help='threshold for fuzzy-matching '
- '(0 to disable, %d is default, 400 is high fuzziness)' %
- (Config.general.fuzzy_threshold),
+ '(0 to disable, %(default)s is default, 400 is high fuzziness)',
default=Config.general.fuzzy_threshold).completer=RangeCompleter(0,
400, 20)
parser.add_argument('--new-file', dest='new_file', action='store_true',
@@ -174,8 +188,8 @@ def run_diffoscope(parsed_args):
if not tlsh and Config.general.fuzzy_threshold != parsed_args.fuzzy_threshold:
logger.warning('Fuzzy-matching is currently disabled as the “tlsh” module is unavailable.')
maybe_set_limit(Config.general, parsed_args, "max_report_size")
- Config.general.separate_file_diff_size = parsed_args.separate_file_diff_size
maybe_set_limit(Config.general, parsed_args, "max_diff_block_lines")
+ maybe_set_limit(Config.general, parsed_args, "max_diff_block_lines_html_dir")
maybe_set_limit(Config.general, parsed_args, "max_diff_input_lines")
Config.general.fuzzy_threshold = parsed_args.fuzzy_threshold
Config.general.new_file = parsed_args.new_file
diff --git a/diffoscope/presenters/html.py b/diffoscope/presenters/html.py
index 248111c..82cc6c4 100644
--- a/diffoscope/presenters/html.py
+++ b/diffoscope/presenters/html.py
@@ -204,6 +204,9 @@ UD_TABLE_FOOTER = u"""<tr class="ondemand"><td colspan="4">
class PrintLimitReached(Exception):
pass
+class DiffBlockLimitReached(Exception):
+ pass
+
def create_limited_print_func(print_func, max_page_size):
def limited_print_func(s, force=False):
@@ -216,16 +219,10 @@ def create_limited_print_func(print_func, max_page_size):
return limited_print_func
-def estimate_num_rows_per_page(separate_file_diff_size):
- # each row takes about 1200 bytes in the output, so roughly calculate
- # the number of rows that 4 * separate_file_diff_size will hold
- return separate_file_diff_size * 4 // 1024
-
-
buf, add_cpt, del_cpt = [], 0, 0
line1, line2, has_internal_linenos = 0, 0, True
hunk_off1, hunk_size1, hunk_off2, hunk_size2 = 0, 0, 0, 0
-spl_rows, spl_bytes, spl_current_page = 0, 0, 0
+spl_rows, spl_current_page = 0, 0
spl_print_func, spl_print_ctrl = None, None
@@ -233,12 +230,12 @@ def new_unified_diff():
global buf, add_cpt, del_cpt
global line1, line2, has_internal_linenos
global hunk_off1, hunk_size1, hunk_off2, hunk_size2
- global spl_rows, spl_bytes, spl_current_page
+ global spl_rows, spl_current_page
global spl_print_func, spl_print_ctrl
buf, add_cpt, del_cpt = [], 0, 0
line1, line2, has_internal_linenos = 0, 0, True
hunk_off1, hunk_size1, hunk_off2, hunk_size2 = 0, 0, 0, 0
- spl_rows, spl_bytes, spl_current_page = 0, 0, 0
+ spl_rows, spl_current_page = 0, 0
spl_print_func, spl_print_ctrl = None, None
@@ -460,12 +457,17 @@ def spl_print_enter(print_context, rotation_params):
global spl_print_func, spl_print_ctrl
spl_print_ctrl = print_context.__exit__, rotation_params
spl_print_func = print_context.__enter__()
- _, _, css_url, _ = rotation_params
+ _, _, css_url = rotation_params
# Print file and table headers
output_header(css_url, spl_print_func)
+def spl_had_entered_child():
+ global spl_print_ctrl, spl_current_page
+ return spl_print_ctrl and spl_print_ctrl[1] and spl_current_page > 0
+
def spl_print_exit(*exc_info):
global spl_print_func, spl_print_ctrl
+ if not spl_had_entered_child(): return False
output_footer(spl_print_func)
_exit, _ = spl_print_ctrl
spl_print_func, spl_print_ctrl = None, None
@@ -475,31 +477,48 @@ def spl_print_exit(*exc_info):
def spl_file_printer(directory, filename):
with codecs.open(os.path.join(directory,filename), 'w', encoding='utf-8') as f:
print_func = f.write
- max_page_size = Config.general.max_report_size
- def limited_print_func(s, force=False):
- global spl_bytes
+ def recording_print_func(s, force=False):
print_func(s)
- spl_bytes += len(s)
- if not force and max_page_size > 0 and spl_bytes >= max_page_size:
- raise PrintLimitReached()
- yield limited_print_func
+ recording_print_func.bytes_written += len(s)
+ recording_print_func.bytes_written = 0
+ yield recording_print_func
def row_was_output():
global spl_print_func, spl_print_ctrl, spl_rows, spl_current_page
spl_rows += 1
- if not spl_print_ctrl:
- return
_, rotation_params = spl_print_ctrl
- directory, mainname, css_url, rows_per_page = rotation_params
- if spl_rows % rows_per_page != 0:
+ max_lines = Config.general.max_diff_block_lines
+ max_lines_html_dir = Config.general.max_diff_block_lines_html_dir
+ if not rotation_params:
+ # html-dir single output, don't need to rotate
+ if max_lines > 0 and spl_rows >= max_lines:
+ raise DiffBlockLimitReached()
return
- spl_current_page += 1
+ else:
+ # html-dir output, perhaps need to rotate
+ directory, mainname, css_url = rotation_params
+ if max_lines_html_dir > 0 and spl_rows >= max_lines_html_dir:
+ raise DiffBlockLimitReached()
+
+ if spl_current_page == 0: # on parent page
+ if max_lines == 0 or spl_rows < max_lines:
+ return
+ else: # on child page
+ max_report_size = Config.general.max_report_size / Config.general.html_dir_parent_child_ratio
+ # TODO: make this stay below the max, instead of going 1 row over the max
+ # will require some backtracking...
+ if spl_print_func.bytes_written < max_report_size:
+ return
+ spl_current_page += 1
filename = "%s-%s.html" % (mainname, spl_current_page)
- # close the current page
- spl_print_func(UD_TABLE_FOOTER % {"filename": html.escape(filename), "text": "load diff"}, force=True)
- spl_print_exit(None, None, None)
- # rotate to the next page
+
+ if spl_current_page > 1:
+ # previous page was a child, close it
+ spl_print_func(UD_TABLE_FOOTER % {"filename": html.escape(filename), "text": "load diff"}, force=True)
+ spl_print_exit(None, None, None)
+
+ # rotate to the next child page
context = spl_file_printer(directory, filename)
spl_print_enter(context, rotation_params)
spl_print_func(UD_TABLE_HEADER)
@@ -513,7 +532,9 @@ def output_unified_diff_table(unified_diff, _has_internal_linenos):
has_internal_linenos = _has_internal_linenos
spl_print_func(UD_TABLE_HEADER)
try:
+ bytes_processed = 0
for l in unified_diff.splitlines():
+ bytes_processed += len(l) + 1
m = re.match(r'^--- ([^\s]*)', l)
if m:
empty_buffer()
@@ -583,47 +604,47 @@ def output_unified_diff_table(unified_diff, _has_internal_linenos):
empty_buffer()
empty_buffer()
+ return True
+ except DiffBlockLimitReached:
+ total = len(unified_diff)
+ bytes_left = total - bytes_processed
+ frac = bytes_left / total
+ spl_print_func(
+ u"<tr class='error'>"
+ u"<td colspan='4'>Max diff block lines reached; %s/%s bytes (%.2f%%) of diff not shown."
+ u"</td></tr>" % (bytes_left, total, frac*100), force=True)
+ return False
+ except PrintLimitReached:
+ assert not spl_had_entered_child() # limit reached on the parent page
+ spl_print_func(u"<tr class='error'><td colspan='4'>Max output size reached.</td></tr>", force=True)
+ raise
finally:
spl_print_func(u"</table>", force=True)
def output_unified_diff(print_func, css_url, directory, unified_diff, has_internal_linenos):
- global spl_print_func, spl_current_page
+ global spl_print_func, spl_print_ctrl, spl_current_page
new_unified_diff()
- if directory and len(unified_diff) > Config.general.separate_file_diff_size:
- # open a new file for this table
+ rotation_params = None
+ if directory:
mainname = hashlib.md5(unified_diff.encode('utf-8')).hexdigest()
- filename="%s.html" % mainname
- logger.debug('separate html output for diff of size %d', len(unified_diff))
- num_pages = 0
- truncated = False
- rows_per_page = estimate_num_rows_per_page(Config.general.separate_file_diff_size)
- rotation_params = directory, mainname, css_url, rows_per_page
- try:
- spl_print_enter(spl_file_printer(directory, filename), rotation_params)
- output_unified_diff_table(unified_diff, has_internal_linenos)
- except PrintLimitReached:
- truncated = True
- spl_print_func(u"<table><tr class='error'><td colspan='4'>Max output size reached.</td></tr></table>",
- force=True)
- spl_print_exit(None, None, None) # swallow
- except:
- if not spl_print_exit(*sys.exc_info()): raise
- else:
- spl_print_exit(None, None, None)
- finally:
- num_pages = spl_current_page + 1
-
- text = "load diff (%s pieces%s)" % (num_pages, (", truncated" if truncated else ""))
- print_func(UD_TABLE_HEADER, force=True)
- print_func(UD_TABLE_FOOTER % {"filename": html.escape(filename), "text": text}, force=True)
-
+ rotation_params = directory, mainname, css_url
+ try:
+ spl_print_func = print_func
+ spl_print_ctrl = None, rotation_params
+ truncated = not output_unified_diff_table(unified_diff, has_internal_linenos)
+ except:
+ if not spl_print_exit(*sys.exc_info()): raise
else:
- try:
- spl_print_func = print_func
- output_unified_diff_table(unified_diff, has_internal_linenos)
- finally:
- spl_print_func = None
+ spl_print_exit(None, None, None)
+ finally:
+ spl_print_ctrl = None
+ spl_print_func = None
+
+ if spl_current_page > 0:
+ noun = "pieces" if spl_current_page > 1 else "piece"
+ text = "load diff (%s %s%s)" % (spl_current_page, noun, (", truncated" if truncated else ""))
+ print_func(UD_TABLE_FOOTER % {"filename": html.escape("%s-1.html" % mainname), "text": text}, force=True)
def output_difference(difference, print_func, css_url, directory, parents):
@@ -725,13 +746,10 @@ def output_html_directory(directory, difference, css_url=None, jquery_url=None):
if jquery_url == 'disable':
jquery_url = None
- if Config.general.separate_file_diff_size:
- num_rows = estimate_num_rows_per_page(Config.general.separate_file_diff_size)
- if Config.general.max_diff_block_lines and Config.general.max_diff_block_lines < num_rows:
- logger.info('You selected a very low --max-diff-block-lines=%s; it\'s '+
- 'unlikely that --separate-file-diff-size=%s will have any effect.',
- Config.general.max_diff_block_lines,
- Config.general.separate_file_diff_size)
+ if Config.general.max_diff_block_lines_html_dir < Config.general.max_diff_block_lines:
+ raise ValueError(
+ "bad config values: max_diff_block_lines_html_dir (%s) < max_diff_block_lines (%s)" %
+ (Config.general.max_diff_block_lines_html_dir, Config.general.max_diff_block_lines))
with file_printer(directory, "index.html") as print_func:
print_func = create_limited_print_func(print_func, Config.general.max_report_size)
diff --git a/tests/data/ps_internal_expected_diff b/tests/data/ps_internal_expected_diff
index f0cf9c5..4fe972a 100644
--- a/tests/data/ps_internal_expected_diff
+++ b/tests/data/ps_internal_expected_diff
@@ -97,7 +97,103 @@
-12C0D6DDD6E89A3BA6468B6322EF1ED480FC2C330B4F75B2FB0D5A087CE736B1
-4E6BB73F418498D5F66A9DF2917F9F373AA2297896E42772AE3E18655C54F2B8
-8C06C928783AE7E32CC7F03BDC4066D87357A596FA9B3C3E63A7C479F07E8EA3
--[ 97 lines removed ]
+-E64470B60D44B75B84AAC49B9A6A90B0A4495B1941E759A7CA742F6AD10F9B59
+-C3CDC8D90DAF8986077461DA65D90F77DC54EF0373067DE4140769C6465E94B1
+-5A93BD1623C150EF1EE877962760F05FDC2EC3B6AD34DFD639D65782267E8E51
+-3128B955D4FE716C9A261EEF9C1A0425B819E333CBA03E8D661CF115FB195E7C
+-3DE00E3A29FCCAE10A43014D5BF8AC10D649329CCCC022E606A5A0A1C98CC87E
+-8404F4926454C7DBC47FFF0AC85CC5CF0BDE09CAF9705983A587B32742316AED
+-9FB7B3F3932C95DA1F517990FCB1B4367BCC520C3B289FCC7E35FAC7092AB97B
+-20AA7D44F7766B8BB5A695A267912A438EDB2C736C7BA6755991D3219344B09A
+-A7661BEA37D4837B15B1067B67999997E37D5BD59A5E8B912F8F30F5584EEF58
+-4B46A5B574446C8334CD8BEBA270E9EF0E4F0D7B69C5ED963399EB3291F47F19
+-6748FE7E05B02F79771611D5A3155F3C7701166C8EB0B6A9E9BF359679ECF605
+-96666690AB674AA9346A60C985268D237FAEE252E83674BCDE538254FF6985BE
+-B99D01AC96BEC46E11F65A68C934C671570A5D40B7F3B6A6238EA4EE091F0F64
+-21A37026A09C6904308D106C37021E1141BFB960D819C0CC308C23E08B05AF93
+-163F8C79ADCB215635D473B68803F5BFBA022867E12D1FC895CD7B5EC4B6E52A
+-7491F83160DCC3D9D3277DD9077D5F9814C468D3637034D28CF748A7274C2EDC
+-4EEB95F0EDAF77FE542075A2DF749043F3BBB98C15CB863D46647CAC9E960CB3
+-9CE1ABF3C2425AA7F16E3E3CBFA7B3018334C8DF5FF541A89173AE31944A826E
+-39ED576E7E792D7F9D36520C59DFCEB7C24F8AC9C2A3FFE9F393CC7AE1021180
+-70054C243ADAB55FAD00EDF032E6E6E8B7C49F2CF28600D53EA5CA6B6423D92C
+-9986D30BDC5198A5C3A0604326A47C5BB592E2E8DBF253366475897D14A97E86
+-03912768935539A025637B3F3D941EAB629A97F530C7565657A0C457E350F758
+-CAA0D914C88A74B792EB8BB5DC4904581FA7D87575A3A7CF327BD31EBD45EBFF
+-BD84FA0BF8935D8D49BCFD7E7E0A23C7E7AF6ED4574AE0520EA3E52350A0E872
+-CFFD9E8BD6C54A2B5AEDD65707959C94AC3790EEF76D3F3AC9C795B3ECE17740
+-296FEE99988E871ABB9E905D3283709EA6FD6398A83D1D06B9BA0307C8C9FDBF
+-600845E7463853A60C3FABBF623AAE7F0B3C60777EE935BF70BC156329719515
+-6B1E4BA88A3D8F4BDE985E76372F039DEDB0C26A82C1287AF9CF4ED7AC771B30
+-AE2A5B9C455B5BD57D20D44A808D678A5A5725E20047A0E073B31F0F5CB01928
+-5B3897F78125A366B11B15F77CC4DCBAC194AA69864C3516469D1D7065F1C85F
+-2FC836297170D8C292640F80FBF03EB2590D3A3C150F2C4A36A3F5E26CB86519
+-DF021AA87A10252634CF4EED81FA707075814BCA50E5ED3DB845E4FEBF0884FF
+-81C3E0F0FF74EA455ADD6E2CB74BDFE06A790950E13749FFECD3136903300768
+-78623E5FD0113869FC30A301DBB9899B0980EEF27FF33ACBBE4F1FCD9DB9BF5F
+-2F8D8B0AE7402EF0233CE106F07BA2FFE97C13FF25EE91FEEE3EAAA8DD70B4E5
+-993274D3413EB273A9ED0BD78448C004DAA54B13D64B267422165DCAA8CE8C28
+-5663F4329597EB39163239900E4BAD7DA863D621240BB9E1AD8BB4F87712B83A
+-03E7B361A6BE76EA7E65F8637057B911BD3F8A7CE522C4F741FA3DCA9BEBD325
+-8199920C5A77E117F8475C0158622044C14C8460A0D464B6A5F4290581959836
+-F1EACB72EA9A5C96557C1DBD79110A1FDDC7A829E0918071BC8EE966E8C8132A
+-399AFC5383B8A555A195DE676102B0B9E22A47E0FD79E2C90A6443EC9F49C41E
+-26FA7EBD6D767A197D0D4DF43FE74B9807FF6930C302311C993EBC7D359EBC5C
+-CC672A2E3269DC1588530888A81FA4688A01E64B9D449AB4D916EFA148F06381
+-9927D2E7BE6A6EFA13D225EEB07D81FDB0C9F32CA5537A22EF942AB12F6C71DF
+-B898B0F0045A6DA6E479D42F971B7240FB605F647B41BF8564820F5B568F5341
+-ADFE18CE181F2BA5808C528191E1C8B2AD34B64EC3871D25F39C3E477F543893
+-AC88C9E8E5CCC0403FD08BC1EAD90ACD7490C0A9BB68CBF46867C6475306E731
+-C8D87447F9C2D9A7C482BD520A98175CBC2216D91E29C7CC3F5F15CA343EA6E2
+-7B195DB92B7B0AC8D80D17A04F4745E74CAD0820680A3BF17CDFFDBB859C9B11
+-370D45F29842CD1D54D828C926BC16A6051E2332E8B7A92B269688F11467D65A
+-E4C9049F180AC2DDCFA405A4B74D846F019F8192AD6469A4511965178CC031BC
+-C671E9A543A7967826FD4095A5EFB1DDA14667401768E8B67F4827DC032F69A5
+-33A4B67EBBEA5C7C40DE44A743751A6D9D9D186483BBA665A933061E6D8424FA
+-4D70905203E4AF7ADC2E0832686B7AEC505DCB8A85CBAE00AAF9EF20EAF4C269
+-D872480779CB89F77592555A6ECD8CB98FCCA21BDBEE9F34C5070E89EB9D104E
+-DFADD85269AE7C9F549C12E49641AC656CE39E0E2BDF3BEAD2AB9165670F5435
+-4EDD4DFED6DBD462BD4A96AB063D847463013AC44C0EC3E06E79BB04E035C906
+-21CE50314291838C458655DBFB86DB4C35E2A49B7071DF126CEAC58CBDCAC57D
+-5A4F84266410D98D715EC7C6BEEE7CD453870383664A5DCBF68A2F9922C5657A
+-C822491E464A658EF6FD519F8A7D9F7F373142C83DE8B7379DF7C38DD213FBEB
+-B4FD42A70F5B9D6554AA30AEE1EF6D1A4EB99CE26C93D85975EE1046FC64B730
+-4D5E3C794C801E591978FEBBEE0513909690F1943740FE73E511A02752E9F7BA
+-419A22899376291AEC16C406B58BCAF3ED2316460BFE59B1948D1F6D68C99C22
+-93CA2F47FE17E3295A2DAC9027A0CC40375D60509FF1912ECA1AAFDEF3DDBEAB
+-3D07AEC239ABFC5FF282A8DFED095BCB1A5A205D4828648E9694E35EFBF5EA61
+-8836280FA0E3D038166FF8AE4B869905F61719593DCA9EA78F0AD3F36BEF85F8
+-634366C6A6E66F0B2CAF2BE9024A9F07A03830B7365E7E73BBA4A0E4BF8D96D5
+-27F3FAE60E98699ACCDC3A4DB94FC6D9178F62A212F4354923A9FE165F0127B5
+-EDF8D67EC6E45B4DCE0FF68D69EFB4AEF06AF51FFD8A5796F21C3F38BBE71D4A
+-8624F7E50EE40183B27E7E8B18DFC06CC02DD8B136145BF9A0DE190978C151DE
+-AF9EA9653101E2C59486869F2C0406FA114970533E7EBCA203B12F165F5C2FE3
+-BAC5D8BD676A29B9B39093FECD6FE1359BC30EAF5BEE9E8E2CE6CB9B19A1972C
+-2E0130639FA82166AB75BECDA0748F943BFBADB6C1D7892997735CFF53A96442
+-E7D8C15C5F798DB39A6509A9070FA646AD1F6C6699B1DC2FB188DCF27841AF31
+-E9B33E5512B18DAEA4C13009D1F92E19125993D8FF9644FCAB7414B9C12DF2FD
+-2582BFECE2748197527C72887F1F99A69D53ADAB8B63A1A5E98108903E217EEA
+-883238C475D5F614F12ED200366E4CB6B5F6AA0BB3DC7966C8F53BFF21269EA7
+-3E4298CBBF5D26480B352CC4794FFC86B7BF44ED8428DAE123038AE9562EC04F
+-6B0076BD8DBD24BC330AD9399972A4A946274DAD61A9CD621AD2D5FCB45F0E12
+-31B3A19589BE6B9CEEC530FB1140513DE6235A1ABCE7E5A8800F0282C6C24986
+-878404BE7530ED3C96AF4E6DA0D2CF1DE8465174D15F44D7862A7E3C3CF4FFFA
+-35E934817E2B36D6FECEEB999B16EF4708A9847D91D9713AA964AB7D478E1279
+-C271DBDAEAE17E25066F66DBB2E9E7365AA9BBCCB252B5A64FB861C354F67679
+-0FABE7C1ED3AB761033816D6BB0CB3B1151B38E242B6DEDA236400CA5031FDF2
+-6B5DC7199DB1F96936821C41833A3FDBCCEE2D9B8972EB0EC4EB3D96641AED5E
+-DCA22A1289EE25829AD85161AE66B7FC93FAB4F34050643755FBFB7EFF6C973C
+-F35E6E854758E20AEFFE435C8619AC965398791211854463046528B56391E346
+-88F32602BB7FC9D49DC864D46D2C87BFA05D3879BEB4750E40B6D63D95BE26E2
+-F15B297294F2D05191976FDEE7875AFB62B8A9440A89EFD07EDE787EE2FF7EA0
+-AC68A183CBECFA1D4FBA38E56DC4706628BA076E777D4F0A008BA42216C6D764
+-AC7049319ACADAFEFD29C2A6D33101A11A86C6C3D6C90E61AADD9BA9953AB485
+-2E4D97980DE948833674441085011CCA763F0D567229AE757AF842B3B0D93E10
+-1A3166A10A960A44D18F7A8A6C0E2CB2C0B8589F4E23256FA9B09291CDBC7DCB
+-8E9E2BFB1B0973B9FE24E1C8E120B73F095111BA6DE38E87FF1C3260F551B086
+-1C5BF9EB95B9AD45339406EFF08FDFA1844CD74AC4D4030821694A847954A0A7
+-7D9BBA6F55CC1AB951A815739957D880AF37670B212503106815E2177E710C64
+-829762B16BB57CD6AE5A668289CECFE1072F6D5900DAEEBCF093
+4B25D6FDDD45956A8ECAC7D4E624353575E13D49DD5AF366220D2AB92888B070
+2B8643F60A51A6ED31906F0AAE5F86D5AF28522D7DDE76E26C270701183E0047
+942C30D06D4F9BF3327B9AF9CAFBCA001B7C0328E4C7DB807BBDAD0771EC0FEF
@@ -148,7 +244,101 @@
+83CD370CE208AAC25A0E32F30EADF2050B71A795EA13A4D07728245BAE9EAAED
+C600B0EF658DD1A4D02466F90AB4EA0F908B64D5B00832EE12C40DC0B0A5E893
+4FDB520A423CF5ECC910C11C01905E075CD64CDD83F0A08473FB9DBC1ECE9471
-+[ 95 lines removed ]
++DE4399253D03E14A188BE5141A4062A50486D93EAEC19E116B4B8868053D57D0
++75935171EA1FDAD0E9501C46438C1763EFACA456CD55E427A4B35DDD5758CD18
++F678A95D1852957A849CE61DFCBC439708A42CD21CBCB198B7A370C52111D69B
++EF5C94E4D9D4A04FD82D259DD6DB7156CB5466B191EEE609E483D0012938367F
++3E568AAEFF333C21B11E27911E8A4A15C1DD1640104C322503F37A5A5ECF6980
++EA7317FE6AF1C31BA121A215078860FFF5548ECEC922E75955E8D643E8CE7C64
++24D33213B8D517AC827AE8F7075698E46D7BE31EB6A4CE7C16C4B3BA7A574D04
++3A76B249973D0B9E19C2D340CE23AA1E6D5D83072EB94F3358D7CACE85A35C05
++7F5C92141B37BE3DD8F4ABD4C6C2F2F4496FD3908090F860D09DB32951F54138
++43CC6664B2E25B48CA4AEFECF53BE8B30003C4ADC44AEC249D487AD6D0A02A67
++1001BC44508F84EB15F6BB2E774E3BD6EBCCF6ECB7D5DC0A521A02BD6044AD80
++4A571CEEB648BC7B6201FB42AA8EB8D88C032F6923692D4284A46F3FC0780000
++EC8E85C7D47557C950EA0CA5F1807D0292AB7441F18B999CEEA4EB2712C91D8C
++ADCCD80329CD494C0847D1F16CDE35A06301FFD26A3647271CEAFB80233112D6
++B33DFECEC2256D8744FEB8AD680C4C735A9B08AF8F7757A96B6D8207E75DF7C7
++665356FF04664D3F7F2453F488E11B5810B1EB019DC417AE160647EC43BCD4F1
++091E59E2D9A6DEA764D0D27EC86FFB089A9503D7553371571DBA06CBE97E9A49
++3027E3FEA2442566F2535BCAD5AAF50EEAE27373AF98EFD7ABFF7B8AA3866FB2
++47E94D79476064C6B40073A8076696CA9D12C1AB0579126883B8DD5AB04F805E
++878946C0808216311AB77A0C29FBBC15D8F35C647F3950DE2E0AE28C4B0147F5
++6AA18B3DBAA7CC79FB47976881358B2576FCEB0C9AE72E39865E404E77BC8229
++A810CED272DB3ED593F8A8390B7E572BC156EBDB449F156FD04C715A3040F33F
++F95CE5565495A5978375152F81E7215119A409D7F26568B22C4662A96B02D389
++4FDAE224F3A220F49F8F753BC676AF9517288610DF5FCF72C64977041CCAC8C8
++C110F1B0D5A33FBA3123F08CF4DEFC763916A6DB6D476420CE0E6992C7F0038F
++F519807D39C49D1590493A248E6F095517A2FCCC9DBB56EFEEFDD32C0FB8C9F2
++E4E11CEE209E5F7C13C7D4CF096EA47E012C3FCDF53F52F4F637D7BCEA2A6835
++B660CDFE9AE8E8FCF703BAA08D393AA0BA0A23A9B4D47A1CB2C78E9F8069449A
++723C38CD00FA7659B2409DA3F7C63A78A34E53649E3B1D7183F5780551B0B98F
++F73D42AA13C6FB7B5935A8938A0F5DBE18334BB631F2D5D02C5FA53F8BBC2D30
++7557FC7362F543411DCCA48A24EDFCC4C859D6330A63524DDB0B3CA4D345877D
++CE7EBA6C246542D253A89E1CAA482F2E48AA56435AA133FE758F4BD72875FA57
++09B56EA703211C2D6FB43BBFEEFD7AFB7EB6ACE1CE7CE8C9646142E4B244E66A
++85E4A21021E1BB294A2825E732E9D3531C871D1C63000CEC9C89A53C14764C3B
++E26C58207AAC906CD37142AF5339162727ED8C461C1F820BF97CC3ADD6B2A5D3
++5DEEA6755C401F422475FB6EB91EA078653744D8AB3417DD3F4D52F1B0DB5D68
++B20AE03459A0EF07659E7A90F3D5A1631807C9E9561F4BCFBD5BBF158F301224
++333D08BED33B43D781ED5C07699B9736D92D3B9407789360536D6D1231C4A3F3
++45CC27F8AB92E7A79B2C55DB06808BA42233BB7ABDECCE4958A02CFC4ECFD680
++54BC2D4F39FFF5B35CBD4DC37391A1457D59835B31633807D438D88141DEF145
++C773E93AE5D16E785D10C41EC26695E98A712AF908A0BE226DD0E61A199A22AB
++F47F0398A493991C57FBD364EE10D2D0DF7E2C602B088459F75F394542597F86
++776B8C31F710A1FFA1A8CA2B4877FBE1FC7B6E935403C68352BE2640537BDE9A
++191B86C353DB1793EFB4C3D5673133416041FFBE267A3B386BF7342CD03BC49A
++D9429952D2AF6D0208AEC4035D71CC153B2F53D88DD4933F95AA0ABBCA0769F0
++B85DBC79FB2936DF611E46519A5358FB08E21673F29578CA715F29CB22648A1D
++857741988E315FBE0C08871F4295CE738DE4A8572C9166CDDC3EC808A584DAB4
++664799A9AB516A9F0F51C7364CEDB5525E0CDA9F4B32B895976CC5F4A409D6B3
++E170526A37ADE42FF748B4F5702F0F061F83E586C14533C6AAFB75C42D534C1E
++CED0A6A9BFAA49F87CE3E65FDB0DDCE342F7BDA18B90CA794374BD32A0B5B7E6
++1EF0D2B8CD79CF8E4787795EECF348DC8E2DBD5876C15E3BBAB2532DF001BDA4
++CC4F54B3215D52D55FD27F24C524E7CFBF5E5D354F14104128369260BA6CF5AA
++8BE3EEE611C4FFC04DDCF340B8C7745F8D8AE1EA344644DD21335C0CBE551424
++67D8FA67C7C521FE3555BFFDCBBFB5E6EBF5ADDCCA45B1252FB2EC4FFE26A1AB
++03592F937209EDF01E64F413180CF3F6A668CB85D6A1FA413BA91FC2C9BDCBB3
++BC7C8267F87FE5C2B84FE0430838076C1F54585B7C572C12D87955C75D1914B1
++5EC0A95ED945831B14F54C5D99928275BF4A33646A3A99A65C55A2C49BCCF5D2
++E3F01A66364D4BFD3AD3572ED41BE2DAF80B16A4EA9C04AF731311328AC6EAAD
++D03886242C76AE8C01893B527D2CC609A71150EB44DAFF14731C0BA560A1C290
++0D93C77411BAB98C1236D9DF6F49943ABC69F0F2778731705AC3627C34215739
++8A3D9FCE819A2B2BE945A7DD7E2009B9E6ABF868AB6F2269079E4B12DB3A8FD6
++9783A34D2F9F6145899EA835B3F8B613B2B6AEB90975C2F94939839EBAFEAA16
++D06F80624ED16B812DF666BFE1348843EEE84E7B7833FED6D84E6F65F853E146
++0AE080B79ADC3E282B129B1A68A7A7A2012B57EFD3148EA7566DAB7C6138A6A4
++93EC15564B3836F70A1935FE73DFD34AC9ACAA60ED026535BC058784B5C7C82F
++9E0D241EF877621D168825E2CFDD136193E30C4EA3F9B0CBD698F88E6566D177
++942233D0EC0A9B60F193FAA528FD8D6B653D7F6DB241E5415CF34C15E337E74D
++D4AE2E27C086FBD5DE3A52A1D31FC251B4D1EA9993D0C03C57A1FCC39A1EC75F
++08C2845E7DA9F3689DBC97C0CFEE0546D007576F8218630FC25DB8035AFC68AA
++A22CCEF577FD4BFE4C1FF2A22D5042B2A916058F765CD6E5D30CD165F70F9F39
++953865DAD8A9442A230031D0A919EBF456FE031D6B1BE0C7D5D8F1399203B42E
++D7201D82660E309F53F510EB527235D8B1F80E822F08E7D32862FBB603738B27
++D1C0703BE4B32DBE38143CED975131E91B2D6D0913D08B55B5BFDFCA34E6BDDE
++6CE25F766F82E3EA7B986E40183C0ADEB410A40589139BCC2A3B58D6B5E4A21B
++70C4A984EE0B66CB421ADF5101D1095EC16768FF672742373C4F822579C56908
++3E083804BC25A9C1DD5E571BCAEF898990534F8CA68840D3080AB0DE80E1AA81
++8FD97803F7F67345EF73A609EA29CDACDDD10F89A049643310298E5A74812E55
++732E0921950D286C3BB8130B8383FFC74822BB8F46DFA4A8964D2C8A0E8D02E2
++EB73D4E7D5E677B9ED24D76003490B47D77CFCF27C502E134F9B0A58B1EFA344
++A73D5408A113935F894F330F2F62F52D774F81224C29A3219E39AE63151E691B
++D54556E17F89031AF131E6FB3AEBAEAC93DDFEDB8CDD87E9F56CF6249097306E
++15CF8C670B335D41F59317F44AC0AC460F38C9375A50F48E048D73A364C9A349
++9F2530D83F6621EF71106CF7DFFFDC29B337D843EF17D75C5A6D244BF52267A7
++CAF36A9DDCEE69D30447C349C5A6CF10C324DBA6675731B3312F2DCBCCA1FD1E
++609A4203B80E421BC1C440B64995392336AE538232C13966698914244AFE816C
++F04C80FBF6E052087D557D1585821545730623BCD485D1E8F0803EFCE197F62D
++DA58D11A9DCD7C536DF916C623F0AFA628461DE72BF61C8B564670E51D361F55
++B7B0D0728B3668576C1346890C27A2CC90111D5D6AFC8E06C9CF064EBE2E3253
++54BD68854E315F3D4A0FF29CEBF8A7D5E372882AFA43DD10F163E26DD283C77C
++E8B055992E1629C593EC28B5ECE0BDD42F6E1AABE45C6E160A700F3F75F11BA1
++F4D0F7E1EB7848B72FF625C9567BD588C022CAA2DC6606EA0CFE6F762FAF615E
++F4F8A205AC917CE938461057B47AD99CC2C66AF70B73C39A43EB686C8A803AE9
++3231F55087A56DE3A7DF0BA0DF74A64B324B0554EBD31C5318B59F987DC2D804
++B852838A5C06276A97D6D3AA747B38E7F7A8BA46D0E17DB201417C8355415E67
++C990413F049A21A5FE7E42035208DF556E253342802A0D
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
diff --git a/tests/test_difference.py b/tests/test_difference.py
index 1c01cbf..3349523 100644
--- a/tests/test_difference.py
+++ b/tests/test_difference.py
@@ -31,13 +31,6 @@ def test_too_much_input_for_diff(monkeypatch):
difference = Difference.from_text_readers(too_long_text_a, too_long_text_b, 'a', 'b')
assert '[ Too much input for diff ' in difference.unified_diff
-def test_too_long_diff_block_lines(monkeypatch):
- monkeypatch.setattr(Config, 'max_diff_block_lines', 10)
- too_long_text_a = io.StringIO("a\n" * 21)
- too_long_text_b = io.StringIO("b\n" * 21)
- difference = Difference.from_text_readers(too_long_text_a, too_long_text_b, 'a', 'b')
- assert '[ 11 lines removed ]' in difference.unified_diff
-
def test_non_str_arguments_to_source1_source2():
a = io.StringIO('a')
b = io.StringIO('b')
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/diffoscope.git
More information about the diffoscope
mailing list