aboutsummaryrefslogtreecommitdiffstats
path: root/utils/diff/diff.go
diff options
context:
space:
mode:
authorVadim Markovtsev <vadim@sourced.tech>2019-03-13 16:35:59 +0100
committerVadim Markovtsev <vadim@sourced.tech>2019-03-13 16:47:04 +0100
commita80a9e54409de2b17e4ca2e5a04bf4f0ac4b6fed (patch)
treeb4fbfcb3650bf4aa807ef179f8160da0f6d21966 /utils/diff/diff.go
parent3dc0d500ef5d983e4b132cb4b44b2780855dbfa5 (diff)
downloadgo-git-a80a9e54409de2b17e4ca2e5a04bf4f0ac4b6fed.tar.gz
Add diff.DoWithTimeout()
Signed-off-by: Vadim Markovtsev <vadim@sourced.tech>
Diffstat (limited to 'utils/diff/diff.go')
-rw-r--r--utils/diff/diff.go18
1 files changed, 16 insertions, 2 deletions
diff --git a/utils/diff/diff.go b/utils/diff/diff.go
index 8539230..6142ed0 100644
--- a/utils/diff/diff.go
+++ b/utils/diff/diff.go
@@ -14,10 +14,24 @@ import (
)
// Do computes the (line oriented) modifications needed to turn the src
-// string into the dst string.
+// string into the dst string. The underlying algorithm is Meyers,
+// its complexity is O(N*d) where N is min(lines(src), lines(dst)) and d
+// is the size of the diff.
func Do(src, dst string) (diffs []diffmatchpatch.Diff) {
+ // the default timeout is time.Second which may be too small under heavy load
+ return DoWithTimeout(src, dst, time.Hour)
+}
+
+// DoWithTimeout computes the (line oriented) modifications needed to turn the src
+// string into the dst string. The `timeout` argument specifies the maximum
+// amount of time it is allowed to spend in this function. If the timeout
+// is exceeded, the parts of the strings which were not considered are turned into
+// a bulk delete+insert and the half-baked suboptimal result is returned at once.
+// The underlying algorithm is Meyers, its complexity is O(N*d) where N is
+// min(lines(src), lines(dst)) and d is the size of the diff.
+func DoWithTimeout (src, dst string, timeout time.Duration) (diffs []diffmatchpatch.Diff) {
dmp := diffmatchpatch.New()
- dmp.DiffTimeout = time.Hour // the default is time.Second which may be too little under heavy load
+ dmp.DiffTimeout = timeout
wSrc, wDst, warray := dmp.DiffLinesToRunes(src, dst)
diffs = dmp.DiffMainRunes(wSrc, wDst, false)
diffs = dmp.DiffCharsToLines(diffs, warray)