Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bitbucket Server integration tests #602

Merged
merged 119 commits into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
c7a5ad6
initial commit
omerzi Dec 5, 2023
94ceb96
init commit
omerzi Dec 5, 2023
037572a
init commit
omerzi Dec 5, 2023
95d914b
init commit
omerzi Dec 5, 2023
5e6ed5f
init commit
omerzi Dec 5, 2023
2411ccf
init commit
omerzi Dec 5, 2023
26b7b20
init commit
omerzi Dec 5, 2023
7d633ab
init commit
omerzi Dec 5, 2023
dc863a6
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 6, 2023
0677e8b
init commit
omerzi Dec 6, 2023
8e295e1
init commit
omerzi Dec 6, 2023
740ba6a
init commit
omerzi Dec 6, 2023
d4e7afe
init commit
omerzi Dec 6, 2023
9064f2a
init commit
omerzi Dec 6, 2023
03c776f
init commit
omerzi Dec 6, 2023
cbb92d8
init commit
omerzi Dec 6, 2023
80ccca3
init commit
omerzi Dec 6, 2023
d181fcf
init commit
omerzi Dec 6, 2023
935dd68
init commit
omerzi Dec 6, 2023
08b5cf7
init commit
omerzi Dec 6, 2023
df571c7
init commit
omerzi Dec 6, 2023
f4110c8
init commit
omerzi Dec 6, 2023
10b5752
init commit
omerzi Dec 6, 2023
5407099
init commit
omerzi Dec 6, 2023
76fb487
init commit
omerzi Dec 6, 2023
b85241e
init commit
omerzi Dec 6, 2023
9f3fb3e
init commit
omerzi Dec 6, 2023
9dfc00e
init commit
omerzi Dec 6, 2023
846474c
init commit
omerzi Dec 6, 2023
189ca7e
init commit
omerzi Dec 6, 2023
4bb6af0
init commit
omerzi Dec 6, 2023
2dfbde6
init commit
omerzi Dec 6, 2023
f8db125
init commit
omerzi Dec 6, 2023
34d74a0
init commit
omerzi Dec 6, 2023
19d4ba1
init commit
omerzi Dec 6, 2023
23662f3
init commit
omerzi Dec 6, 2023
5333301
init commit
omerzi Dec 6, 2023
68cbcf6
init commit
omerzi Dec 6, 2023
2f2a311
init commit
omerzi Dec 6, 2023
db2d5f6
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 7, 2023
d19ebaf
init commit
omerzi Dec 7, 2023
2153345
init commit
omerzi Dec 7, 2023
6e22523
init commit
omerzi Dec 7, 2023
8615a83
init commit
omerzi Dec 7, 2023
0ac8d97
init commit
omerzi Dec 7, 2023
a03cc92
init commit
omerzi Dec 7, 2023
01b62b8
init commit
omerzi Dec 7, 2023
a15fe90
CR
omerzi Dec 7, 2023
d625231
CR
omerzi Dec 7, 2023
70bbc2f
CR
omerzi Dec 7, 2023
9857fa4
CR
omerzi Dec 7, 2023
98712ac
CR
omerzi Dec 7, 2023
33e0dc9
CR
omerzi Dec 7, 2023
1aae6b0
CR
omerzi Dec 7, 2023
8b33d11
CR
omerzi Dec 7, 2023
3558a43
CR
omerzi Dec 7, 2023
c57341f
CR
omerzi Dec 7, 2023
97f1d8e
CR
omerzi Dec 7, 2023
6b7c505
CR
omerzi Dec 7, 2023
f707b54
CR
omerzi Dec 7, 2023
60fb3dc
CR
omerzi Dec 7, 2023
d6e0c70
CR
omerzi Dec 7, 2023
6b555a1
CR
omerzi Dec 7, 2023
cf71560
CR
omerzi Dec 7, 2023
10f2110
CR
omerzi Dec 7, 2023
52c66a8
CR
omerzi Dec 7, 2023
0bdeca6
CR
omerzi Dec 7, 2023
399b6ee
CR
omerzi Dec 7, 2023
3172043
CR
omerzi Dec 7, 2023
d5d65b3
CR
omerzi Dec 7, 2023
e2769b4
CR
omerzi Dec 7, 2023
8213c7d
CR
omerzi Dec 11, 2023
8ab9aea
CR
omerzi Dec 11, 2023
c86e501
CR
omerzi Dec 11, 2023
fa14eaa
CR
omerzi Dec 11, 2023
05d0fb5
CR
omerzi Dec 11, 2023
c9ae613
CR
omerzi Dec 11, 2023
81271ac
CR
omerzi Dec 11, 2023
547b03b
CR
omerzi Dec 11, 2023
e7f1bbf
CR
omerzi Dec 11, 2023
3cebdd2
CR
omerzi Dec 11, 2023
64d60ad
CR
omerzi Dec 11, 2023
496a71e
CR
omerzi Dec 11, 2023
7fdff3a
CR
omerzi Dec 11, 2023
06a328a
CR
omerzi Dec 11, 2023
8767615
CR
omerzi Dec 11, 2023
3a5cfe8
CR
omerzi Dec 11, 2023
d415686
CR
omerzi Dec 11, 2023
037a153
CR
omerzi Dec 11, 2023
2d4a5df
CR
omerzi Dec 11, 2023
ec20cb7
CR
omerzi Dec 11, 2023
396f9ad
CR
omerzi Dec 11, 2023
14ccc91
CR
omerzi Dec 11, 2023
57fa9e2
Merge remote-tracking branch 'upstream/dev' into bitbucket-integration
omerzi Dec 11, 2023
47fdb75
CR
omerzi Dec 11, 2023
474e23c
refactor
omerzi Dec 11, 2023
a471c37
refactor
omerzi Dec 11, 2023
7d1e1a8
refactor
omerzi Dec 11, 2023
9f986c0
refactor
omerzi Dec 11, 2023
06bbf5e
refactor
omerzi Dec 11, 2023
ec925ae
refactor
omerzi Dec 11, 2023
43b776f
refactor
omerzi Dec 11, 2023
e7ad1e0
refactor
omerzi Dec 11, 2023
4a13e4e
Refactor bitbucket server test and improve logging
omerzi Dec 11, 2023
ff314d5
Refactor bitbucket server test and improve logging
omerzi Dec 11, 2023
3d0df36
Refactor bitbucket server test and improve logging
omerzi Dec 11, 2023
12c7561
Refactor bitbucket server test and improve logging
omerzi Dec 11, 2023
3ff57c6
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 11, 2023
3152b97
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 11, 2023
41e560c
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 11, 2023
972e523
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 11, 2023
cf72c3a
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 11, 2023
d8f40cc
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 11, 2023
442f2d1
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 11, 2023
342a2cb
Merge remote-tracking branch 'upstream/dev' into bitbucket-integration
omerzi Dec 12, 2023
3fefc09
Merge branch 'dev' into bitbucket-integration
omerzi Dec 13, 2023
2cc788f
Merge remote-tracking branch 'upstream/dev' into bitbucket-integration
omerzi Dec 17, 2023
80d312a
Merge remote-tracking branch 'origin/bitbucket-integration' into bitb…
omerzi Dec 17, 2023
9350c69
CR
omerzi Dec 17, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ jobs:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}

- name: Setup Go
uses: actions/setup-go@v3
with:
Expand Down Expand Up @@ -177,3 +178,29 @@ jobs:
JF_URL: ${{ secrets.PLATFORM_URL }}
JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }}
FROGBOT_TESTS_GITLAB_TOKEN: ${{ secrets.FROGBOT_TESTS_GITLAB_TOKEN }}

bitbucket-server-integration:
name: Bitbucket Server Integration Tests
needs: Pretest
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}

- name: Unzip Preconfigured Bitbucket Home
run: unzip ${{ github.workspace }}/testdata/resources/bitbucket_server_home.zip -d ${PWD}

- name: Download Bitbucket Server and Run
run: |
bb_script_path="${{ github.workspace }}/testdata/resources/bitbucket_server_run.sh"
chmod +x $bb_script_path
sh $bb_script_path

- name: Run Tests
env:
JF_URL: ${{ secrets.PLATFORM_URL }}
JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }}
FROGBOT_TESTS_BB_SERVER_TOKEN: ${{ secrets.FROGBOT_TESTS_BB_SERVER_TOKEN }}
JFROG_CLI_LOG_LEVEL: "DEBUG"
run: go test -v bitbucket_server_test.go commands.go integrationutils.go
10 changes: 7 additions & 3 deletions azure_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,18 @@ func buildAzureReposIntegrationTestDetails(t *testing.T) *IntegrationTestDetails
return testDetails
}

func TestAzureRepos_ScanPullRequestIntegration(t *testing.T) {
func azureReposTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) {
testDetails := buildAzureReposIntegrationTestDetails(t)
azureClient := buildAzureReposClient(t, testDetails.GitToken)
return azureClient, testDetails
}

func TestAzureRepos_ScanPullRequestIntegration(t *testing.T) {
azureClient, testDetails := azureReposTestsInit(t)
runScanPullRequestCmd(t, azureClient, testDetails)
}

func TestAzureRepos_ScanRepositoryIntegration(t *testing.T) {
testDetails := buildAzureReposIntegrationTestDetails(t)
azureClient := buildAzureReposClient(t, testDetails.GitToken)
azureClient, testDetails := azureReposTestsInit(t)
runScanRepositoryCmd(t, azureClient, testDetails)
}
71 changes: 71 additions & 0 deletions bitbucket_server_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package main

import (
"errors"
"fmt"
"github.com/jfrog/frogbot/utils"
"github.com/jfrog/froggit-go/vcsclient"
"github.com/jfrog/froggit-go/vcsutils"
"github.com/jfrog/jfrog-client-go/utils/log"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"io"
"net/http"
"testing"
)

const (
bitbucketServerIntegrationTokenEnv = "FROGBOT_TESTS_BB_SERVER_TOKEN"
bitbucketServerApiEndpoint = "http://localhost:7990/rest"
bitbucketServerGitCloneUrl = "http://localhost:7990/scm/frog/integration.git"
)

func buildBitbucketServerClient(t *testing.T, bitbucketServerToken string) vcsclient.VcsClient {
bbClient, err := vcsclient.NewClientBuilder(vcsutils.BitbucketServer).Username("frogbot").ApiEndpoint(bitbucketServerApiEndpoint).Token(bitbucketServerToken).Build()
assert.NoError(t, err)
return bbClient
}

func buildBitbucketServerIntegrationTestDetails(t *testing.T) *IntegrationTestDetails {
integrationRepoToken := getIntegrationToken(t, bitbucketServerIntegrationTokenEnv)
testDetails := NewIntegrationTestDetails(integrationRepoToken, string(utils.BitbucketServer), bitbucketServerGitCloneUrl, "FROG")
testDetails.ApiEndpoint = bitbucketServerApiEndpoint
return testDetails
}

func waitForConnection(t *testing.T) {
omerzi marked this conversation as resolved.
Show resolved Hide resolved
log.Info("Waiting for Bitbucket Server to be up and running...")
retryExecutor := vcsutils.RetryExecutor{
MaxRetries: 10,
RetriesIntervalMilliSecs: 60000,
Logger: log.Logger,
}
retryExecutor.ExecutionHandler = func() (bool, error) {
res, err := http.Get("http://localhost:7990/status")
if err != nil || res.StatusCode != http.StatusOK {
body, e := io.ReadAll(res.Body)
err = errors.Join(err, e)
log.Info(fmt.Sprintf("Status code: %d, Server current state: %s", res.StatusCode, body))
return true, err
}
return false, nil
}
require.NoError(t, retryExecutor.Execute())
}

func bitbucketServerTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) {
testDetails := buildBitbucketServerIntegrationTestDetails(t)
bbClient := buildBitbucketServerClient(t, testDetails.GitToken)
waitForConnection(t)
return bbClient, testDetails
}

func TestBitbucketServer_ScanPullRequestIntegration(t *testing.T) {
bbClient, testDetails := bitbucketServerTestsInit(t)
runScanPullRequestCmd(t, bbClient, testDetails)
}

func TestBitbucketServer_ScanRepositoryIntegration(t *testing.T) {
bbClient, testDetails := bitbucketServerTestsInit(t)
runScanRepositoryCmd(t, bbClient, testDetails)
}
11 changes: 7 additions & 4 deletions github_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,18 @@ func buildGitHubIntegrationTestDetails(t *testing.T) *IntegrationTestDetails {
return NewIntegrationTestDetails(integrationRepoToken, string(utils.GitHub), githubGitCloneUrl, "frogbot-test")
}

func TestGitHub_ScanPullRequestIntegration(t *testing.T) {
func githubTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) {
testDetails := buildGitHubIntegrationTestDetails(t)
// Create a client for REST API request
githubClient := buildGitHubClient(t, testDetails.GitToken)
return githubClient, testDetails
}

func TestGitHub_ScanPullRequestIntegration(t *testing.T) {
githubClient, testDetails := githubTestsInit(t)
runScanPullRequestCmd(t, githubClient, testDetails)
}

func TestGitHub_ScanRepositoryIntegration(t *testing.T) {
testDetails := buildGitHubIntegrationTestDetails(t)
githubClient := buildGitHubClient(t, testDetails.GitToken)
githubClient, testDetails := githubTestsInit(t)
runScanRepositoryCmd(t, githubClient, testDetails)
}
10 changes: 7 additions & 3 deletions gitlab_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,18 @@ func buildGitLabIntegrationTestDetails(t *testing.T) *IntegrationTestDetails {
return NewIntegrationTestDetails(integrationRepoToken, string(utils.GitLab), gitlabGitCloneUrl, "frogbot-test2")
}

func TestGitLab_ScanPullRequestIntegration(t *testing.T) {
func gitlabTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) {
testDetails := buildGitLabIntegrationTestDetails(t)
gitlabClient := buildGitLabClient(t, testDetails.GitToken)
return gitlabClient, testDetails
}

func TestGitLab_ScanPullRequestIntegration(t *testing.T) {
gitlabClient, testDetails := gitlabTestsInit(t)
runScanPullRequestCmd(t, gitlabClient, testDetails)
}

func TestGitLab_ScanRepositoryIntegration(t *testing.T) {
testDetails := buildGitLabIntegrationTestDetails(t)
gitlabClient := buildGitLabClient(t, testDetails.GitToken)
gitlabClient, testDetails := gitlabTestsInit(t)
runScanRepositoryCmd(t, gitlabClient, testDetails)
}
28 changes: 19 additions & 9 deletions integrationutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ type IntegrationTestDetails struct {
GitCloneURL string
GitProvider string
GitProject string
GitUsername string
ApiEndpoint string
PullRequestID string
CustomBranchName string
Expand All @@ -43,14 +44,15 @@ func NewIntegrationTestDetails(token, gitProvider, gitCloneUrl, repoOwner string
RepoOwner: repoOwner,
RepoName: repoName,
GitToken: token,
GitUsername: "frogbot",
GitProvider: gitProvider,
GitCloneURL: gitCloneUrl,
}
}

func buildGitManager(t *testing.T, testDetails *IntegrationTestDetails) *utils.GitManager {
gitManager, err := utils.NewGitManager().
SetAuth("", testDetails.GitToken).
SetAuth(testDetails.GitUsername, testDetails.GitToken).
SetEmailAuthor("[email protected]").
SetRemoteGitUrl(testDetails.GitCloneURL)
assert.NoError(t, err)
Expand Down Expand Up @@ -79,6 +81,7 @@ func setIntegrationTestEnvs(t *testing.T, testDetails *IntegrationTestDetails) f
utils.BranchNameTemplateEnv: testDetails.CustomBranchName,
utils.GitApiEndpointEnv: testDetails.ApiEndpoint,
utils.GitProjectEnv: testDetails.GitProject,
utils.GitUsernameEnv: testDetails.GitUsername,
utils.GitBaseBranchEnv: mainBranch,
})
return func() {
Expand Down Expand Up @@ -191,16 +194,16 @@ func runScanRepositoryCmd(t *testing.T, client vcsclient.VcsClient, testDetails
pullRequests := getOpenPullRequests(t, client, testDetails)

expectedBranchName := "frogbot-pyjwt-45ebb5a61916a91ae7c1e3ff7ffb6112-" + timestamp
assert.NoError(t, gitManager.RemoveRemoteBranch(expectedBranchName))
prId := findRelevantPrID(pullRequests, expectedBranchName)
assert.NotZero(t, prId)
closePullRequest(t, client, testDetails, prId)
assert.NoError(t, gitManager.RemoveRemoteBranch(expectedBranchName))

expectedBranchName = "frogbot-pyyaml-985622f4dbf3a64873b6b8440288e005-" + timestamp
prId = findRelevantPrID(pullRequests, expectedBranchName)
assert.NoError(t, gitManager.RemoveRemoteBranch(expectedBranchName))
assert.NotZero(t, prId)
closePullRequest(t, client, testDetails, prId)
assert.NoError(t, gitManager.RemoveRemoteBranch(expectedBranchName))
}

func validateResults(t *testing.T, ctx context.Context, client vcsclient.VcsClient, testDetails *IntegrationTestDetails, prID int) {
Expand All @@ -212,6 +215,8 @@ func validateResults(t *testing.T, ctx context.Context, client vcsclient.VcsClie
validateGitHubComments(t, ctx, actualClient, testDetails, prID, comments)
case *vcsclient.AzureReposClient:
validateAzureComments(t, comments)
case *vcsclient.BitbucketServerClient:
validateBitbucketServerComments(t, comments)
case *vcsclient.GitLabClient:
validateGitLabComments(t, comments)
}
Expand All @@ -220,7 +225,7 @@ func validateResults(t *testing.T, ctx context.Context, client vcsclient.VcsClie
func validateGitHubComments(t *testing.T, ctx context.Context, client *vcsclient.GitHubClient, testDetails *IntegrationTestDetails, prID int, comments []vcsclient.CommentInfo) {
assert.Len(t, comments, 1)
comment := comments[0]
assert.Contains(t, comment.Content, outputwriter.VulnerabilitiesPrBannerSource)
assert.Contains(t, comment.Content, string(outputwriter.VulnerabilitiesPrBannerSource))

reviewComments, err := client.ListPullRequestReviewComments(ctx, testDetails.RepoOwner, testDetails.RepoName, prID)
assert.NoError(t, err)
Expand All @@ -229,12 +234,17 @@ func validateGitHubComments(t *testing.T, ctx context.Context, client *vcsclient

func validateAzureComments(t *testing.T, comments []vcsclient.CommentInfo) {
assert.GreaterOrEqual(t, len(comments), expectedNumberOfIssues)
assertBannerExists(t, comments, outputwriter.VulnerabilitiesPrBannerSource)
assertBannerExists(t, comments, string(outputwriter.VulnerabilitiesPrBannerSource))
}

func validateBitbucketServerComments(t *testing.T, comments []vcsclient.CommentInfo) {
assert.GreaterOrEqual(t, len(comments), expectedNumberOfIssues)
assertBannerExists(t, comments, outputwriter.GetSimplifiedTitle(outputwriter.VulnerabilitiesPrBannerSource))
}

func validateGitLabComments(t *testing.T, comments []vcsclient.CommentInfo) {
assert.GreaterOrEqual(t, len(comments), expectedNumberOfIssues)
assertBannerExists(t, comments, outputwriter.VulnerabilitiesMrBannerSource)
assertBannerExists(t, comments, string(outputwriter.VulnerabilitiesMrBannerSource))
}

func getJfrogEnvRestoreFunc(t *testing.T) func() {
Expand Down Expand Up @@ -265,11 +275,11 @@ func getIntegrationToken(t *testing.T, tokenEnv string) string {
return integrationRepoToken
}

func assertBannerExists(t *testing.T, comments []vcsclient.CommentInfo, banner outputwriter.ImageSource) {
func assertBannerExists(t *testing.T, comments []vcsclient.CommentInfo, banner string) {
var isContains bool
var occurrences int
for _, c := range comments {
if strings.Contains(c.Content, string(banner)) {
if strings.Contains(c.Content, banner) {
isContains = true
occurrences++
}
Expand All @@ -285,6 +295,6 @@ func closePullRequest(t *testing.T, client vcsclient.VcsClient, testDetails *Int
// The Azure API requires not adding parameters that won't be updated, so we omit the targetBranch in that case
targetBranch = ""
}
err := client.UpdatePullRequest(context.Background(), testDetails.RepoOwner, testDetails.RepoName, "scan pr test finished", "", targetBranch, prID, vcsutils.Closed)
err := client.UpdatePullRequest(context.Background(), testDetails.RepoOwner, testDetails.RepoName, "integration test finished", "", targetBranch, prID, vcsutils.Closed)
assert.NoError(t, err)
}
Binary file added testdata/resources/bitbucket_server_home.zip
Binary file not shown.
19 changes: 19 additions & 0 deletions testdata/resources/bitbucket_server_run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/bin/bash

export BITBUCKET_VERSION=8.16.1
export BITBUCKET_HOME=${PWD}/bitbucketHome

# Download Bitbucket Server
curl -fLg https://www.atlassian.com/software/stash/downloads/binary/atlassian-bitbucket-$BITBUCKET_VERSION.tar.gz -O

# Extract Bitbucket Server
tar -xvzf atlassian-bitbucket-$BITBUCKET_VERSION.tar.gz

# Change directory to Bitbucket Server installation
cd atlassian-bitbucket-$BITBUCKET_VERSION

# Set Bitbucket home directory
./bin/set-bitbucket-home.sh

# Start Bitbucket Server
./bin/start-bitbucket.sh --no-search
2 changes: 1 addition & 1 deletion utils/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ func (gm *GitManager) Clone(destinationPath, branchName string) error {
transport.UnsupportedCapabilities = []capability.Capability{
capability.ThinPack,
}
log.Debug(fmt.Sprintf("Cloning <%s/%s/%s>...", gm.remoteGitUrl, gm.remoteName, GetFullBranchName(branchName)))
log.Debug(fmt.Sprintf("Running git clone %s (%s branch)...", gm.remoteGitUrl, branchName))
cloneOptions := &git.CloneOptions{
URL: gm.remoteGitUrl,
Auth: gm.auth,
Expand Down
Loading