Skip to content

Commit

Permalink
fix: support http protocol for git urls
Browse files Browse the repository at this point in the history
Signed-off-by: Ivan Dagelic <dagelic.ivan@gmail.com>
  • Loading branch information
idagelic committed Oct 21, 2024
1 parent 5ce468c commit f452922
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 8 deletions.
17 changes: 9 additions & 8 deletions pkg/git/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,18 +100,19 @@ func (s *Service) CloneRepository(repo *gitprovider.GitRepository, auth *http.Ba
}

func (s *Service) CloneRepositoryCmd(repo *gitprovider.GitRepository, auth *http.BasicAuth) []string {
branch := fmt.Sprintf("\"%s\"", repo.Branch)
cloneCmd := []string{"git", "clone", "--single-branch", "--branch", branch}
cloneCmd := []string{"git", "clone", "--single-branch", "--branch", fmt.Sprintf("\"%s\"", repo.Branch)}
cloneUrl := repo.Url

// Default to https protocol if not specified
if !strings.Contains(cloneUrl, "://") {
cloneUrl = fmt.Sprintf("https://%s", cloneUrl)
}

if auth != nil {
repoUrl := strings.TrimPrefix(repo.Url, "https://")
repoUrl = strings.TrimPrefix(repoUrl, "http://")
cloneCmd = append(cloneCmd, fmt.Sprintf("https://%s:%s@%s", auth.Username, auth.Password, repoUrl))
} else {
cloneCmd = append(cloneCmd, repo.Url)
cloneUrl = fmt.Sprintf("%s://%s:%s@%s", strings.Split(cloneUrl, "://")[0], auth.Username, auth.Password, strings.SplitN(cloneUrl, "://", 2)[1])
}

cloneCmd = append(cloneCmd, s.ProjectDir)
cloneCmd = append(cloneCmd, cloneUrl, s.ProjectDir)

if repo.Target == gitprovider.CloneTargetCommit {
cloneCmd = append(cloneCmd, "&&", "cd", s.ProjectDir)
Expand Down
98 changes: 98 additions & 0 deletions pkg/git/service_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package git_test

import (
"testing"

"github.com/daytonaio/daytona/pkg/git"
"github.com/daytonaio/daytona/pkg/gitprovider"
"github.com/go-git/go-git/v5/plumbing/transport/http"
"github.com/stretchr/testify/suite"
)

var repoHttp = &gitprovider.GitRepository{
Id: "123",
Url: "http://localhost:3000/daytonaio/daytona",
Name: "daytona",
Branch: "main",
Target: gitprovider.CloneTargetBranch,
}

var repoHttps = &gitprovider.GitRepository{
Id: "123",
Url: "https://github.com/daytonaio/daytona",
Name: "daytona",
Branch: "main",
Target: gitprovider.CloneTargetBranch,
}

var repoWithoutProtocol = &gitprovider.GitRepository{
Id: "123",
Url: "github.com/daytonaio/daytona",
Name: "daytona",
Branch: "main",
Target: gitprovider.CloneTargetBranch,
}

var repoWithCloneTargetCommit = &gitprovider.GitRepository{
Id: "123",
Url: "https://github.com/daytonaio/daytona",
Name: "daytona",
Branch: "main",
Sha: "1234567890",
Target: gitprovider.CloneTargetCommit,
}

var creds = &http.BasicAuth{
Username: "daytonaio",
Password: "Daytona123",
}

type GitServiceTestSuite struct {
suite.Suite
gitService git.IGitService
}

func NewGitServiceTestSuite() *GitServiceTestSuite {
return &GitServiceTestSuite{}
}

func (s *GitServiceTestSuite) SetupTest() {
s.gitService = &git.Service{
ProjectDir: "/workdir",
}
}

func TestGitService(t *testing.T) {
suite.Run(t, NewGitServiceTestSuite())
}

func (s *GitServiceTestSuite) TestCloneRepositoryCmd_WithCreds() {
cloneCmd := s.gitService.CloneRepositoryCmd(repoHttps, creds)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "https://daytonaio:Daytona123@github.com/daytonaio/daytona", "/workdir"}, cloneCmd)

cloneCmd = s.gitService.CloneRepositoryCmd(repoHttp, creds)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "http://daytonaio:Daytona123@localhost:3000/daytonaio/daytona", "/workdir"}, cloneCmd)

cloneCmd = s.gitService.CloneRepositoryCmd(repoWithoutProtocol, creds)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "https://daytonaio:Daytona123@github.com/daytonaio/daytona", "/workdir"}, cloneCmd)

cloneCmd = s.gitService.CloneRepositoryCmd(repoWithCloneTargetCommit, creds)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "https://daytonaio:Daytona123@github.com/daytonaio/daytona", "/workdir", "&&", "cd", "/workdir", "&&", "git", "checkout", "1234567890"}, cloneCmd)
}

func (s *GitServiceTestSuite) TestCloneRepositoryCmd_WithoutCreds() {
cloneCmd := s.gitService.CloneRepositoryCmd(repoHttps, nil)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "https://github.com/daytonaio/daytona", "/workdir"}, cloneCmd)

cloneCmd = s.gitService.CloneRepositoryCmd(repoHttp, nil)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "http://localhost:3000/daytonaio/daytona", "/workdir"}, cloneCmd)

cloneCmd = s.gitService.CloneRepositoryCmd(repoWithoutProtocol, nil)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "https://github.com/daytonaio/daytona", "/workdir"}, cloneCmd)

cloneCmd = s.gitService.CloneRepositoryCmd(repoWithCloneTargetCommit, nil)
s.Require().Equal([]string{"git", "clone", "--single-branch", "--branch", "\"main\"", "https://github.com/daytonaio/daytona", "/workdir", "&&", "cd", "/workdir", "&&", "git", "checkout", "1234567890"}, cloneCmd)
}

0 comments on commit f452922

Please sign in to comment.