From e79e9248fd9d539ecc912fcc24e7a669ce98bdaf Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 18 Oct 2018 04:03:49 +0200 Subject: [PATCH] Fix regex to support optional end line of old section in diff hunk (#5096) + Named groups in reges for easier group parsing --- models/git_diff.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/models/git_diff.go b/models/git_diff.go index 44e7291c1f..2a8019995d 100644 --- a/models/git_diff.go +++ b/models/git_diff.go @@ -273,7 +273,7 @@ func (diff *Diff) NumFiles() int { } // Example: @@ -1,8 +1,9 @@ => [..., 1, 8, 1, 9] -var hunkRegex = regexp.MustCompile(`^@@ -([0-9]+),([0-9]+) \+([0-9]+)(,([0-9]+))? @@`) +var hunkRegex = regexp.MustCompile(`^@@ -(?P[0-9]+)(,(?P[0-9]+))? \+(?P[0-9]+)(,(?P[0-9]+))? @@`) func isHeader(lof string) bool { return strings.HasPrefix(lof, cmdDiffHead) || strings.HasPrefix(lof, "---") || strings.HasPrefix(lof, "+++") @@ -311,21 +311,28 @@ func CutDiffAroundLine(originalDiff io.Reader, line int64, old bool, numbersOfLi if len(hunk) > headerLines { break } - groups := hunkRegex.FindStringSubmatch(lof) + // A map with named groups of our regex to recognize them later more easily + submatches := hunkRegex.FindStringSubmatch(lof) + groups := make(map[string]string) + for i, name := range hunkRegex.SubexpNames() { + if i != 0 && name != "" { + groups[name] = submatches[i] + } + } if old { - begin = com.StrTo(groups[1]).MustInt64() - end = com.StrTo(groups[2]).MustInt64() + begin = com.StrTo(groups["beginOld"]).MustInt64() + end = com.StrTo(groups["endOld"]).MustInt64() // init otherLine with begin of opposite side - otherLine = com.StrTo(groups[3]).MustInt64() + otherLine = com.StrTo(groups["beginNew"]).MustInt64() } else { - begin = com.StrTo(groups[3]).MustInt64() - if groups[5] != "" { - end = com.StrTo(groups[5]).MustInt64() + begin = com.StrTo(groups["beginNew"]).MustInt64() + if groups["endNew"] != "" { + end = com.StrTo(groups["endNew"]).MustInt64() } else { end = 0 } // init otherLine with begin of opposite side - otherLine = com.StrTo(groups[1]).MustInt64() + otherLine = com.StrTo(groups["beginOld"]).MustInt64() } end += begin // end is for real only the number of lines in hunk // lof is between begin and end