From 99bea95b726805c44392c60da888f6b67b9ed3a1 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Fri, 18 Feb 2022 15:11:19 -0500 Subject: [PATCH] Fix left-most diff cases. refs #18721 Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- hgvs/diff.go | 21 +++++++++++++++++++++ hgvs/diff_test.go | 22 ++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/hgvs/diff.go b/hgvs/diff.go index 206cf7e56c..780cfacf10 100644 --- a/hgvs/diff.go +++ b/hgvs/diff.go @@ -144,6 +144,27 @@ func cleanup(in []diffmatchpatch.Diff) (out []diffmatchpatch.Diff) { in[i+1] = ins in[i+2] = eq } + // when diffmatchpatch says [=yyyyXXXX, delX, =zzz], + // we really want [=yyyy, delX, =XXXXzzz] (ditto for + // ins instead of del) + if i < len(in)-2 && + d.Type == diffmatchpatch.DiffEqual && + in[i+1].Type != diffmatchpatch.DiffEqual && + in[i+2].Type == diffmatchpatch.DiffEqual && + len(in[i+1].Text) <= len(d.Text) { + for cut := 0; cut < len(d.Text); cut++ { + skip := strings.Index(d.Text[cut:], in[i+1].Text) + if skip < 0 { + break + } + cut += skip + if d.Text[cut:]+in[i+1].Text == in[i+1].Text+d.Text[cut:] { + in[i+2].Text = d.Text[cut:] + in[i+2].Text + d.Text = d.Text[:cut] + break + } + } + } // diffmatchpatch solves diff("AXX","XXX") with // [delA,=XX,insX] but we prefer to spell it // [delA,insX,=XX]. diff --git a/hgvs/diff_test.go b/hgvs/diff_test.go index a5e861e35a..10acdb772c 100644 --- a/hgvs/diff_test.go +++ b/hgvs/diff_test.go @@ -148,6 +148,28 @@ func (s *diffSuite) TestDiff(c *check.C) { b: "tcGCcggac", expect: []string{"3A>G", "4T>C", "7del"}, }, + { + // should delete leftmost + a: "acgacaTTtttacac", + b: "acgacatttacac", + expect: []string{"7_8del"}, + }, + { + // should insert leftmost + a: "acgacatttacac", + b: "acgacaTTtttacac", + expect: []string{"6_7insTT"}, + }, + { + a: "ccccaGATAtat", + b: "ccccatat", + expect: []string{"6_9del"}, + }, + { + a: "aGATAtat", + b: "atat", + expect: []string{"2_5del"}, + }, } { c.Log(trial) var vars []string -- 2.30.2