]> source.dussan.org Git - gitea.git/commitdiff
Fix regex to support optional end line of old section in diff hunk (#5096)
authorkolaente <konrad@kola-entertainments.de>
Thu, 18 Oct 2018 02:03:49 +0000 (04:03 +0200)
committertechknowlogick <hello@techknowlogick.com>
Thu, 18 Oct 2018 02:03:49 +0000 (22:03 -0400)
+ Named groups in reges for easier group parsing

models/git_diff.go

index 44e7291c1f346df25a915597ca88d8727e0de5be..2a8019995d73781333dd539d19fcc31049c7aa9b 100644 (file)
@@ -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<beginOld>[0-9]+)(,(?P<endOld>[0-9]+))? \+(?P<beginNew>[0-9]+)(,(?P<endNew>[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