[Reproducible-commits] [diffoscope] 01/01: Make some hardcoded limits configurable.
Reiner Herrmann
reiner at reiner-h.de
Wed Aug 19 14:40:10 UTC 2015
This is an automated email from the git hooks/post-receive script.
deki-guest pushed a commit to branch master
in repository diffoscope.
commit 334ecba65c17bff17c49c288d5a19b1f7ab03090
Author: Reiner Herrmann <reiner at reiner-h.de>
Date: Wed Aug 19 16:37:56 2015 +0200
Make some hardcoded limits configurable.
Closes: #795292
---
diffoscope.py | 11 +++++++--
diffoscope/config.py | 52 +++++++++++++++++++++++++++++++++++++++++++
diffoscope/difference.py | 13 +++++------
diffoscope/presenters/html.py | 9 +++-----
4 files changed, 70 insertions(+), 15 deletions(-)
diff --git a/diffoscope.py b/diffoscope.py
index 35c036d..3aea408 100755
--- a/diffoscope.py
+++ b/diffoscope.py
@@ -29,6 +29,7 @@ import sys
import traceback
from diffoscope import logger, VERSION, set_locale
import diffoscope.comparators
+from diffoscope.config import Config
from diffoscope.presenters.html import output_html
from diffoscope.presenters.text import output_text
@@ -50,6 +51,10 @@ def create_parser():
parser.add_argument('--max-report-size', metavar='BYTES',
dest='max_report_size', type=int,
help='maximum bytes written in report')
+ parser.add_argument('--max-diff-block-lines', dest='max_diff_block_lines', type=int,
+ help='maximum number of lines per diff block')
+ parser.add_argument('--max-diff-input-lines', dest='max_diff_input_lines', type=int,
+ help='maximum number of lines fed to diff')
parser.add_argument('--css', metavar='url', dest='css_url',
help='link to an extra CSS for the HTML report')
parser.add_argument('file1', help='first file to compare')
@@ -87,6 +92,9 @@ class ListToolsAction(argparse.Action):
def main():
parser = create_parser()
parsed_args = parser.parse_args(sys.argv[1:])
+ Config.setMaxDiffBlockLines(parsed_args.max_diff_block_lines)
+ Config.setMaxDiffInputLines(parsed_args.max_diff_input_lines)
+ Config.setMaxReportSize(parsed_args.max_report_size)
if parsed_args.debug:
logger.setLevel(logging.DEBUG)
set_locale()
@@ -95,8 +103,7 @@ def main():
if difference:
if parsed_args.html_output:
with make_printer(parsed_args.html_output) as print_func:
- output_html(difference, css_url=parsed_args.css_url, print_func=print_func,
- max_page_size=parsed_args.max_report_size)
+ output_html(difference, css_url=parsed_args.css_url, print_func=print_func)
if (parsed_args.text_output and parsed_args.text_output != parsed_args.html_output) or not parsed_args.html_output:
with make_printer(parsed_args.text_output or '-') as print_func:
output_text(difference, print_func=print_func)
diff --git a/diffoscope/config.py b/diffoscope/config.py
new file mode 100644
index 0000000..42e5226
--- /dev/null
+++ b/diffoscope/config.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+#
+# diffoscope: in-depth comparison of files, archives, and directories
+#
+# Copyright © 2015 Reiner Herrmann <reiner at reiner-h.de>
+#
+# diffoscope is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# diffoscope is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with diffoscope. If not, see <http://www.gnu.org/licenses/>.
+
+
+class Config(object):
+ MAX_DIFF_BLOCK_LINES = 50
+ MAX_DIFF_INPUT_LINES = 100000 # GNU diff cannot process arbitrary large files :(
+ MAX_REPORT_SIZE = 2000 * 2 ** 10 # 2000 kB
+
+ @classmethod
+ def setMaxDiffBlockLines(cls, lines):
+ if lines:
+ cls.MAX_DIFF_BLOCK_LINES = lines
+
+ @classmethod
+ def setMaxDiffInputLines(cls, lines):
+ if lines:
+ cls.MAX_DIFF_INPUT_LINES = lines
+
+ @classmethod
+ def setMaxReportSize(cls, bytes):
+ if bytes:
+ cls.MAX_REPORT_SIZE = bytes
+
+ @classmethod
+ def maxReportSize(cls):
+ return cls.MAX_REPORT_SIZE
+
+ @classmethod
+ def maxDiffBlockLines(cls):
+ return cls.MAX_DIFF_BLOCK_LINES
+
+ @classmethod
+ def maxDiffInputLines(cls):
+ return cls.MAX_DIFF_INPUT_LINES
+
diff --git a/diffoscope/difference.py b/diffoscope/difference.py
index 7c67c57..aa96e10 100644
--- a/diffoscope/difference.py
+++ b/diffoscope/difference.py
@@ -29,13 +29,10 @@ import traceback
from StringIO import StringIO
from threading import Thread
from multiprocessing import Queue
+from diffoscope.config import Config
from diffoscope import logger, tool_required, RequiredToolNotFound
-MAX_DIFF_BLOCK_LINES = 50
-MAX_DIFF_INPUT_LINES = 100000 # GNU diff cannot process arbitrary large files :(
-
-
class DiffParser(object):
RANGE_RE = re.compile(r'^@@\s+-(?P<start1>\d+)(,(?P<len1>\d+))?\s+\+(?P<start2>\d+)(,(?P<len2>\d+))?\s+@@$')
@@ -107,7 +104,8 @@ class DiffParser(object):
self._diff.write(line)
if line[0] in ('-', '+') and line[0] == self._direction:
self._block_len += 1
- if self._block_len >= MAX_DIFF_BLOCK_LINES:
+ max_lines = Config.maxDiffBlockLines()
+ if max_lines > 0 and self._block_len >= max_lines:
return self.skip_block
else:
self._block_len = 1
@@ -116,7 +114,7 @@ class DiffParser(object):
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 - MAX_DIFF_BLOCK_LINES))
+ self._diff.write('%s[ %d lines removed ]\n' % (self._direction, self._block_len - Config.maxDiffBlockLines()))
return self.read_hunk(line)
self._block_len += 1
self._remaining_hunk_lines -= 1
@@ -231,7 +229,8 @@ def make_feeder_from_file(in_file, filter=lambda buf: buf.encode('utf-8')):
for buf in in_file.readlines():
line_count += 1
out_file.write(filter(buf))
- if line_count >= MAX_DIFF_INPUT_LINES:
+ max_lines = Config.maxDiffInputLines()
+ if max_lines > 0 and line_count >= max_lines:
out_file.write('[ Too much input for diff ]%s\n' % (' ' * out_file.fileno()))
end_nl = True
break
diff --git a/diffoscope/presenters/html.py b/diffoscope/presenters/html.py
index f52df60..ded15a1 100644
--- a/diffoscope/presenters/html.py
+++ b/diffoscope/presenters/html.py
@@ -40,6 +40,7 @@ import sys
from tempfile import NamedTemporaryFile
from xml.sax.saxutils import escape
from diffoscope import logger, VERSION
+from diffoscope.config import Config
from diffoscope.comparators.utils import make_temp_directory
from diffoscope.presenters.icon import FAVICON_BASE64
@@ -153,8 +154,6 @@ FOOTER = """
</html>
"""
-DEFAULT_MAX_PAGE_SIZE = 2000 * 2 ** 10 # 2000 kB
-
class PrintLimitReached(Exception):
pass
@@ -513,12 +512,10 @@ def output_header(css_url, print_func):
})
-def output_html(difference, css_url=None, print_func=None, max_page_size=None):
+def output_html(difference, css_url=None, print_func=None):
if print_func is None:
print_func = print
- if max_page_size is None:
- max_page_size = DEFAULT_MAX_PAGE_SIZE
- print_func = create_limited_print_func(print_func, max_page_size)
+ print_func = create_limited_print_func(print_func, Config.maxReportSize())
try:
output_header(css_url, print_func)
output_difference(difference, print_func, [])
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/diffoscope.git
More information about the Reproducible-commits
mailing list