From dc572598af8e50d3185d54a443548104ef19877b Mon Sep 17 00:00:00 2001 From: Oleksii Usatov <62352097+ousatov-ua@users.noreply.github.com> Date: Sat, 24 Jul 2021 14:41:16 +0300 Subject: [PATCH 01/11] Update formatter.go --- cmd/formatter.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/cmd/formatter.go b/cmd/formatter.go index 38aa914..81b3d5a 100644 --- a/cmd/formatter.go +++ b/cmd/formatter.go @@ -227,6 +227,7 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi includes = f.ctx.GetValueColumns() } blue := color.New(color.FgBlue).SprintfFunc() + magenta := color.New(color.FgMagenta).SprintfFunc() red := color.New(color.FgRed).SprintfFunc() green := color.New(color.FgGreen).SprintfFunc() @@ -236,13 +237,31 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi } _, _ = fmt.Fprintln(f.stderr, blue("# Modifications (%d)", len(diff.Modifications))) + + _, _ = fmt.Fprintln(f.stderr, magenta("## Duplicated row modifications")) for _, modification := range diff.Modifications { - result := make([]string, 0, len(modification.Current)) - for i := 0; i < len(includes) || i < len(modification.Current); i++ { - if modification.Original[i] != modification.Current[i] { + mCurrent := len(modification.Current) + mOriginal := len(modification.Original) + for i := 0; i < len(includes) || i < mCurrent; i++ { + if mOriginal == 0 { + _, _ = fmt.Fprintln(f.stdout, magenta(additionFormat, modification.Current)) + break + } + } + } + for _, modification := range diff.Modifications { + mCurrent := len(modification.Current) + mOriginal := len(modification.Original) + + result := make([]string, 0, mCurrent) + + for i := 0; i < len(includes) || i < mCurrent; i++ { + if mOriginal != 0 && modification.Original[i] != modification.Current[i] { removed := red(deletionFormat, modification.Original[i]) added := green(additionFormat, modification.Current[i]) result = append(result, fmt.Sprintf("%s%s", removed, added)) + } else if mOriginal == 0 { + break } else { result = append(result, modification.Current[i]) } From 5ca5424bbd5f659483c65a5513c286e203b31554 Mon Sep 17 00:00:00 2001 From: Oleksii Usatov <62352097+ousatov-ua@users.noreply.github.com> Date: Sat, 24 Jul 2021 16:57:16 +0300 Subject: [PATCH 02/11] Update diff.go --- pkg/digest/diff.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pkg/digest/diff.go b/pkg/digest/diff.go index ada060d..3982ff4 100644 --- a/pkg/digest/diff.go +++ b/pkg/digest/diff.go @@ -96,19 +96,24 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) if baseValue, present := base.Digests[d.Key]; present { if baseValue != d.Value { // Modification - msgChannel <- message{_type: modification, current: d.Source, original: base.SourceMap[d.Key]} + msgChannel <- message{_type: modification, current: d.Source, original: base.SourceMap[d.Key][0]} } // delete from sourceMap so that at the end only deletions are left in base - delete(base.SourceMap, d.Key) + sources := base.SourceMap[d.Key] + if len(sources) == 1 { + delete(base.SourceMap, d.Key) + continue + } + sources = sources[:len(sources)-1] + base.SourceMap[d.Key] = sources } else { // Addition msgChannel <- message{_type: addition, current: d.Source} } } } - for _, value := range base.SourceMap { - msgChannel <- message{_type: deletion, current: value} + msgChannel <- message{_type: deletion, current: value[0]} } }(baseFileDigest, digestChannel, msgChannel) From cc3950259380e2c22a25b4d7ad327624bb0eab00 Mon Sep 17 00:00:00 2001 From: Oleksii Usatov <62352097+ousatov-ua@users.noreply.github.com> Date: Sat, 24 Jul 2021 16:58:11 +0300 Subject: [PATCH 03/11] Update digest.go --- pkg/digest/digest.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/digest/digest.go b/pkg/digest/digest.go index e140fb8..aaa09e0 100644 --- a/pkg/digest/digest.go +++ b/pkg/digest/digest.go @@ -30,13 +30,13 @@ const bufferSize = 512 // Create can create a Digest using the Configurations passed. // It returns the digest as a map[uint64]uint64. // It can also keep track of the Source line. -func Create(config *Config) (map[uint64]uint64, map[uint64][]string, error) { +func Create(config *Config) (map[uint64]uint64, map[uint64][][]string, error) { maxProcs := runtime.NumCPU() reader := csv.NewReader(config.Reader) reader.Comma = config.Separator reader.LazyQuotes = config.LazyQuotes output := make(map[uint64]uint64) - sourceMap := make(map[uint64][]string) + sourceMap := make(map[uint64][][]string) digestChannel := make(chan []Digest, bufferSize*maxProcs) errorChannel := make(chan error) @@ -47,7 +47,9 @@ func Create(config *Config) (map[uint64]uint64, map[uint64][]string, error) { for digests := range digestChannel { for _, digest := range digests { output[digest.Key] = digest.Value - sourceMap[digest.Key] = digest.Source + sources :=sourceMap[digest.Key] + sources = append(sources, digest.Source) + sourceMap[digest.Key] = sources } } From 427835dec351b40f790baa1b46c1a64fd06c39f7 Mon Sep 17 00:00:00 2001 From: Oleksii Usatov <62352097+ousatov-ua@users.noreply.github.com> Date: Sat, 24 Jul 2021 16:58:32 +0300 Subject: [PATCH 04/11] Update file_digest.go --- pkg/digest/file_digest.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pkg/digest/file_digest.go b/pkg/digest/file_digest.go index db68c36..4a2b52b 100644 --- a/pkg/digest/file_digest.go +++ b/pkg/digest/file_digest.go @@ -7,7 +7,7 @@ import ( // FileDigest represents the digests created from one file type FileDigest struct { Digests map[uint64]uint64 - SourceMap map[uint64][]string + SourceMap map[uint64][][]string lock *sync.Mutex } @@ -15,7 +15,7 @@ type FileDigest struct { func NewFileDigest() *FileDigest { return &FileDigest{ Digests: make(map[uint64]uint64), - SourceMap: make(map[uint64][]string), + SourceMap: make(map[uint64][][]string), lock: &sync.Mutex{}, } } @@ -24,7 +24,9 @@ func NewFileDigest() *FileDigest { // This operation is not thread safe func (f *FileDigest) Append(d Digest) { f.Digests[d.Key] = d.Value - f.SourceMap[d.Key] = d.Source + sources :=f.SourceMap[d.Key] + sources = append(sources, d.Source) + f.SourceMap[d.Key] = sources } // SafeAppend a Digest to a FileDigest @@ -34,5 +36,7 @@ func (f *FileDigest) SafeAppend(d Digest) { defer f.lock.Unlock() f.Digests[d.Key] = d.Value - f.SourceMap[d.Key] = d.Source + sources :=f.SourceMap[d.Key] + sources = append(sources, d.Source) + f.SourceMap[d.Key] = sources } From 856efe1d777328ad2d05eb0ccc52451e1b7e1fa1 Mon Sep 17 00:00:00 2001 From: Oleksii Usatov <62352097+ousatov-ua@users.noreply.github.com> Date: Sat, 24 Jul 2021 16:59:47 +0300 Subject: [PATCH 05/11] Update formatter.go --- cmd/formatter.go | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/cmd/formatter.go b/cmd/formatter.go index 81b3d5a..38aa914 100644 --- a/cmd/formatter.go +++ b/cmd/formatter.go @@ -227,7 +227,6 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi includes = f.ctx.GetValueColumns() } blue := color.New(color.FgBlue).SprintfFunc() - magenta := color.New(color.FgMagenta).SprintfFunc() red := color.New(color.FgRed).SprintfFunc() green := color.New(color.FgGreen).SprintfFunc() @@ -237,31 +236,13 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi } _, _ = fmt.Fprintln(f.stderr, blue("# Modifications (%d)", len(diff.Modifications))) - - _, _ = fmt.Fprintln(f.stderr, magenta("## Duplicated row modifications")) for _, modification := range diff.Modifications { - mCurrent := len(modification.Current) - mOriginal := len(modification.Original) - for i := 0; i < len(includes) || i < mCurrent; i++ { - if mOriginal == 0 { - _, _ = fmt.Fprintln(f.stdout, magenta(additionFormat, modification.Current)) - break - } - } - } - for _, modification := range diff.Modifications { - mCurrent := len(modification.Current) - mOriginal := len(modification.Original) - - result := make([]string, 0, mCurrent) - - for i := 0; i < len(includes) || i < mCurrent; i++ { - if mOriginal != 0 && modification.Original[i] != modification.Current[i] { + result := make([]string, 0, len(modification.Current)) + for i := 0; i < len(includes) || i < len(modification.Current); i++ { + if modification.Original[i] != modification.Current[i] { removed := red(deletionFormat, modification.Original[i]) added := green(additionFormat, modification.Current[i]) result = append(result, fmt.Sprintf("%s%s", removed, added)) - } else if mOriginal == 0 { - break } else { result = append(result, modification.Current[i]) } From d7f75416fe8fba6a71030192de9ac22e05d3b039 Mon Sep 17 00:00:00 2001 From: Oleksii Usatov Date: Sat, 24 Jul 2021 17:17:30 +0300 Subject: [PATCH 06/11] Updated --- go.mod | 2 +- go.sum | 4 ++++ pkg/digest/file_digest.go | 8 ++------ pkg/digest/file_digest_test.go | 3 ++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 91756f0..9c9b682 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.1.2 github.com/spf13/cobra v0.0.5 - github.com/stretchr/testify v1.4.0 + github.com/stretchr/testify v1.7.0 golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa // indirect ) diff --git a/go.sum b/go.sum index 6ac221e..84cc1da 100644 --- a/go.sum +++ b/go.sum @@ -50,6 +50,8 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -63,3 +65,5 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/digest/file_digest.go b/pkg/digest/file_digest.go index 4a2b52b..bdc0378 100644 --- a/pkg/digest/file_digest.go +++ b/pkg/digest/file_digest.go @@ -24,9 +24,7 @@ func NewFileDigest() *FileDigest { // This operation is not thread safe func (f *FileDigest) Append(d Digest) { f.Digests[d.Key] = d.Value - sources :=f.SourceMap[d.Key] - sources = append(sources, d.Source) - f.SourceMap[d.Key] = sources + f.SourceMap[d.Key] = append(f.SourceMap[d.Key], d.Source) } // SafeAppend a Digest to a FileDigest @@ -36,7 +34,5 @@ func (f *FileDigest) SafeAppend(d Digest) { defer f.lock.Unlock() f.Digests[d.Key] = d.Value - sources :=f.SourceMap[d.Key] - sources = append(sources, d.Source) - f.SourceMap[d.Key] = sources + f.SourceMap[d.Key] = append(f.SourceMap[d.Key], d.Source) } diff --git a/pkg/digest/file_digest_test.go b/pkg/digest/file_digest_test.go index 2c33620..e6fbf0b 100644 --- a/pkg/digest/file_digest_test.go +++ b/pkg/digest/file_digest_test.go @@ -25,7 +25,8 @@ func TestFileDigest_Append(t *testing.T) { assert.NotNil(t, fd) assert.Len(t, fd.Digests, 1) assert.Len(t, fd.SourceMap, 1) - assert.Len(t, fd.SourceMap[uint64(1)], 0) + assert.Len(t, fd.SourceMap[uint64(1)], 1) + assert.Len(t, fd.SourceMap[uint64(1)][0], 0) } func TestFileDigest_SafeAppend(t *testing.T) { From 47c521ef37e38b81d11eb0c21f1a502b6e79b651 Mon Sep 17 00:00:00 2001 From: Oleksii Usatov Date: Sat, 24 Jul 2021 21:00:25 +0300 Subject: [PATCH 07/11] Added check of exactly content --- cmd/formatter.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cmd/formatter.go b/cmd/formatter.go index 38aa914..dcc5032 100644 --- a/cmd/formatter.go +++ b/cmd/formatter.go @@ -227,6 +227,7 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi includes = f.ctx.GetValueColumns() } blue := color.New(color.FgBlue).SprintfFunc() + cyan := color.New(color.FgHiCyan).SprintfFunc() red := color.New(color.FgRed).SprintfFunc() green := color.New(color.FgGreen).SprintfFunc() @@ -236,10 +237,12 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi } _, _ = fmt.Fprintln(f.stderr, blue("# Modifications (%d)", len(diff.Modifications))) - for _, modification := range diff.Modifications { + for index, modification := range diff.Modifications { result := make([]string, 0, len(modification.Current)) + found := false for i := 0; i < len(includes) || i < len(modification.Current); i++ { if modification.Original[i] != modification.Current[i] { + found = true removed := red(deletionFormat, modification.Original[i]) added := green(additionFormat, modification.Current[i]) result = append(result, fmt.Sprintf("%s%s", removed, added)) @@ -247,7 +250,11 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi result = append(result, modification.Current[i]) } } - _, _ = fmt.Fprintln(f.stdout, includes.String(result, f.ctx.separator)) + if found { + _, _ = fmt.Fprintln(f.stdout, includes.String(result, f.ctx.separator)) + } else { + _, _ = fmt.Fprintln(f.stdout, cyan("Modification # %d is not in content, skipped", index)) + } } _, _ = fmt.Fprintln(f.stderr, blue("# Deletions (%d)", len(diff.Deletions))) From be23bebeaab85b83c216821148c1e5b941a9dd1e Mon Sep 17 00:00:00 2001 From: Oleksii Usatov Date: Sun, 25 Jul 2021 09:12:02 +0300 Subject: [PATCH 08/11] Fixed processing of file --- cmd/formatter.go | 11 ++------- go.mod | 1 + pkg/digest/diff.go | 47 +++++++++++++++++++++++++++++---------- pkg/digest/file_digest.go | 8 +++---- 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/cmd/formatter.go b/cmd/formatter.go index dcc5032..38aa914 100644 --- a/cmd/formatter.go +++ b/cmd/formatter.go @@ -227,7 +227,6 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi includes = f.ctx.GetValueColumns() } blue := color.New(color.FgBlue).SprintfFunc() - cyan := color.New(color.FgHiCyan).SprintfFunc() red := color.New(color.FgRed).SprintfFunc() green := color.New(color.FgGreen).SprintfFunc() @@ -237,12 +236,10 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi } _, _ = fmt.Fprintln(f.stderr, blue("# Modifications (%d)", len(diff.Modifications))) - for index, modification := range diff.Modifications { + for _, modification := range diff.Modifications { result := make([]string, 0, len(modification.Current)) - found := false for i := 0; i < len(includes) || i < len(modification.Current); i++ { if modification.Original[i] != modification.Current[i] { - found = true removed := red(deletionFormat, modification.Original[i]) added := green(additionFormat, modification.Current[i]) result = append(result, fmt.Sprintf("%s%s", removed, added)) @@ -250,11 +247,7 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi result = append(result, modification.Current[i]) } } - if found { - _, _ = fmt.Fprintln(f.stdout, includes.String(result, f.ctx.separator)) - } else { - _, _ = fmt.Fprintln(f.stdout, cyan("Modification # %d is not in content, skipped", index)) - } + _, _ = fmt.Fprintln(f.stdout, includes.String(result, f.ctx.separator)) } _, _ = fmt.Fprintln(f.stderr, blue("# Deletions (%d)", len(diff.Deletions))) diff --git a/go.mod b/go.mod index 9c9b682..2c7537c 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/spf13/cobra v0.0.5 github.com/stretchr/testify v1.7.0 golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa // indirect + golang.org/x/text v0.3.0 // indirect ) go 1.13 diff --git a/pkg/digest/diff.go b/pkg/digest/diff.go index 3982ff4..d2c1eff 100644 --- a/pkg/digest/diff.go +++ b/pkg/digest/diff.go @@ -48,7 +48,7 @@ func Diff(baseConfig, deltaConfig Config) (Differences, error) { baseFileDigest := NewFileDigest() for digests := range baseDigestChannel { for _, d := range digests { - baseFileDigest.Append(d) + baseFileDigest.SafeAppend(d) } } @@ -94,18 +94,37 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) for digests := range digestChannel { for _, d := range digests { if baseValue, present := base.Digests[d.Key]; present { - if baseValue != d.Value { - // Modification - msgChannel <- message{_type: modification, current: d.Source, original: base.SourceMap[d.Key][0]} + last := len(baseValue) - 1 + for i, v := range baseValue { + if v != d.Value && i == last { + + // Modification + msgChannel <- message{_type: modification, current: d.Source, original: base.SourceMap[d.Key][i]} + + sources := base.SourceMap[d.Key] + if len(sources) == 1 { + delete(base.SourceMap, d.Key) + break + } + sources = append(sources[:i], sources[i+1:]...) + baseValue = RemoveIndex(baseValue, i) + base.SourceMap[d.Key] = sources + base.Digests[d.Key] = baseValue + break + } else if v == d.Value { + // delete from sourceMap so that at the end only deletions are left in base + sources := base.SourceMap[d.Key] + if len(sources) == 1 { + delete(base.SourceMap, d.Key) + break + } + sources = append(sources[:i], sources[i+1:]...) + baseValue = RemoveIndex(baseValue, i) + base.SourceMap[d.Key] = sources + base.Digests[d.Key] = baseValue + break + } } - // delete from sourceMap so that at the end only deletions are left in base - sources := base.SourceMap[d.Key] - if len(sources) == 1 { - delete(base.SourceMap, d.Key) - continue - } - sources = sources[:len(sources)-1] - base.SourceMap[d.Key] = sources } else { // Addition msgChannel <- message{_type: addition, current: d.Source} @@ -120,3 +139,7 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) return msgChannel } + +func RemoveIndex(s []uint64, index int) []uint64 { + return append(s[:index], s[index+1:]...) +} diff --git a/pkg/digest/file_digest.go b/pkg/digest/file_digest.go index bdc0378..6c8fb81 100644 --- a/pkg/digest/file_digest.go +++ b/pkg/digest/file_digest.go @@ -6,7 +6,7 @@ import ( // FileDigest represents the digests created from one file type FileDigest struct { - Digests map[uint64]uint64 + Digests map[uint64][]uint64 SourceMap map[uint64][][]string lock *sync.Mutex } @@ -14,7 +14,7 @@ type FileDigest struct { // NewFileDigest to instantiate a new FileDigest func NewFileDigest() *FileDigest { return &FileDigest{ - Digests: make(map[uint64]uint64), + Digests: make(map[uint64][]uint64), SourceMap: make(map[uint64][][]string), lock: &sync.Mutex{}, } @@ -23,7 +23,7 @@ func NewFileDigest() *FileDigest { // Append a Digest to a FileDigest // This operation is not thread safe func (f *FileDigest) Append(d Digest) { - f.Digests[d.Key] = d.Value + f.Digests[d.Key] = append(f.Digests[d.Key], d.Value) f.SourceMap[d.Key] = append(f.SourceMap[d.Key], d.Source) } @@ -33,6 +33,6 @@ func (f *FileDigest) SafeAppend(d Digest) { f.lock.Lock() defer f.lock.Unlock() - f.Digests[d.Key] = d.Value + f.Digests[d.Key] = append(f.Digests[d.Key], d.Value) // key the same but value is different f.SourceMap[d.Key] = append(f.SourceMap[d.Key], d.Source) } From 7c6f74ffbc868dce36780a007c3737b2ebc260ae Mon Sep 17 00:00:00 2001 From: Oleksii Usatov Date: Sun, 25 Jul 2021 09:22:22 +0300 Subject: [PATCH 09/11] Fixed processing of file --- pkg/digest/diff.go | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/pkg/digest/diff.go b/pkg/digest/diff.go index d2c1eff..3c21e12 100644 --- a/pkg/digest/diff.go +++ b/pkg/digest/diff.go @@ -95,23 +95,20 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) for _, d := range digests { if baseValue, present := base.Digests[d.Key]; present { last := len(baseValue) - 1 + stopSearch := false for i, v := range baseValue { if v != d.Value && i == last { // Modification msgChannel <- message{_type: modification, current: d.Source, original: base.SourceMap[d.Key][i]} - - sources := base.SourceMap[d.Key] - if len(sources) == 1 { - delete(base.SourceMap, d.Key) - break - } - sources = append(sources[:i], sources[i+1:]...) - baseValue = RemoveIndex(baseValue, i) - base.SourceMap[d.Key] = sources - base.Digests[d.Key] = baseValue - break + stopSearch = true } else if v == d.Value { + stopSearch = true + } else { + stopSearch = false + } + if stopSearch { + // delete from sourceMap so that at the end only deletions are left in base sources := base.SourceMap[d.Key] if len(sources) == 1 { @@ -119,7 +116,7 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) break } sources = append(sources[:i], sources[i+1:]...) - baseValue = RemoveIndex(baseValue, i) + baseValue = append(baseValue[:i], baseValue[i+1:]...) base.SourceMap[d.Key] = sources base.Digests[d.Key] = baseValue break @@ -139,7 +136,3 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) return msgChannel } - -func RemoveIndex(s []uint64, index int) []uint64 { - return append(s[:index], s[index+1:]...) -} From 7a9c4ae60a563a97c112809e34445dfad4f4a90b Mon Sep 17 00:00:00 2001 From: Oleksii Usatov Date: Mon, 26 Jul 2021 12:09:02 +0300 Subject: [PATCH 10/11] Fixed diffs for delete --- pkg/digest/diff.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/digest/diff.go b/pkg/digest/diff.go index 3c21e12..81a39f3 100644 --- a/pkg/digest/diff.go +++ b/pkg/digest/diff.go @@ -129,7 +129,9 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) } } for _, value := range base.SourceMap { - msgChannel <- message{_type: deletion, current: value[0]} + for _, v := range value { + msgChannel <- message{_type: deletion, current: v} + } } }(baseFileDigest, digestChannel, msgChannel) From 04fb08bdcc38d741ec7aa408656742b29782e976 Mon Sep 17 00:00:00 2001 From: Oleksii Usatov Date: Tue, 27 Jul 2021 19:59:46 +0300 Subject: [PATCH 11/11] Fixed diffs for delete --- pkg/digest/diff.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/digest/diff.go b/pkg/digest/diff.go index 81a39f3..9996461 100644 --- a/pkg/digest/diff.go +++ b/pkg/digest/diff.go @@ -115,6 +115,10 @@ func streamDifferences(baseFileDigest *FileDigest, digestChannel chan []Digest) delete(base.SourceMap, d.Key) break } + if sources == nil { + msgChannel <- message{_type: addition, current: d.Source} + break + } sources = append(sources[:i], sources[i+1:]...) baseValue = append(baseValue[:i], baseValue[i+1:]...) base.SourceMap[d.Key] = sources