git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 2/8] xdl_change_compact(): only use heuristic if group can't be matched

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Sep 5, 2016, 09:44 UTC
Message-ID
<d2fd0eefdf6e4f2884df3214b32606e5b43e0555.1473068229.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1473068229.git.mhagger@alum.mit.edu>

If the changed group of lines can be matched to a group in the other file, then that positioning should take precedence over the compaction heuristic.

The old code tried the heuristic unconditionally, which cost redundant effort and also was broken if the matching code had already shifted the group higher than the blank line.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 xdiff/xdiffi.c | 38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c
index 95b037e..61deed8 100644
--- a/xdiff/xdiffi.c
+++ b/xdiff/xdiffi.c
@@ -504,25 +504,25 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
 			}
 		} while (grpsiz != ix - ixs);
 
-		/*
-		 * Try to move back the possibly merged group of changes, to match
-		 * the recorded position in the other file.
-		 */
-		while (ixref < ix) {
-			rchg[--ixs] = 1;
-			rchg[--ix] = 0;
-			while (rchgo[--ixo]);
-		}
-
-		/*
-		 * If a group can be moved back and forth, see if there is a
-		 * blank line in the moving space. If there is a blank line,
-		 * make sure the last blank line is the end of the group.
-		 *
-		 * As we already shifted the group forward as far as possible
-		 * in the earlier loop, we need to shift it back only if at all.
-		 */
-		if ((flags & XDF_COMPACTION_HEURISTIC) && blank_lines) {
+		if (ixref < ix) {
+			/*
+			 * Try to move back the possibly merged group of changes, to match
+			 * the recorded position in the other file.
+			 */
+			while (ixref < ix) {
+				rchg[--ixs] = 1;
+				rchg[--ix] = 0;
+				while (rchgo[--ixo]);
+			}
+		} else if ((flags & XDF_COMPACTION_HEURISTIC) && blank_lines) {
+			/*
+			 * The group can be slid up to make its last line a
+			 * blank line. Do so.
+			 *
+			 * As we already shifted the group forward as far as
+			 * possible in the earlier loop, we need to shift it
+			 * back only if at all.
+			 */
 			while (ixs > 0 &&
 			       !is_blank_line(recs, ix - 1, flags) &&
 			       recs_match(recs, ixs - 1, ix - 1, flags)) {
-- 
2.9.3
Previous: Michael HaggertyNext: Michael Haggerty
Message 5 of 16 in “Better heuristics make prettier diffs”
  1. 0/8 Better heuristics make prettier diffsMichael Haggerty, Sep 5, 2016
  2. 1/8 xdl_change_compact(): fix compaction heuristic to adjust ixoMichael Haggerty, Sep 5, 2016
  3. 7/8 parse-options: add parse_opt_unknown_cb()Michael Haggerty, Sep 5, 2016
  4. 3/8 is_blank_line(): take a single xrecord_t as argumentMichael Haggerty, Sep 5, 2016
  5. 2/8 xdl_change_compact(): only use heuristic if group can't be matchedMichael Haggerty, Sep 5, 2016
  6. 5/8 xdl_change_compact(): introduce the concept of a change groupMichael Haggerty, Sep 5, 2016
  7. 8/8 blame: honor the diff heuristic options and configMichael Haggerty, Sep 5, 2016
  8. 6/8 diff: improve positioning of add/delete blocks in diffsMichael Haggerty, Sep 5, 2016
  9. 4/8 recs_match(): take two xrecord_t pointers as argumentsMichael Haggerty, Sep 5, 2016
  10. Junio C HamanoSep 7, 2016
  11. Jacob KellerSep 7, 2016
  12. Junio C HamanoSep 7, 2016
  13. Michael HaggertySep 19, 2016
  14. Junio C HamanoSep 19, 2016
  15. Junio C HamanoSep 19, 2016
  16. Michael HaggertySep 20, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.