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

Bugfix/bitbucket fork pr #84

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions pkg/core/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ type CommitChangeList struct {
// Payload defines structure of payload
type Payload struct {
RepoSlug string `json:"repo_slug"`
ForkSlug string `json:"fork_slug"`
RepoLink string `json:"repo_link"`
BuildTargetCommit string `json:"build_target_commit"`
BuildBaseCommit string `json:"build_base_commit"`
Expand Down
6 changes: 3 additions & 3 deletions pkg/diffmanager/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (dm *diffManager) updateWithOr(m map[string]int, key string, value int) {
m[key] = m[key] | value
}

func (dm *diffManager) getCommitDiff(gitprovider, repoURL string, oauth *core.Oauth, baseCommit, targetCommit string) ([]byte, error) {
func (dm *diffManager) getCommitDiff(gitprovider, repoURL string, oauth *core.Oauth, baseCommit, targetCommit, forkSlug string) ([]byte, error) {
if baseCommit == "" {
dm.logger.Debugf("basecommit is empty for gitprovider %v error %v", gitprovider, errs.ErrGitDiffNotFound)
return nil, errs.ErrGitDiffNotFound
Expand All @@ -72,7 +72,7 @@ func (dm *diffManager) getCommitDiff(gitprovider, repoURL string, oauth *core.Oa
return nil, err
}

apiURLString, err := urlmanager.GetCommitDiffURL(gitprovider, url.Path, baseCommit, targetCommit)
apiURLString, err := urlmanager.GetCommitDiffURL(gitprovider, url.Path, baseCommit, targetCommit, forkSlug)
if err != nil {
dm.logger.Errorf("failed to get api url for gitprovider: %v error: %v", gitprovider, err)
return nil, err
Expand Down Expand Up @@ -210,7 +210,7 @@ func (dm *diffManager) GetChangedFiles(ctx context.Context, payload *core.Payloa
return nil, err
}
} else {
diff, err = dm.getCommitDiff(payload.GitProvider, payload.RepoLink, oauth, payload.BuildBaseCommit, payload.BuildTargetCommit)
diff, err = dm.getCommitDiff(payload.GitProvider, payload.RepoLink, oauth, payload.BuildBaseCommit, payload.BuildTargetCommit, payload.ForkSlug)
if err != nil {
dm.logger.Errorf("failed to get commit diff for gitprovider: %s error: %v", payload.GitProvider, err)
return nil, err
Expand Down
37 changes: 27 additions & 10 deletions pkg/gitmanager/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,24 +43,21 @@ func (gm *gitManager) Clone(ctx context.Context, payload *core.Payload, oauth *c
repoName := repoItems[len(repoItems)-1]
orgName := repoItems[len(repoItems)-2]
commitID := payload.BuildTargetCommit
archiveURL, err := urlmanager.GetCloneURL(payload.GitProvider, repoLink, repoName, commitID)

archiveURL, err := urlmanager.GetCloneURL(payload.GitProvider, repoLink, repoName, commitID, payload.ForkSlug, payload.RepoSlug)
if err != nil {
gm.logger.Errorf("failed to get clone url for provider %s, error %v", payload.GitProvider, err)
return err
}

gm.logger.Debugf("cloning from %s", archiveURL)
err = gm.downloadFile(ctx, archiveURL, commitID+".zip", oauth)
if err != nil {
gm.logger.Errorf("failed to download file %v", err)
return err
}

filename := repoName + "-" + commitID
if payload.GitProvider == core.Bitbucket {
// commitID[:12] bitbucket shorthand commit sha
filename = orgName + "-" + repoName + "-" + commitID[:12]
}

filename := gm.getUnzippedFileName(payload.GitProvider, orgName, repoName, payload.ForkSlug, commitID)
if err = os.Rename(filename, global.RepoDir); err != nil {
gm.logger.Errorf("failed to rename dir, error %v", err)
return err
Expand Down Expand Up @@ -133,7 +130,12 @@ func (gm *gitManager) copyAndExtractFile(resp *http.Response, path string) error

func (gm *gitManager) initGit(ctx context.Context, payload *core.Payload, oauth *core.Oauth) error {
branch := payload.BranchName
repoURL, perr := url.Parse(payload.RepoLink)
repoLink := payload.RepoLink
if payload.GitProvider == core.Bitbucket && payload.ForkSlug != "" {
repoLink = strings.Replace(repoLink, payload.RepoSlug, payload.ForkSlug, -1)
}

repoURL, perr := url.Parse(repoLink)
if perr != nil {
return perr
}
Expand All @@ -154,8 +156,8 @@ func (gm *gitManager) initGit(ctx context.Context, payload *core.Payload, oauth
urlWithToken := repoURL.String()
commands := []string{
"git init",
fmt.Sprintf("git remote add origin %s.git", payload.RepoLink),
fmt.Sprintf("git config --global url.%s.InsteadOf %s", urlWithToken, payload.RepoLink),
fmt.Sprintf("git remote add origin %s.git", repoLink),
fmt.Sprintf("git config --global url.%s.InsteadOf %s", urlWithToken, repoLink),
fmt.Sprintf("git fetch --depth=1 origin +%s:refs/remotes/origin/%s", payload.BuildTargetCommit, branch),
fmt.Sprintf("git config --global --remove-section url.%s", urlWithToken),
fmt.Sprintf("git checkout --progress --force -B %s refs/remotes/origin/%s", branch, branch),
Expand All @@ -165,3 +167,18 @@ func (gm *gitManager) initGit(ctx context.Context, payload *core.Payload, oauth
}
return nil
}

func (gm *gitManager) getUnzippedFileName(gitProvider, orgName, repoName, forkSlug, commitID string) string {
if gitProvider != core.Bitbucket {
return repoName + "-" + commitID
}

// commitID[:12] bitbucket shorthand commit sha
if forkSlug != "" {
// forkItmes : forkOrg, forkRepo
forkItems := strings.Split(forkSlug, "/")
return forkItems[0] + "-" + forkItems[1] + "-" + commitID[:12]
}

return orgName + "-" + repoName + "-" + commitID[:12]
}
13 changes: 11 additions & 2 deletions pkg/urlmanager/urlmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ package urlmanager
import (
"fmt"
"net/url"
"strings"

"github.com/LambdaTest/synapse/pkg/core"
"github.com/LambdaTest/synapse/pkg/errs"
"github.com/LambdaTest/synapse/pkg/global"
)

// GetCloneURL returns repo clone url for given git provider
func GetCloneURL(gitprovider, repoLink, repo, commitID string) (string, error) {
func GetCloneURL(gitprovider, repoLink, repo, commitID, forkSlug, repoSlug string) (string, error) {
if global.TestEnv {
return global.TestServer, nil
}
Expand All @@ -21,6 +22,11 @@ func GetCloneURL(gitprovider, repoLink, repo, commitID string) (string, error) {
return fmt.Sprintf("%s/-/archive/%s/%s-%s.zip", repoLink, commitID, repo, commitID), nil

case core.Bitbucket:
if forkSlug != "" {
forkLink := strings.Replace(repoLink, repoSlug, forkSlug, -1)
return fmt.Sprintf("%s/get/%s.zip", forkLink, commitID), nil
}

return fmt.Sprintf("%s/get/%s.zip", repoLink, commitID), nil

default:
Expand All @@ -29,7 +35,7 @@ func GetCloneURL(gitprovider, repoLink, repo, commitID string) (string, error) {
}

// GetCommitDiffURL returns commit diff url for given git provider
func GetCommitDiffURL(gitprovider, path, baseCommit, targetCommit string) (string, error) {
func GetCommitDiffURL(gitprovider, path, baseCommit, targetCommit, forkSlug string) (string, error) {
if global.TestEnv {
return global.TestServer, nil
}
Expand All @@ -42,6 +48,9 @@ func GetCommitDiffURL(gitprovider, path, baseCommit, targetCommit string) (strin
return fmt.Sprintf("%s/%s/repository/compare?from=%s&to=%s", global.APIHostURLMap[gitprovider], encodedPath, baseCommit, targetCommit), nil

case core.Bitbucket:
if forkSlug != "" {
return fmt.Sprintf("%s/repositories%s/diff/%s..%s", global.APIHostURLMap[gitprovider], path, fmt.Sprintf("%s:%s", forkSlug, targetCommit), baseCommit), nil
}
return fmt.Sprintf("%s/repositories%s/diff/%s..%s", global.APIHostURLMap[gitprovider], path, targetCommit, baseCommit), nil

default:
Expand Down
19 changes: 11 additions & 8 deletions pkg/urlmanager/urlmanager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,22 @@ func TestGetCloneURL(t *testing.T) {
repoLink string
repo string
commitID string
repoSlug string
forkSlug string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{"For github as git provider", args{"github", "https://github.com/nexe", "nexe", "abc"}, "https://github.com/nexe/archive/abc.zip", false},
{"For non-github and gitlab as git provider", args{"gittest", "https://github.com/nexe", "nexe", "abc"}, "", true},
{"For gitlab as git provider", args{"gitlab", "https://gitlab.com/nexe", "nexe", "abc"}, "https://gitlab.com/nexe/-/archive/abc/nexe-abc.zip", false},
{"For github as git provider", args{"github", "https://github.com/nexe", "nexe", "abc", "nexe", ""}, "https://github.com/nexe/archive/abc.zip", false},
{"For non-github and gitlab as git provider", args{"gittest", "https://github.com/nexe", "nexe", "abc", "nexe", ""}, "", true},
{"For gitlab as git provider", args{"gitlab", "https://gitlab.com/nexe", "nexe", "abc", "nexe", ""}, "https://gitlab.com/nexe/-/archive/abc/nexe-abc.zip", false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := GetCloneURL(tt.args.gitprovider, tt.args.repoLink, tt.args.repo, tt.args.commitID)
got, err := GetCloneURL(tt.args.gitprovider, tt.args.repoLink, tt.args.repo, tt.args.commitID, tt.args.repoSlug, tt.args.forkSlug)
if (err != nil) != tt.wantErr {
t.Errorf("GetCloneURL() error = %v, wantErr %v", err, tt.wantErr)
return
Expand All @@ -44,20 +46,21 @@ func TestGetCommitDiffURL(t *testing.T) {
path string
baseCommit string
targetCommit string
forkSlug string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{"For github as git provider", args{"github", "/tests/nexe", "abc", "xyz"}, "https://api.github.com/repos/tests/nexe/compare/abc...xyz", false},
{"For non-github and gitlab as git provider", args{"gittest", "tests/nexe", "abc", "xyz"}, "", true},
{"For gitlab as git provider", args{"gitlab", "/tests/nexe", "abc", "xyz"}, global.APIHostURLMap["gitlab"] + "/" + url.QueryEscape("tests/nexe") + "/repository/compare?from=abc&to=xyz", false},
{"For github as git provider", args{"github", "/tests/nexe", "abc", "xyz", ""}, "https://api.github.com/repos/tests/nexe/compare/abc...xyz", false},
{"For non-github and gitlab as git provider", args{"gittest", "tests/nexe", "abc", "xyz", ""}, "", true},
{"For gitlab as git provider", args{"gitlab", "/tests/nexe", "abc", "xyz", ""}, global.APIHostURLMap["gitlab"] + "/" + url.QueryEscape("tests/nexe") + "/repository/compare?from=abc&to=xyz", false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := GetCommitDiffURL(tt.args.gitprovider, tt.args.path, tt.args.baseCommit, tt.args.targetCommit)
got, err := GetCommitDiffURL(tt.args.gitprovider, tt.args.path, tt.args.baseCommit, tt.args.targetCommit, tt.args.forkSlug)
if (err != nil) != tt.wantErr {
t.Errorf("GetCommitDiffURL() error = %v, wantErr %v", err, tt.wantErr)
return
Expand Down
2 changes: 1 addition & 1 deletion testutils/testdata/index.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"repo_slug":"sachin14/nexe","repo_link":"https://github.com/sachin14/nexe","build_target_commit":"","build_base_commit":"","task_id":"","branch_name":"main","build_id":"2850df28b4a043959h65eb6c03772d5c","repo_id":"7572a0f9a08a4130a2265f6eb2470eb5","org_id":"1cd18453e7f440f1a0kd6418c5a708da","git_provider":"github","private_repo":false,"event_type":"push","diff_url":"","pull_request_number":0,"commits":[{"Sha":"a0fa2fb0201c62aa541c1a6eba516a8fefd874d8","Link":"https://github.com/sachin14/nexe/commit/a0fa2fb0201c62aa541c1a6eba516a8fefd874d8","added":[],"removed":[],"modified":["Readme.md"],"message":"first commit"},{"Sha":"60143149e18581ad15b8a76fd2ed96e695d7826e","Link":"https://github.com/sachin14/nexe/commit/60143149e18581ad15b8a76fd2ed96e695d7826e","added":[],"removed":[],"modified":["Readme.md"],"message":"second commit"}],"tas_file_name":".tas.yml","locators":"","locator_address":"","parent_commit_coverage_exists":false,"license_tier":"","collect_coverage":false,"collect_stats":false}
{"repo_slug":"sachin14/nexe","fork_slug":"","repo_link":"https://github.com/sachin14/nexe","build_target_commit":"","build_base_commit":"","task_id":"","branch_name":"main","build_id":"2850df28b4a043959h65eb6c03772d5c","repo_id":"7572a0f9a08a4130a2265f6eb2470eb5","org_id":"1cd18453e7f440f1a0kd6418c5a708da","git_provider":"github","private_repo":false,"event_type":"push","diff_url":"","pull_request_number":0,"commits":[{"Sha":"a0fa2fb0201c62aa541c1a6eba516a8fefd874d8","Link":"https://github.com/sachin14/nexe/commit/a0fa2fb0201c62aa541c1a6eba516a8fefd874d8","added":[],"removed":[],"modified":["Readme.md"],"message":"first commit"},{"Sha":"60143149e18581ad15b8a76fd2ed96e695d7826e","Link":"https://github.com/sachin14/nexe/commit/60143149e18581ad15b8a76fd2ed96e695d7826e","added":[],"removed":[],"modified":["Readme.md"],"message":"second commit"}],"tas_file_name":".tas.yml","locators":"","locator_address":"","parent_commit_coverage_exists":false,"license_tier":"","collect_coverage":false,"collect_stats":false}