Merges a paste lands over go whole, but only the arrays over the paste spilled again, so one blocked by a replaced merge past the paste stayed blocked where opening the file spilled it (fuzz input 6452b8f0efea9063).
- commit
- b3554d3d8a1c76e4c585cd1bf55536c62740ac07
- parent
- 98cc85531ad3481a822a7d9b4e71c5ef92c63ffe
- author
- Dami <dami.etoile@gmail.com>
- kind
- fix risk score 1.5 of 3, Jev's estimate
| M | internal/ | 9 | ++++----- |
| M | internal/ | 18 | ++++++++++++++++++ |
| A | internal/ | 2 | ++ |
@@ -298,10 +298,9 @@ func (s *Sheet) pasteMerges(carried []Rect, p pasteLayout) {
298298 if len(carried) == 0 {299299 return300300 }301- next := slices.DeleteFunc(slices.Clone(s.view.merges), func(m Rect) bool {302- _, overlaps := intersectRect(m, p.dst)303- return overlaps304- })301+ // The merges it replaces may reach past it: arrays they blocked302+ // there spill again too.303+ next, span := s.mergesOutside(p.dst)305304 for tr := range p.down {306305 for tc := range p.across {307306 at := Addr{Col: p.dst.From.Col + tc*p.tw, Row: p.dst.From.Row + tr*p.th}@@ -312,7 +311,7 @@ func (s *Sheet) pasteMerges(carried []Rect, p pasteLayout) {
312311 }313312 }314313 }315- s.setMerges(next, p.dst)314+ s.setMerges(next, span)316315 }317316 318317 // moveMerges moves the merges wholly inside src on from to dst on s, as@@ -69,3 +69,21 @@ func TestUnmergeFreesArrayPastTheRange(t *testing.T) {
6969 t.Errorf("H12 once the merge went = %v", v)7070 }7171 }72+73+// A paste carrying merges replaces those it lands over, whole: an array74+// that one blocked past the paste spills again.75+func TestPastedMergeFreesAnArrayPastIt(t *testing.T) {76+ s := New()77+ if err := s.Merge(NewRect(at("A1"), at("A2")), MergeAll); err != nil {78+ t.Fatal(err)79+ }80+ if err := s.Merge(NewRect(at("B14"), at("C14")), MergeAll); err != nil {81+ t.Fatal(err)82+ }83+ s.Set(at("B14"), "=SEQUENCE(2)")84+ wantShown(t, s, map[string]string{"B14": "#REF!"})85+ if _, err := s.Paste(s.Copy(NewRect(at("A1"), at("A2"))), NewRect(at("C13"), at("C14")), false); err != nil {86+ t.Fatal(err)87+ }88+ wantShown(t, s, map[string]string{"B14": "1", "B15": "2"})89+}