From 0e489b52cafe7f4c26582cedc69c0a6cb97d243b Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sun, 13 Oct 2024 14:32:35 +0200 Subject: [PATCH] hunk: add context Add Hunk.Context field. Context is the optional part at the end of the @@ line. Usually it contains the changed function name, so it may be useful to e.g. understand that all hunks belong to a single function. --- parser.go | 6 ++++-- testdata/significant/add.diff | 2 +- testdata/significant/add.diff.msg | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/parser.go b/parser.go index 70cdcdd..f547d5b 100644 --- a/parser.go +++ b/parser.go @@ -33,7 +33,7 @@ type ChangeList []ContentChange // Hunk is a line that starts with @@. // Each hunk shows one area where the files differ // Unified format hunks look like this: -// @@ from-file-line-numbers to-file-line-numbers @@ +// @@ from-file-line-numbers to-file-line-numbers @@( context)? // // line-from-either-file // line-from-either-file… @@ -45,6 +45,7 @@ type Hunk struct { CountOld int `json:"count_old"` StartLineNumberNew int `json:"start_line_number_new"` CountNew int `json:"count_new"` + Context string `json:"context,omitempty"` } func (changes *ChangeList) IsSignificant() bool { @@ -57,7 +58,7 @@ func (changes *ChangeList) IsSignificant() bool { } func NewHunk(line string) (Hunk, error) { - namedHunkRegex := regexp.MustCompile(`(?m)^@@ -(?P\d+),?(?P\d+)? \+(?P\d+),?(?P\d+)? @@`) + namedHunkRegex := regexp.MustCompile(`(?m)^@@ -(?P\d+),?(?P\d+)? \+(?P\d+),?(?P\d+)? @@ ?(?P.*)?`) match := namedHunkRegex.FindStringSubmatch(line) result := make(map[string]string) for i, name := range namedHunkRegex.SubexpNames() { @@ -86,6 +87,7 @@ func NewHunk(line string) (Hunk, error) { CountOld: countOld, StartLineNumberNew: startLineNumberNew, CountNew: countNew, + Context: result["context"], }, nil } diff --git a/testdata/significant/add.diff b/testdata/significant/add.diff index b40e2de..f8ff1db 100644 --- a/testdata/significant/add.diff +++ b/testdata/significant/add.diff @@ -3,5 +3,5 @@ new file mode 100644 index 0000000..7898192 --- /dev/null +++ b/a.txt -@@ -0,0 +1 @@ +@@ -0,0 +1 @@ test context +a diff --git a/testdata/significant/add.diff.msg b/testdata/significant/add.diff.msg index 67952c4..4826ec3 100755 --- a/testdata/significant/add.diff.msg +++ b/testdata/significant/add.diff.msg @@ -1 +1 @@ -significant diff &git_diff_parser.FileDiff{FromFile:"a.txt", ToFile:"a.txt", Type:"modify", IsBinary:false, NewMode:"100644", Hunks:[]git_diff_parser.Hunk{git_diff_parser.Hunk{ChangeList:git_diff_parser.ChangeList{git_diff_parser.ContentChange{Type:"add", From:"", To:"a"}, git_diff_parser.ContentChange{Type:"", From:"", To:""}}, StartLineNumberOld:0, CountOld:0, StartLineNumberNew:1, CountNew:1}}, BinaryPatch:[]git_diff_parser.BinaryPatch(nil)} \ No newline at end of file +significant diff &git_diff_parser.FileDiff{FromFile:"a.txt", ToFile:"a.txt", Type:"modify", IsBinary:false, NewMode:"100644", Hunks:[]git_diff_parser.Hunk{git_diff_parser.Hunk{ChangeList:git_diff_parser.ChangeList{git_diff_parser.ContentChange{Type:"add", From:"", To:"a"}, git_diff_parser.ContentChange{Type:"", From:"", To:""}}, StartLineNumberOld:0, CountOld:0, StartLineNumberNew:1, CountNew:1, Context:"test context"}}, BinaryPatch:[]git_diff_parser.BinaryPatch(nil)} \ No newline at end of file