Skip to content

Commit 12d3148

Browse files
authored
Added hash part to aggregated branch name (#970)
1 parent 1d92722 commit 12d3148

File tree

4 files changed

+28
-19
lines changed

4 files changed

+28
-19
lines changed

scanrepository/scanrepository.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,10 @@ func (cfp *ScanRepositoryCmd) fixMultiplePackages(fullProjectPath string, vulner
334334
// Otherwise, it performs a force push to the same branch and reopens the pull request if it was closed.
335335
// Only one aggregated pull request should remain open at all times.
336336
func (cfp *ScanRepositoryCmd) fixIssuesSinglePR(repository *utils.Repository, vulnerabilitiesMap map[string]map[string]*utils.VulnerabilityDetails) (err error) {
337-
aggregatedFixBranchName := cfp.gitManager.GenerateAggregatedFixBranchName(cfp.scanDetails.BaseBranch(), cfp.projectTech)
337+
aggregatedFixBranchName, err := cfp.gitManager.GenerateAggregatedFixBranchName(cfp.scanDetails.BaseBranch(), cfp.projectTech)
338+
if err != nil {
339+
return
340+
}
338341
existingPullRequestDetails, err := cfp.getOpenPullRequestBySourceBranch(aggregatedFixBranchName)
339342
if err != nil {
340343
return

scanrepository/scanrepository_test.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ package scanrepository
33
import (
44
"errors"
55
"fmt"
6-
"github.com/jfrog/jfrog-cli-security/utils/xsc"
76
"net/http/httptest"
87
"os"
98
"os/exec"
109
"path/filepath"
1110
"strings"
1211
"testing"
1312

13+
"github.com/jfrog/jfrog-cli-security/utils/xsc"
14+
1415
"github.com/google/go-github/v45/github"
1516
biutils "github.com/jfrog/build-info-go/utils"
1617
"github.com/jfrog/frogbot/v2/utils"
@@ -94,25 +95,25 @@ func TestScanRepositoryCmd_Run(t *testing.T) {
9495
}{
9596
{
9697
testName: "aggregate",
97-
expectedPackagesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"uuid", "minimist", "mpath"}},
98-
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"^1.2.6", "^9.0.0", "^0.8.4"}},
98+
expectedPackagesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"uuid", "minimist", "mpath"}},
99+
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"^1.2.6", "^9.0.0", "^0.8.4"}},
99100
packageDescriptorPaths: []string{"package.json"},
100101
aggregateFixes: true,
101102
},
102103
{
103104
testName: "aggregate-multi-dir",
104-
expectedPackagesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"uuid", "minimatch", "mpath", "minimist"}},
105-
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"^1.2.6", "^9.0.0", "^0.8.4", "^3.0.5"}},
106-
expectedMissingFilesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"npm1/package-lock.json", "npm2/package-lock.json"}},
105+
expectedPackagesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"uuid", "minimatch", "mpath", "minimist"}},
106+
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"^1.2.6", "^9.0.0", "^0.8.4", "^3.0.5"}},
107+
expectedMissingFilesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"npm1/package-lock.json", "npm2/package-lock.json"}},
107108
packageDescriptorPaths: []string{"npm1/package.json", "npm2/package.json"},
108109
aggregateFixes: true,
109110
configPath: "../testdata/scanrepository/cmd/aggregate-multi-dir/.frogbot/frogbot-config.yml",
110111
},
111112
{
112113
testName: "aggregate-multi-project",
113-
expectedPackagesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"uuid", "minimatch", "mpath"}, "frogbot-update-Pip-dependencies-master": {"pyjwt", "pexpect"}},
114-
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"^9.0.0", "^0.8.4", "^3.0.5"}, "frogbot-update-Pip-dependencies-master": {"2.4.0"}},
115-
expectedMissingFilesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"npm/package-lock.json"}},
114+
expectedPackagesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"uuid", "minimatch", "mpath"}, "frogbot-update-e8fa179873704bb1362147aff9c40040-dependencies-master": {"pyjwt", "pexpect"}},
115+
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"^9.0.0", "^0.8.4", "^3.0.5"}, "frogbot-update-e8fa179873704bb1362147aff9c40040-dependencies-master": {"2.4.0"}},
116+
expectedMissingFilesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"npm/package-lock.json"}},
116117
packageDescriptorPaths: []string{"npm/package.json", "pip/requirements.txt"},
117118
aggregateFixes: true,
118119
configPath: "../testdata/scanrepository/cmd/aggregate-multi-project/.frogbot/frogbot-config.yml",
@@ -144,8 +145,8 @@ func TestScanRepositoryCmd_Run(t *testing.T) {
144145
{
145146
// This testcase checks the partial results feature. It simulates a failure in the dependency tree construction in the test's project inner module
146147
testName: "partial-results-enabled",
147-
expectedPackagesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"minimist", "mpath"}},
148-
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-npm-dependencies-master": {"1.2.6", "0.8.4"}},
148+
expectedPackagesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"minimist", "mpath"}},
149+
expectedVersionUpdatesInBranch: map[string][]string{"frogbot-update-68d9dee2475e5986e783d85dfa11baa0-dependencies-master": {"1.2.6", "0.8.4"}},
149150
packageDescriptorPaths: []string{"package.json", "inner-project/package.json"},
150151
aggregateFixes: true,
151152
configPath: "../testdata/scanrepository/cmd/partial-results-enabled/.frogbot/frogbot-config.yml",

utils/git.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,12 +529,16 @@ func (gm *GitManager) getPullRequestTitleTemplate(tech []techutils.Technology) s
529529

530530
// GenerateAggregatedFixBranchName Generating a consistent branch name to enable branch updates
531531
// and to ensure that there is only one Frogbot aggregate pull request from each base branch scanned.
532-
func (gm *GitManager) GenerateAggregatedFixBranchName(baseBranch string, tech []techutils.Technology) (fixBranchName string) {
532+
func (gm *GitManager) GenerateAggregatedFixBranchName(baseBranch string, tech []techutils.Technology) (fixBranchName string, err error) {
533533
branchFormat := gm.customTemplates.branchNameTemplate
534534
if branchFormat == "" {
535535
branchFormat = AggregatedBranchNameTemplate
536536
}
537-
return formatStringWithPlaceHolders(branchFormat, "", "", techArrayToString(tech, fixBranchTechSeparator), baseBranch, false)
537+
hash, err := Md5Hash("frogbot", baseBranch, techArrayToString(tech, fixBranchTechSeparator))
538+
if err != nil {
539+
return "", err
540+
}
541+
return formatStringWithPlaceHolders(branchFormat, techArrayToString(tech, fixBranchTechSeparator), "", hash, baseBranch, false), nil
538542
}
539543

540544
// dryRunClone clones an existing repository from our testdata folder into the destination folder for testing purposes.

utils/git_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,31 +149,32 @@ func TestGitManager_GenerateAggregatedFixBranchName(t *testing.T) {
149149
desc string
150150
}{
151151
{
152-
expected: "frogbot-update-Go-dependencies-main",
152+
expected: "frogbot-update-e4e1fa318f12b3bed84b13ae5c293108-dependencies-main",
153153
baseBranch: "main",
154154
desc: "No template",
155155
gitManager: GitManager{},
156156
}, {
157-
expected: "frogbot-update-Go-dependencies-v2",
157+
expected: "frogbot-update-144734671657efb7f0d252bd99ca25d8-dependencies-v2",
158158
baseBranch: "v2",
159159
desc: "No template",
160160
gitManager: GitManager{},
161161
},
162162
{
163-
expected: "[feature]-Go-main",
163+
expected: "[feature]-e4e1fa318f12b3bed84b13ae5c293108-main",
164164
baseBranch: "main",
165165
desc: "Custom template hash only",
166166
gitManager: GitManager{customTemplates: CustomTemplates{branchNameTemplate: "[feature]-${BRANCH_NAME_HASH}"}},
167167
}, {
168-
expected: "[feature]-Go-master",
168+
expected: "[feature]-697bdb58caaed95527fc709da59ca47f-master",
169169
baseBranch: "master",
170170
desc: "Custom template hash only",
171171
gitManager: GitManager{customTemplates: CustomTemplates{branchNameTemplate: "[feature]-${BRANCH_NAME_HASH}"}},
172172
},
173173
}
174174
for _, test := range testCases {
175175
t.Run(test.desc, func(t *testing.T) {
176-
titleOutput := test.gitManager.GenerateAggregatedFixBranchName(test.baseBranch, []techutils.Technology{techutils.Go})
176+
titleOutput, err := test.gitManager.GenerateAggregatedFixBranchName(test.baseBranch, []techutils.Technology{techutils.Go})
177+
assert.NoError(t, err)
177178
assert.Equal(t, test.expected, titleOutput)
178179
})
179180
}

0 commit comments

Comments
 (0)