Skip to content

Commit 603d9ce

Browse files
committed
Parse and generate formatted comment MD with Evergreen URLs
1 parent 3e87d2a commit 603d9ce

File tree

1 file changed

+120
-0
lines changed
  • internal/cmd/perfcomp/parseperfcomp

1 file changed

+120
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// Copyright (C) MongoDB, Inc. 2025-present.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
// not use this file except in compliance with the License. You may obtain
5+
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6+
7+
package main
8+
9+
import (
10+
"bufio"
11+
"fmt"
12+
"log"
13+
"net/url"
14+
"os"
15+
"strings"
16+
)
17+
18+
const parsePerfCompDir = "./internal/cmd/perfcomp/parseperfcomp/"
19+
const perfReportFileTxt = "perf-report.txt"
20+
const perfReportFileMd = "perf-report.md"
21+
const perfVariant = "^perf$"
22+
23+
func main() {
24+
var line string
25+
26+
// open file to read
27+
fRead, err := os.Open(parsePerfCompDir + perfReportFileTxt)
28+
if err != nil {
29+
log.Fatalf("Could not open %s: %v", perfReportFileTxt, err)
30+
}
31+
defer fRead.Close()
32+
33+
// open file to write
34+
fWrite, err := os.Create(perfReportFileMd)
35+
if err != nil {
36+
log.Fatalf("Could not create %s: %v", perfReportFileMd, err)
37+
}
38+
defer fWrite.Close()
39+
40+
// read the file line by line using scanner
41+
scanner := bufio.NewScanner(fRead)
42+
43+
var version string
44+
var evgLink string
45+
46+
for scanner.Scan() {
47+
line = scanner.Text()
48+
if strings.Contains(line, "Version ID:") {
49+
// parse version
50+
version = strings.Split(line, " ")[2]
51+
} else if strings.Contains(line, "Commit SHA:") {
52+
// parse commit SHA and write header
53+
fmt.Fprintf(fWrite, "\n<details>\n<summary>%s</summary>\n\t<br>\n\n", line)
54+
} else if strings.Contains(line, "version "+version) {
55+
// dynamic Evergreen perf task link
56+
evgLink, err = generateEvgLink(version, perfVariant)
57+
if err != nil {
58+
log.Println(err)
59+
fmt.Fprintf(fWrite, "%s\n", line)
60+
} else {
61+
printUrlToLine(fWrite, line, evgLink, "version", -1)
62+
}
63+
} else if strings.Contains(line, "For a comprehensive view of all microbenchmark results for this PR's commit, please check out the Evergreen perf task for this patch.") {
64+
// last line of comment
65+
evgLink, err = generateEvgLink(version, "")
66+
if err != nil {
67+
log.Println(err)
68+
fmt.Fprintf(fWrite, "%s\n", line)
69+
} else {
70+
printUrlToLine(fWrite, line, evgLink, "Evergreen", 0)
71+
}
72+
} else {
73+
// all other regular lines
74+
fmt.Fprintf(fWrite, "%s\n", line)
75+
}
76+
}
77+
78+
fmt.Fprintf(fWrite, "</details>\n")
79+
}
80+
81+
func generateEvgLink(version string, variant string) (string, error) {
82+
baseUrl := "https://spruce.mongodb.com"
83+
page := "0"
84+
sorts := "STATUS:ASC;BASE_STATUS:DESC"
85+
86+
u, err := url.Parse(baseUrl)
87+
if err != nil {
88+
return "", fmt.Errorf("Error parsing URL: %v", err)
89+
}
90+
91+
u.Path = fmt.Sprintf("version/%s/tasks", version)
92+
93+
// construct query parameters
94+
queryParams := url.Values{}
95+
queryParams.Add("page", page)
96+
queryParams.Add("sorts", sorts)
97+
if variant != "" {
98+
queryParams.Add("variant", variant)
99+
}
100+
101+
u.RawQuery = queryParams.Encode()
102+
return u.String(), nil
103+
}
104+
105+
func printUrlToLine(fWrite *os.File, line string, link string, targetWord string, step int) {
106+
words := strings.Split(line, " ")
107+
for i, w := range words {
108+
if i > 0 && words[i+step] == targetWord {
109+
fmt.Fprintf(fWrite, "[%s](%s)", w, link)
110+
} else {
111+
fmt.Fprint(fWrite, w)
112+
}
113+
114+
if i < len(words)-1 {
115+
fmt.Fprint(fWrite, " ")
116+
} else {
117+
fmt.Fprint(fWrite, "\n")
118+
}
119+
}
120+
}

0 commit comments

Comments
 (0)