[Git][reproducible-builds/diffoscope][master] 6 commits: Make diff child page open in new window with remaining diff for --html-dir output

Chris Lamb gitlab at salsa.debian.org
Wed Jun 24 09:50:26 UTC 2020



Chris Lamb pushed to branch master at Reproducible Builds / diffoscope


Commits:
6b401188 by Jean-Romain Garnier at 2020-06-24T10:48:44+01:00
Make diff child page open in new window with remaining diff for --html-dir output

- - - - -
269d8569 by Jean-Romain Garnier at 2020-06-24T10:48:44+01:00
Fix zsh completion for --max-page-diff-block-lines

- - - - -
db15a423 by Jean-Romain Garnier at 2020-06-24T10:48:44+01:00
Include start of diff in html diff pages

- - - - -
7c39a6ae by Jean-Romain Garnier at 2020-06-24T10:48:44+01:00
Fix div tree for html child pages

- - - - -
3ca9c746 by Jean-Romain Garnier at 2020-06-24T10:48:44+01:00
Fix code formatting in html.py

- - - - -
7d350df4 by Jean-Romain Garnier at 2020-06-24T10:48:44+01:00
Make expanded pages cleaner in html output

- - - - -


5 changed files:

- debian/zsh-completion/_diffoscope
- diffoscope/config.py
- diffoscope/main.py
- diffoscope/presenters/html/html.py
- diffoscope/presenters/html/templates.py


Changes:

=====================================
debian/zsh-completion/_diffoscope
=====================================
@@ -26,8 +26,7 @@ _diffoscope() {
     '--max-report-size=[Maximum bytes of a report in a given format, across all of its pages. Note that some formats, such as --html, may be restricted by even smaller limits such as --max-page-size. (0 to disable, default: 41943040)]:' \
     '--max-diff-block-lines=[Maximum number of lines output per unified-diff block, across all pages. (0 to disable, default: 1024)]:' \
     '--max-page-size=[Maximum bytes of the top-level (--html-dir) or sole (--html) page. (default: %(default)s, remains in effect even with --no-default-limits)]:' \
-    '--max-page-size-child=[In --html-dir output, this is the maximum bytes of each child page (default: %(default)s, remains in effect even with --no-default-limits)]:' \
-    '--max-page-diff-block-lines=[Maximum number of lines output per unified-diff block on the top-level (--html-dir) or sole (--html) page, before spilling it into child pages (--html-dir) or skipping the rest of the diff block. Child pages are limited instead by --max-page-size-child. (default: %(default)s, remains in effect even with --no-default-limits)]:' \
+    '--max-page-diff-block-lines=[Maximum number of lines output per unified-diff block on the top-level (--html-dir) or sole (--html) page, before spilling it into a child page (--html-dir) or skipping the rest of the diff block. (default: %(default)s, remains in effect even with --no-default-limits)]:' \
     '--new-file[Treat absent files as empty]' \
     '--exclude=[Exclude files whose names (including any directory part) match %(metavar)s. Use this option to ignore files based on their names.]:' \
     '--exclude-command=[Exclude commands that match %(metavar)s. For example "^readelf.*\s--debug-dump=info" can take a long time and differences here are likely secondary differences caused by something represented elsewhere. Use this option to disable commands that use a lot of resources.]:' \


=====================================
diffoscope/config.py
=====================================
@@ -50,7 +50,6 @@ class Config:
         # structural limits, restricts single-file formats
         # semi-restricts multi-file formats
         self.max_page_size = defaultint(40 * 2 ** 20)  # 4 MB
-        self.max_page_size_child = defaultint(200 * 2 ** 10)  # 200 kB
         self.max_page_diff_block_lines = defaultint(2 ** 7)  # 128 lines
 
         self.max_text_report_size = 0
@@ -94,4 +93,3 @@ class Config:
     def check_constraints(self):
         self.check_ge("max_diff_block_lines", "max_page_diff_block_lines")
         self.check_ge("max_report_size", "max_page_size")
-        self.check_ge("max_report_size", "max_page_size_child")


=====================================
diffoscope/main.py
=====================================
@@ -256,24 +256,14 @@ def create_parser():
         "even with --no-default-limits)",
         default=Config().max_page_size,
     ).completer = RangeCompleter(Config().max_page_size)
-    group2.add_argument(
-        "--max-page-size-child",
-        metavar="BYTES",
-        type=int,
-        help="In --html-dir output, this is the maximum bytes of "
-        "each child page (default: %(default)s, remains in "
-        "effect even with --no-default-limits)",
-        default=str(Config().max_page_size_child),
-    ).completer = RangeCompleter(Config().max_page_size_child)
     group2.add_argument(
         "--max-page-diff-block-lines",
         metavar="LINES",
         type=int,
         help="Maximum number of lines output per unified-diff block "
         "on the top-level (--html-dir) or sole (--html) page, before "
-        "spilling it into child pages (--html-dir) or skipping the "
-        "rest of the diff block. Child pages are limited instead by "
-        "--max-page-size-child. (default: %(default)s, remains in "
+        "spilling it into a child page (--html-dir) or skipping the "
+        "rest of the diff block. (default: %(default)s, remains in "
         "effect even with --no-default-limits)",
         default=Config().max_page_diff_block_lines,
     ).completer = RangeCompleter(Config().max_page_diff_block_lines)
@@ -608,7 +598,6 @@ def configure(parsed_args):
             setattr(Config(), x, float("inf"))
 
     Config().max_page_size = parsed_args.max_page_size
-    Config().max_page_size_child = parsed_args.max_page_size_child
     Config().max_page_diff_block_lines = parsed_args.max_page_diff_block_lines
 
     Config().difftool = parsed_args.difftool


=====================================
diffoscope/presenters/html/html.py
=====================================
@@ -384,18 +384,23 @@ class HTMLSideBySidePresenter:
     def __init__(self):
         self.max_lines = Config().max_diff_block_lines  # only for html-dir
         self.max_lines_parent = Config().max_page_diff_block_lines
-        self.max_page_size_child = Config().max_page_size_child
 
     def new_unified_diff(self):
         self.spl_rows = 0
         self.spl_current_page = 0
-        self.spl_print_func = None
+        self._spl_print_func = None
         self.spl_print_ctrl = None
         # the below apply to child pages only, the parent page limit works
         # differently and is controlled by output_difference later below
         self.bytes_max_total = 0
         self.bytes_written = 0
         self.error_row = None
+        self.write_memory = None
+
+    def spl_print_func(self, line):
+        if self.write_memory is not None:
+            self.write_memory += line
+        self._spl_print_func(line)
 
     def output_hunk_header(self, hunk_off1, hunk_size1, hunk_off2, hunk_size2):
         self.spl_print_func('<tr class="diffhunk">')
@@ -439,7 +444,7 @@ class HTMLSideBySidePresenter:
     def spl_print_enter(self, print_context, rotation_params):
         # Takes ownership of print_context
         self.spl_print_ctrl = print_context.__exit__, rotation_params
-        self.spl_print_func = print_context.__enter__()
+        self._spl_print_func = print_context.__enter__()
         ctx, _ = rotation_params
         # Print file and table headers
         self.spl_print_func(
@@ -456,9 +461,10 @@ class HTMLSideBySidePresenter:
     def spl_print_exit(self, *exc_info):
         if not self.spl_had_entered_child():
             return False
+        self.spl_print_func(templates.EXPANDED_UD_FOOTER)
         self.spl_print_func(output_footer())
         _exit, _ = self.spl_print_ctrl
-        self.spl_print_func = None
+        self._spl_print_func = None
         self.spl_print_ctrl = None
         return _exit(*exc_info)
 
@@ -486,12 +492,7 @@ class HTMLSideBySidePresenter:
                 and self.bytes_written > self.bytes_max_total
             ):
                 raise PrintLimitReached()
-            if self.spl_print_func.bytes_written < self.max_page_size_child:
-                return False
-            logger.debug(
-                "new unified-diff subpage, previous subpage went over %s bytes",
-                self.max_page_size_child,
-            )
+            return False
 
         return True
 
@@ -499,21 +500,19 @@ class HTMLSideBySidePresenter:
         _, rotation_params = self.spl_print_ctrl
         ctx, mainname = rotation_params
         self.spl_current_page += 1
-        filename = "%s-%s.html" % (mainname, self.spl_current_page)
-
-        if self.spl_current_page > 1:
-            # previous page was a child, close it
-            self.spl_print_func(
-                templates.UD_TABLE_FOOTER
-                % {"filename": html.escape(filename), "text": "load diff"}
-            )
-            self.spl_print_func("</table>\n")
-            self.spl_print_exit(None, None, None)
+        filename = "%s.html" % (mainname)
 
         # rotate to the next child page
+        memory = self.write_memory
         context = spl_file_printer(ctx.directory, filename, self)
         self.spl_print_enter(context, rotation_params)
+
+        # Make sure child pages are embedded in a "difference" div so the
+        # css still works
+        self.spl_print_func(templates.EXPANDED_UD_HEADER)
         self.spl_print_func(templates.UD_TABLE_HEADER)
+        self.spl_print_func(memory)
+        self.write_memory = None
 
     def output_limit_reached(self, limit_type, total, bytes_processed):
         logger.debug("%s print limit reached", limit_type)
@@ -534,6 +533,9 @@ class HTMLSideBySidePresenter:
         Yields None for each extra child page, and then True or False depending
         on whether the whole output was truncated.
         """
+        # We need to memorize what is written in case a new page is created,
+        # which will have to host parts of the previous content
+        self.write_memory = ""
         try:
             ydiff = SideBySideDiff(unified_diff)
             for t, args in ydiff.items():
@@ -570,6 +572,7 @@ class HTMLSideBySidePresenter:
         finally:
             # no footer on the last page, just a close tag
             self.spl_print_func("</table>")
+            self.write_memory = None
         yield wrote_all
 
     def output_unified_diff(self, ctx, unified_diff, has_internal_linenos):
@@ -582,7 +585,7 @@ class HTMLSideBySidePresenter:
         try:
             udiff = io.StringIO()
             udiff.write(templates.UD_TABLE_HEADER)
-            self.spl_print_func = udiff.write
+            self._spl_print_func = udiff.write
             self.spl_print_ctrl = None, rotation_params
 
             it = self.output_unified_diff_table(
@@ -591,8 +594,9 @@ class HTMLSideBySidePresenter:
             wrote_all = next(it)
             if wrote_all is None:
                 assert self.spl_current_page == 1
+
                 # now pause the iteration and wait for consumer to give us a
-                # size-limit to write the remaining pages with
+                # size-limit to write the remaining page with
                 # exhaust the iterator and save the last item in wrote_all
                 new_limit = yield PartialString(
                     PartialString.escape(udiff.getvalue()) + "{0}</table>\n",
@@ -618,7 +622,7 @@ class HTMLSideBySidePresenter:
             self.spl_print_exit(None, None, None)
         finally:
             self.spl_print_ctrl = None
-            self.spl_print_func = None
+            self._spl_print_func = None
 
         truncated = not wrote_all
         child_rows_written = self.spl_rows - self.max_lines_parent
@@ -627,14 +631,11 @@ class HTMLSideBySidePresenter:
             # on the parent page
             parent_last_row = self.error_row
         else:
-            noun = "pieces" if self.spl_current_page > 1 else "piece"
-            text = "load diff (%s %s%s)" % (
-                self.spl_current_page,
-                noun,
-                (", truncated" if truncated else ""),
-            )
+            text = "Open expanded diff"
+            if truncated:
+                text += " (truncated)"
             parent_last_row = templates.UD_TABLE_FOOTER % {
-                "filename": html.escape("%s-1.html" % mainname),
+                "filename": html.escape("%s.html" % mainname),
                 "text": text,
             }
         yield self.bytes_written, parent_last_row
@@ -693,7 +694,6 @@ class HTMLPresenter(Presenter):
 
         return templates.DIFFNODE_LAZY_LOAD % {
             "pagename": pagename,
-            "pagesize": sizeof_fmt(Config().max_page_size_child),
             "size": sizeof_fmt(size),
         }
 
@@ -735,7 +735,7 @@ class HTMLPresenter(Presenter):
                 page_limit = (
                     Config().max_page_size
                     if ancestor is root_difference
-                    else Config().max_page_size_child
+                    else None
                 )
                 page_current = outputs[ancestor].size(placeholder_len)
                 report_current = self.report_printed + sum(
@@ -752,6 +752,8 @@ class HTMLPresenter(Presenter):
                 )
                 if report_current + want_to_add > self.report_limit:
                     make_new_subpage = False
+                elif ancestor is not root_difference:
+                    add_to_existing = True
                 elif page_current + want_to_add < page_limit:
                     add_to_existing = True
                 else:


=====================================
diffoscope/presenters/html/templates.py
=====================================
@@ -143,38 +143,20 @@ STYLES = """body.diffoscope {
 .diffoscope .diffsize {
   float: right;
 }
+.diffoscope table.diff tr.ondemand td, .diffoscope div.ondemand-details {
+  background: #f99;
+  text-align: center;
+  padding: 0.5em 0;
+}
+.diffoscope table.diff tr.ondemand:hover td, .diffoscope div.ondemand-details:hover {
+  background: #faa;
+  cursor: pointer;
+}
 """
 
 SCRIPTS = r"""<script src="%(jquery_url)s"></script>
 <script type="text/javascript">
 $(function() {
-  // activate "loading" controls
-  var load_cont, load_generic = function(selector, target, getInfo, postLoad) {
-    return function() {
-        var a = $(this).find("a");
-        var filename = a.attr('href');
-        var info = getInfo ? getInfo(a) : null;
-        var button = a.parent();
-        button.text('... loading ...');
-        (target ? target(button) : button).load(filename + " " + selector, function() {
-            // https://stackoverflow.com/a/8452751/946226
-            var elems = $(this).children(':first').unwrap();
-            // set this behaviour for the next link too
-            var td = elems.parent().find(".ondemand td");
-            td.on('click', load_cont);
-            postLoad ? postLoad(td, info) : null;
-        });
-        return false;
-    };
-  };
-  load_cont = load_generic("tr", function(x) { return x.parent(); }, function(a) {
-    var textparts = /^(.*)\((\d+) pieces?(.*)\)$/.exec(a.text());
-    var numleft = Number.parseInt(textparts[2]) - 1;
-    var noun = numleft == 1 ? "piece" : "pieces";
-    return textparts[1] + "(" + numleft + " " + noun + textparts[3] + ")";
-  }, function(td, info) { td.find("a").text(info); });
-  $(".ondemand td").on('click', load_cont);
-  $(".ondemand-details").on('click', load_generic("div.difference > *"));
   // activate [+]/[-] controls
   var diffcontrols = $(".diffcontrol");
   $(".diffheader").on('click', function(evt) {
@@ -201,15 +183,6 @@ $(function() {
 });
 </script>
 <style>
-.diffoscope table.diff tr.ondemand td, .diffoscope div.ondemand-details {
-  background: #f99;
-  text-align: center;
-  padding: 0.5em 0;
-}
-.diffoscope table.diff tr.ondemand:hover td, .diffoscope div.ondemand-details:hover {
-  background: #faa;
-  cursor: pointer;
-}
 .diffoscope .diffheader {
   cursor: pointer;
 }
@@ -223,9 +196,8 @@ $(function() {
 </style>
 """
 
-DIFFNODE_LAZY_LOAD = """<div class="ondemand-details" title="the size refers to the raw diff and includes all children;
-only the top %(pagesize)s of the HTML are loaded at a time">... <a
-href="%(pagename)s.html">load details (total %(size)s)</a> ...</div>
+DIFFNODE_LAZY_LOAD = """<div class="ondemand-details" title="the size refers to the raw diff and includes all children">... <a
+href="%(pagename)s.html" target="_blank">open details (total %(size)s)</a> ...</div>
 """
 
 DIFFNODE_LIMIT = """<div class="error">Max HTML report size reached</div>
@@ -238,10 +210,14 @@ UD_TABLE_HEADER = """<table class="diff">
 """
 
 UD_TABLE_FOOTER = """<tr class="ondemand"><td colspan="4">
-... <a href="%(filename)s">%(text)s</a> ...
+... <a href="%(filename)s" target="_blank">%(text)s</a> ...
 </td></tr>
 """
 
 UD_TABLE_LIMIT_FOOTER = """<tr class="error"><td colspan="4">
 Max %(limit_type)s reached; %(bytes_left)s/%(bytes_total)s bytes (%(percent).2f%%) of diff not shown.
 </td></tr>"""
+
+EXPANDED_UD_HEADER = """<div class="difference">"""
+
+EXPANDED_UD_FOOTER = """</div>"""



View it on GitLab: https://salsa.debian.org/reproducible-builds/diffoscope/-/compare/c7f9c8ea2e5734b3188b0c588c28fbfc7db36fe7...7d350df4732c946f01c7241e772b549f2a4a97ea

-- 
View it on GitLab: https://salsa.debian.org/reproducible-builds/diffoscope/-/compare/c7f9c8ea2e5734b3188b0c588c28fbfc7db36fe7...7d350df4732c946f01c7241e772b549f2a4a97ea
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.reproducible-builds.org/pipermail/rb-commits/attachments/20200624/c7235671/attachment.htm>


More information about the rb-commits mailing list