2ac7f55396
CI / test (pull_request) Successful in 13s
CI / review (gpt-4.1, gpt, GPT_REVIEW_TOKEN) (pull_request) Successful in 23s
CI / review (gpt-5, security, SECURITY_REVIEW.md, SONNET_REVIEW_TOKEN) (pull_request) Successful in 43s
CI / review (gpt-5, sonnet, SONNET_REVIEW_TOKEN) (pull_request) Successful in 1m29s
Findings that reference a file+line within the diff are now posted as inline comments directly on that line, in addition to appearing in the summary table. Findings outside the diff range stay in the body only. Implementation: - gitea/diff.go: ParseDiffNewLines extracts new-file line numbers from each hunk in the unified diff - gitea/client.go: PostReview accepts optional []ReviewComment with path + new_position + body (omitempty when nil) - cmd/review-bot/main.go: maps findings → inline comments when the line exists in the diff, passes them to PostReview Tests: - diff parser: multi-hunk, new files, empty diff, boundary lines - PostReview: with comments, nil comments (omitted from payload)
76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
package gitea
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestParseDiffLineRanges(t *testing.T) {
|
|
diff := `diff --git a/main.go b/main.go
|
|
index abc1234..def5678 100644
|
|
--- a/main.go
|
|
+++ b/main.go
|
|
@@ -10,6 +10,8 @@ func main() {
|
|
fmt.Println("hello")
|
|
+ fmt.Println("new line 11")
|
|
+ fmt.Println("new line 12")
|
|
fmt.Println("existing")
|
|
}
|
|
@@ -30,4 +32,5 @@ func other() {
|
|
return nil
|
|
+ // added at line 33
|
|
}
|
|
diff --git a/util.go b/util.go
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/util.go
|
|
@@ -0,0 +1,5 @@
|
|
+package main
|
|
+
|
|
+func helper() string {
|
|
+ return "hi"
|
|
+}
|
|
`
|
|
|
|
ranges := ParseDiffNewLines(diff)
|
|
|
|
// main.go should have lines 10-17 (first hunk) and 32-36 (second hunk)
|
|
if !ranges.Contains("main.go", 11) {
|
|
t.Error("expected main.go:11 to be in diff")
|
|
}
|
|
if !ranges.Contains("main.go", 12) {
|
|
t.Error("expected main.go:12 to be in diff")
|
|
}
|
|
if !ranges.Contains("main.go", 10) {
|
|
t.Error("expected main.go:10 to be in diff (context line)")
|
|
}
|
|
if !ranges.Contains("main.go", 33) {
|
|
t.Error("expected main.go:33 to be in diff")
|
|
}
|
|
if ranges.Contains("main.go", 25) {
|
|
t.Error("main.go:25 should NOT be in diff")
|
|
}
|
|
|
|
// util.go is entirely new, lines 1-5
|
|
if !ranges.Contains("util.go", 1) {
|
|
t.Error("expected util.go:1 to be in diff")
|
|
}
|
|
if !ranges.Contains("util.go", 5) {
|
|
t.Error("expected util.go:5 to be in diff")
|
|
}
|
|
if ranges.Contains("util.go", 6) {
|
|
t.Error("util.go:6 should NOT be in diff")
|
|
}
|
|
|
|
// Unknown file
|
|
if ranges.Contains("unknown.go", 1) {
|
|
t.Error("unknown.go should not be in diff")
|
|
}
|
|
}
|
|
|
|
func TestParseDiffNewLines_Empty(t *testing.T) {
|
|
ranges := ParseDiffNewLines("")
|
|
if ranges.Contains("any.go", 1) {
|
|
t.Error("empty diff should contain nothing")
|
|
}
|
|
}
|