Skip to content

Commit 58b8e75

Browse files
authored
Fix Custom PR Title in Aggregated Mode (#496)
1 parent b41dfdc commit 58b8e75

File tree

9 files changed

+170
-60
lines changed

9 files changed

+170
-60
lines changed

scanrepository/scanrepository.go

+12-11
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type ScanRepositoryCmd struct {
4040
// Determines whether to open a pull request for each vulnerability fix or to aggregate all fixes into one pull request
4141
aggregateFixes bool
4242
// The current project technology
43-
projectTech coreutils.Technology
43+
projectTech []coreutils.Technology
4444
// Stores all package manager handlers for detected issues
4545
handlers map[coreutils.Technology]packagehandlers.PackageHandler
4646
}
@@ -81,7 +81,7 @@ func (cfp *ScanRepositoryCmd) scanAndFixBranch(repository *utils.Repository) (er
8181
}()
8282
for i := range repository.Projects {
8383
cfp.scanDetails.Project = &repository.Projects[i]
84-
cfp.projectTech = ""
84+
cfp.projectTech = []coreutils.Technology{}
8585
if err = cfp.scanAndFixProject(repository); err != nil {
8686
return
8787
}
@@ -163,6 +163,7 @@ func (cfp *ScanRepositoryCmd) scan(currentWorkingDir string) (*audit.Results, er
163163
contextualAnalysisResultsExists := len(auditResults.ExtendedScanResults.ApplicabilityScanResults) > 0
164164
entitledForJas := auditResults.ExtendedScanResults.EntitledForJas
165165
cfp.OutputWriter.SetJasOutputFlags(entitledForJas, contextualAnalysisResultsExists)
166+
cfp.projectTech = auditResults.ExtendedScanResults.ScannedTechnologies
166167
return auditResults, nil
167168
}
168169

@@ -358,19 +359,19 @@ func (cfp *ScanRepositoryCmd) openAggregatedPullRequest(fixBranchName string, pu
358359
return cfp.scanDetails.Client().UpdatePullRequest(context.Background(), cfp.scanDetails.RepoOwner, cfp.scanDetails.RepoName, pullRequestTitle, prBody, pullRequestInfo.Target.Name, int(pullRequestInfo.ID), vcsutils.Open)
359360
}
360361

361-
func (cfp *ScanRepositoryCmd) preparePullRequestDetails(vulnerabilitiesDetails ...*utils.VulnerabilityDetails) (string, string, error) {
362+
func (cfp *ScanRepositoryCmd) preparePullRequestDetails(vulnerabilitiesDetails ...*utils.VulnerabilityDetails) (prTitle string, prBody string, err error) {
362363
if cfp.dryRun && cfp.aggregateFixes {
363364
// For testings, don't compare pull request body as scan results order may change.
364-
return outputwriter.GetAggregatedPullRequestTitle(cfp.projectTech), "", nil
365+
return cfp.gitManager.GenerateAggregatedPullRequestTitle(cfp.projectTech), "", nil
365366
}
366367
vulnerabilitiesRows := utils.ExtractVulnerabilitiesDetailsToRows(vulnerabilitiesDetails)
367-
prBody := cfp.OutputWriter.VulnerabilitiesTitle(false) + "\n" + cfp.OutputWriter.VulnerabilitiesContent(vulnerabilitiesRows) + cfp.OutputWriter.UntitledForJasMsg() + cfp.OutputWriter.Footer()
368+
prBody = cfp.OutputWriter.VulnerabilitiesTitle(false) + "\n" + cfp.OutputWriter.VulnerabilitiesContent(vulnerabilitiesRows) + cfp.OutputWriter.UntitledForJasMsg() + cfp.OutputWriter.Footer()
368369
if cfp.aggregateFixes {
369-
scanHash, err := utils.VulnerabilityDetailsToMD5Hash(vulnerabilitiesRows...)
370-
if err != nil {
371-
return "", "", err
370+
var scanHash string
371+
if scanHash, err = utils.VulnerabilityDetailsToMD5Hash(vulnerabilitiesRows...); err != nil {
372+
return
372373
}
373-
return outputwriter.GetAggregatedPullRequestTitle(cfp.projectTech), prBody + outputwriter.MarkdownComment(fmt.Sprintf("Checksum: %s", scanHash)), nil
374+
return cfp.gitManager.GenerateAggregatedPullRequestTitle(cfp.projectTech), prBody + outputwriter.MarkdownComment(fmt.Sprintf("Checksum: %s", scanHash)), nil
374375
}
375376
// In separate pull requests there is only one vulnerability
376377
vulnDetails := vulnerabilitiesDetails[0]
@@ -435,8 +436,8 @@ func (cfp *ScanRepositoryCmd) addVulnerabilityToFixVersionsMap(vulnerability *fo
435436
if len(vulnerability.FixedVersions) == 0 {
436437
return nil
437438
}
438-
if cfp.projectTech == "" {
439-
cfp.projectTech = vulnerability.Technology
439+
if len(cfp.projectTech) == 0 {
440+
cfp.projectTech = []coreutils.Technology{vulnerability.Technology}
440441
}
441442
vulnFixVersion := getMinimalFixVersion(vulnerability.ImpactedDependencyVersion, vulnerability.FixedVersions)
442443
if vulnFixVersion == "" {

scanrepository/scanrepository_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ func TestScanRepositoryCmd_Run(t *testing.T) {
9898
},
9999
{
100100
testName: "aggregate-multi-project",
101-
expectedPackagesInBranch: map[string][]string{"frogbot-update-npm-dependencies": {"uuid", "minimatch", "mpath"}, "frogbot-update-pip-dependencies": {"pyjwt", "pexpect"}},
102-
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-npm-dependencies": {"^9.0.0", "^0.8.4", "^3.0.5"}, "frogbot-update-pip-dependencies": {"2.4.0"}},
101+
expectedPackagesInBranch: map[string][]string{"frogbot-update-npm-dependencies": {"uuid", "minimatch", "mpath"}, "frogbot-update-Pip-dependencies": {"pyjwt", "pexpect"}},
102+
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-npm-dependencies": {"^9.0.0", "^0.8.4", "^3.0.5"}, "frogbot-update-Pip-dependencies": {"2.4.0"}},
103103
packageDescriptorPaths: []string{"npm/package.json", "pip/requirements.txt"},
104104
aggregateFixes: true,
105105
configPath: "../testdata/scanrepository/cmd/aggregate-multi-project/.frogbot/frogbot-config.yml",
@@ -113,8 +113,8 @@ func TestScanRepositoryCmd_Run(t *testing.T) {
113113
},
114114
{
115115
testName: "aggregate-cant-fix",
116-
expectedPackagesInBranch: map[string][]string{"frogbot-update-pip-dependencies": {}},
117-
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-pip-dependencies": {}},
116+
expectedPackagesInBranch: map[string][]string{"frogbot-update-Pip-dependencies": {}},
117+
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-Pip-dependencies": {}},
118118
packageDescriptorPaths: []string{"setup.py"}, // This is a build tool dependency which should not be fixed
119119
aggregateFixes: true,
120120
},
@@ -698,13 +698,13 @@ func TestPreparePullRequestDetails(t *testing.T) {
698698
expectedPrBody = "<div align='center'>\n\n[![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/vulnerabilitiesFixBannerPR.png)](https://github.com/jfrog/frogbot#readme)\n\n</div>\n\n\n\n## 📦 Vulnerable Dependencies\n\n### ✍️ Summary\n\n<div align=\"center\">\n\n\n| SEVERITY | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: | \n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)<br> High | | package1:1.0.0 | 1.0.0<br>2.0.0 | CVE-2022-1234 |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableCriticalSeverity.png)<br>Critical | | package2:2.0.0 | 2.0.0<br>3.0.0 | CVE-2022-4321 |\n\n</div>\n\n## 🔬 Research Details\n\n<details>\n<summary> <b>[ CVE-2022-1234 ] package1 1.0.0</b> </summary>\n<br>\n\n**Description:**\nsummary\n\n\n</details>\n\n\n<details>\n<summary> <b>[ CVE-2022-4321 ] package2 2.0.0</b> </summary>\n<br>\n\n**Description:**\nsummary\n\n\n</details>\n\n\n---\n<div align=\"center\">\n\n[🐸 JFrog Frogbot](https://github.com/jfrog/frogbot#readme)\n\n</div>\n\n[comment]: <> (Checksum: bec823edaceb5d0478b789798e819bde)\n"
699699
prTitle, prBody, err = cfp.preparePullRequestDetails(vulnerabilities...)
700700
assert.NoError(t, err)
701-
assert.Equal(t, outputwriter.GetAggregatedPullRequestTitle(""), prTitle)
701+
assert.Equal(t, cfp.gitManager.GenerateAggregatedPullRequestTitle([]coreutils.Technology{}), prTitle)
702702
assert.Equal(t, expectedPrBody, prBody)
703703
cfp.OutputWriter = &outputwriter.SimplifiedOutput{}
704704
expectedPrBody = "**🚨 This automated pull request was created by Frogbot and fixes the below:**\n\n\n---\n## 📦 Vulnerable Dependencies\n---\n\n### ✍️ Summary\n\n\n| SEVERITY | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: | \n| High | | package1:1.0.0 | 1.0.0, 2.0.0 | CVE-2022-1234 |\n| Critical | | package2:2.0.0 | 2.0.0, 3.0.0 | CVE-2022-4321 |\n\n---\n## 🔬 Research Details\n---\n\n\n#### [ CVE-2022-1234 ] package1 1.0.0\n\n\n**Description:**\nsummary\n\n\n#### [ CVE-2022-4321 ] package2 2.0.0\n\n\n**Description:**\nsummary\n\n\n\n---\n**Frogbot** also supports **Contextual Analysis, Secret Detection and IaC Vulnerabilities Scanning**. This features are included as part of the [JFrog Advanced Security](https://jfrog.com/xray/) package, which isn't enabled on your system.\n\n[🐸 JFrog Frogbot](https://github.com/jfrog/frogbot#readme)\n\n[comment]: <> (Checksum: bec823edaceb5d0478b789798e819bde)\n"
705705
prTitle, prBody, err = cfp.preparePullRequestDetails(vulnerabilities...)
706706
assert.NoError(t, err)
707-
assert.Equal(t, outputwriter.GetAggregatedPullRequestTitle(""), prTitle)
707+
assert.Equal(t, cfp.gitManager.GenerateAggregatedPullRequestTitle([]coreutils.Technology{}), prTitle)
708708
assert.Equal(t, expectedPrBody, prBody)
709709
}
710710

utils/consts.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,12 @@ const (
8282
BranchHashPlaceHolder = "${BRANCH_NAME_HASH}"
8383

8484
// Default naming templates
85-
BranchNameTemplate = "frogbot-" + PackagePlaceHolder + "-" + BranchHashPlaceHolder
86-
AggregatedBranchNameTemplate = "frogbot-update-" + BranchHashPlaceHolder + "-dependencies"
87-
CommitMessageTemplate = "Upgrade " + PackagePlaceHolder + " to " + FixVersionPlaceHolder
88-
PullRequestTitleTemplate = outputwriter.FrogbotTitlePrefix + " Update version of " + PackagePlaceHolder + " to " + FixVersionPlaceHolder
85+
BranchNameTemplate = "frogbot-" + PackagePlaceHolder + "-" + BranchHashPlaceHolder
86+
AggregatedBranchNameTemplate = "frogbot-update-" + BranchHashPlaceHolder + "-dependencies"
87+
CommitMessageTemplate = "Upgrade " + PackagePlaceHolder + " to " + FixVersionPlaceHolder
88+
PullRequestTitleTemplate = outputwriter.FrogbotTitlePrefix + " Update version of " + PackagePlaceHolder + " to " + FixVersionPlaceHolder
89+
AggregatePullRequestTitleDefaultTemplate = outputwriter.FrogbotTitlePrefix + " Update %s dependencies"
90+
AggregatePullRequestTitle = outputwriter.FrogbotTitlePrefix + " Update dependencies"
8991
// Frogbot Git author details showed in commits
9092
frogbotAuthorName = "JFrog-Frogbot"
9193
frogbotAuthorEmail = "[email protected]"

utils/git.go

+44-6
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import (
77
"github.com/go-git/go-git/v5/plumbing/protocol/packp/capability"
88
"github.com/go-git/go-git/v5/plumbing/transport"
99
"github.com/go-git/go-git/v5/plumbing/transport/client"
10-
"github.com/jfrog/frogbot/utils/outputwriter"
1110
"github.com/jfrog/froggit-go/vcsutils"
1211
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
1312
"github.com/jfrog/jfrog-client-go/utils/io/fileutils"
1413
"net/http"
14+
"regexp"
1515
"strings"
1616
"time"
1717

@@ -29,6 +29,10 @@ const (
2929

3030
// Timout is seconds for the git operations performed by the go-git client.
3131
goGitTimeoutSeconds = 120
32+
33+
// Separators used to convert technologies array into string
34+
fixBranchTechSeparator = "-"
35+
pullRequestTitleTechSeparator = ","
3236
)
3337

3438
type GitManager struct {
@@ -323,10 +327,11 @@ func (gm *GitManager) GenerateCommitMessage(impactedPackage string, fixVersion s
323327
return formatStringWithPlaceHolders(template, impactedPackage, fixVersion, "", true)
324328
}
325329

326-
func (gm *GitManager) GenerateAggregatedCommitMessage(tech coreutils.Technology) string {
330+
func (gm *GitManager) GenerateAggregatedCommitMessage(tech []coreutils.Technology) string {
327331
template := gm.customTemplates.commitMessageTemplate
328332
if template == "" {
329-
template = outputwriter.GetAggregatedPullRequestTitle(tech)
333+
// In aggregated mode, commit message and PR title are the same.
334+
template = gm.GenerateAggregatedPullRequestTitle(tech)
330335
}
331336
return formatStringWithPlaceHolders(template, "", "", "", true)
332337
}
@@ -372,14 +377,32 @@ func (gm *GitManager) GeneratePullRequestTitle(impactedPackage string, version s
372377
return formatStringWithPlaceHolders(template, impactedPackage, version, "", true)
373378
}
374379

380+
func (gm *GitManager) GenerateAggregatedPullRequestTitle(tech []coreutils.Technology) string {
381+
template := gm.getPullRequestTitleTemplate(tech)
382+
// If no technologies are provided, return the template as-is
383+
if len(tech) == 0 {
384+
return normalizeWhitespaces(strings.ReplaceAll(template, "%s", ""))
385+
}
386+
return fmt.Sprintf(template, techArrayToString(tech, pullRequestTitleTechSeparator))
387+
}
388+
389+
func (gm *GitManager) getPullRequestTitleTemplate(tech []coreutils.Technology) string {
390+
// Check if a custom template is available
391+
if customTemplate := gm.customTemplates.pullRequestTitleTemplate; customTemplate != "" {
392+
return parseCustomTemplate(customTemplate, tech)
393+
}
394+
// If no custom template, use the default template
395+
return AggregatePullRequestTitleDefaultTemplate
396+
}
397+
375398
// GenerateAggregatedFixBranchName Generating a consistent branch name to enable branch updates
376399
// and to ensure that there is only one Frogbot branch in aggregated mode.
377-
func (gm *GitManager) GenerateAggregatedFixBranchName(tech coreutils.Technology) (fixBranchName string, err error) {
400+
func (gm *GitManager) GenerateAggregatedFixBranchName(tech []coreutils.Technology) (fixBranchName string, err error) {
378401
branchFormat := gm.customTemplates.branchNameTemplate
379402
if branchFormat == "" {
380403
branchFormat = AggregatedBranchNameTemplate
381404
}
382-
return formatStringWithPlaceHolders(branchFormat, "", "", tech.String(), false), nil
405+
return formatStringWithPlaceHolders(branchFormat, "", "", techArrayToString(tech, fixBranchTechSeparator), false), nil
383406
}
384407

385408
// dryRunClone clones an existing repository from our testdata folder into the destination folder for testing purposes.
@@ -431,7 +454,22 @@ func setGoGitCustomClient() {
431454
customClient := &http.Client{
432455
Timeout: goGitTimeoutSeconds * time.Second,
433456
}
434-
435457
client.InstallProtocol("http", githttp.NewClient(customClient))
436458
client.InstallProtocol("https", githttp.NewClient(customClient))
437459
}
460+
461+
// Clean user template from input strings and add suffix.
462+
func parseCustomTemplate(customTemplate string, tech []coreutils.Technology) string {
463+
trimSpace := strings.TrimSpace(customTemplate)
464+
// Find any input format strings
465+
re := regexp.MustCompile(`%[sdvTtqwxXbcdoUxfeEgGp]`)
466+
// Replace all matching substrings with an empty string
467+
result := re.ReplaceAllString(trimSpace, "")
468+
// Remove any middle spaces
469+
result = strings.Join(strings.Fields(result), " ")
470+
var suffix string
471+
if len(tech) > 0 {
472+
suffix = " - %s Dependencies"
473+
}
474+
return normalizeWhitespaces(result) + suffix
475+
}

utils/git_test.go

+34-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"github.com/go-git/go-git/v5"
66
"github.com/go-git/go-git/v5/config"
77
"github.com/go-git/go-git/v5/plumbing/object"
8-
"github.com/jfrog/frogbot/utils/outputwriter"
98
"github.com/jfrog/froggit-go/vcsutils"
109
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
1110
"github.com/jfrog/jfrog-client-go/utils/io/fileutils"
@@ -133,19 +132,19 @@ func TestGitManager_GenerateAggregatedFixBranchName(t *testing.T) {
133132
desc string
134133
}{
135134
{
136-
expected: "frogbot-update-go-dependencies",
135+
expected: "frogbot-update-Go-dependencies",
137136
desc: "No template",
138137
gitManager: GitManager{},
139138
},
140139
{
141-
expected: "[feature]-go",
140+
expected: "[feature]-Go",
142141
desc: "Custom template hash only",
143142
gitManager: GitManager{customTemplates: CustomTemplates{branchNameTemplate: "[feature]-${BRANCH_NAME_HASH}"}},
144143
},
145144
}
146145
for _, test := range testCases {
147146
t.Run(test.desc, func(t *testing.T) {
148-
titleOutput, err := test.gitManager.GenerateAggregatedFixBranchName(coreutils.Go)
147+
titleOutput, err := test.gitManager.GenerateAggregatedFixBranchName([]coreutils.Technology{coreutils.Go})
149148
assert.NoError(t, err)
150149
assert.Equal(t, test.expected, titleOutput)
151150
})
@@ -157,12 +156,12 @@ func TestGitManager_GenerateAggregatedCommitMessage(t *testing.T) {
157156
gitManager GitManager
158157
expected string
159158
}{
160-
{gitManager: GitManager{}, expected: outputwriter.GetAggregatedPullRequestTitle(coreutils.Pipenv)},
159+
{gitManager: GitManager{}, expected: "[🐸 Frogbot] Update Pipenv dependencies"},
161160
{gitManager: GitManager{customTemplates: CustomTemplates{commitMessageTemplate: "custom_template"}}, expected: "custom_template"},
162161
}
163162
for _, test := range testCases {
164163
t.Run(test.expected, func(t *testing.T) {
165-
commit := test.gitManager.GenerateAggregatedCommitMessage(coreutils.Pipenv)
164+
commit := test.gitManager.GenerateAggregatedCommitMessage([]coreutils.Technology{coreutils.Pipenv})
166165
assert.Equal(t, commit, test.expected)
167166
})
168167
}
@@ -295,3 +294,32 @@ func TestGitManager_SetRemoteGitUrl(t *testing.T) {
295294
})
296295
}
297296
}
297+
298+
func TestGetAggregatedPullRequestTitle(t *testing.T) {
299+
defaultGm := GitManager{}
300+
testsCases := []struct {
301+
tech []coreutils.Technology
302+
gm GitManager
303+
expected string
304+
}{
305+
{gm: defaultGm, tech: []coreutils.Technology{}, expected: "[🐸 Frogbot] Update dependencies"},
306+
{gm: defaultGm, tech: []coreutils.Technology{coreutils.Maven}, expected: "[🐸 Frogbot] Update Maven dependencies"},
307+
{gm: defaultGm, tech: []coreutils.Technology{coreutils.Gradle}, expected: "[🐸 Frogbot] Update Gradle dependencies"},
308+
{gm: defaultGm, tech: []coreutils.Technology{coreutils.Npm}, expected: "[🐸 Frogbot] Update npm dependencies"},
309+
{gm: defaultGm, tech: []coreutils.Technology{coreutils.Yarn}, expected: "[🐸 Frogbot] Update Yarn dependencies"},
310+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: "[Dependencies] My template "}}, tech: []coreutils.Technology{coreutils.Yarn}, expected: "[Dependencies] My template - Yarn Dependencies"},
311+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: ""}}, tech: []coreutils.Technology{coreutils.Yarn}, expected: "[🐸 Frogbot] Update Yarn dependencies"},
312+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: "[Feature] %s hello"}}, tech: []coreutils.Technology{coreutils.Yarn}, expected: "[Feature] hello - Yarn Dependencies"},
313+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: "[Feature] %s %d hello"}}, tech: []coreutils.Technology{coreutils.Yarn}, expected: "[Feature] hello - Yarn Dependencies"},
314+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: "[Feature] %s %d hello"}}, tech: []coreutils.Technology{coreutils.Yarn}, expected: "[Feature] hello - Yarn Dependencies"},
315+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: "[Feature] %s %f hello"}}, tech: []coreutils.Technology{coreutils.Yarn, coreutils.Go}, expected: "[Feature] hello - Yarn,Go Dependencies"},
316+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: "[Feature] %s %d hello"}}, tech: []coreutils.Technology{coreutils.Yarn, coreutils.Go, coreutils.Npm}, expected: "[Feature] hello - Yarn,Go,npm Dependencies"},
317+
{gm: GitManager{customTemplates: CustomTemplates{pullRequestTitleTemplate: "[Feature] %s %d hello"}}, tech: []coreutils.Technology{}, expected: "[Feature] hello"},
318+
}
319+
for _, test := range testsCases {
320+
t.Run(test.expected, func(t *testing.T) {
321+
title := test.gm.GenerateAggregatedPullRequestTitle(test.tech)
322+
assert.Equal(t, test.expected, title)
323+
})
324+
}
325+
}

utils/outputwriter/outputwriter.go

-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"strings"
66

77
"github.com/jfrog/froggit-go/vcsutils"
8-
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
98
"github.com/jfrog/jfrog-cli-core/v2/xray/formats"
109
xrayutils "github.com/jfrog/jfrog-cli-core/v2/xray/utils"
1110
)
@@ -215,13 +214,6 @@ at %s (line %d)
215214
location.StartLine)
216215
}
217216

218-
func GetAggregatedPullRequestTitle(tech coreutils.Technology) string {
219-
if tech.String() == "" {
220-
return FrogbotTitlePrefix + " Update dependencies"
221-
}
222-
return fmt.Sprintf("%s Update %s dependencies", FrogbotTitlePrefix, tech.ToFormal())
223-
}
224-
225217
func getVulnerabilitiesTableHeader(showCaColumn bool) string {
226218
if showCaColumn {
227219
return vulnerabilitiesTableHeaderWithContextualAnalysis

0 commit comments

Comments
 (0)