2015-10-05 00:40:27 +00:00
|
|
|
package bitbucket
|
|
|
|
|
|
|
|
import (
|
2015-10-05 01:34:06 +00:00
|
|
|
"net/url"
|
2015-10-05 00:40:27 +00:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/drone/drone/model"
|
2016-04-29 19:39:56 +00:00
|
|
|
"github.com/drone/drone/remote/bitbucket/internal"
|
|
|
|
|
|
|
|
"golang.org/x/oauth2"
|
2015-10-05 00:40:27 +00:00
|
|
|
)
|
|
|
|
|
2016-04-29 19:39:56 +00:00
|
|
|
// convertRepo is a helper function used to convert a Bitbucket repository
|
|
|
|
// structure to the common Drone repository structure.
|
|
|
|
func convertRepo(from *internal.Repo) *model.Repo {
|
2015-10-05 00:40:27 +00:00
|
|
|
repo := model.Repo{
|
2016-04-29 19:39:56 +00:00
|
|
|
Clone: cloneLink(from),
|
2015-11-26 01:09:57 +00:00
|
|
|
Owner: strings.Split(from.FullName, "/")[0],
|
|
|
|
Name: strings.Split(from.FullName, "/")[1],
|
2015-10-05 00:40:27 +00:00
|
|
|
FullName: from.FullName,
|
|
|
|
Link: from.Links.Html.Href,
|
|
|
|
IsPrivate: from.IsPrivate,
|
|
|
|
Avatar: from.Owner.Links.Avatar.Href,
|
2015-10-27 20:03:37 +00:00
|
|
|
Kind: from.Scm,
|
2015-10-05 00:40:27 +00:00
|
|
|
Branch: "master",
|
|
|
|
}
|
2015-10-27 21:53:55 +00:00
|
|
|
if repo.Kind == model.RepoHg {
|
|
|
|
repo.Branch = "default"
|
|
|
|
}
|
2015-10-05 00:40:27 +00:00
|
|
|
return &repo
|
|
|
|
}
|
|
|
|
|
2016-04-29 19:39:56 +00:00
|
|
|
// cloneLink is a helper function that tries to extract the clone url from the
|
|
|
|
// repository object.
|
|
|
|
func cloneLink(repo *internal.Repo) string {
|
2015-10-06 06:17:59 +00:00
|
|
|
var clone string
|
|
|
|
|
2016-04-29 19:39:56 +00:00
|
|
|
// above we manually constructed the repository clone url. below we will
|
|
|
|
// iterate through the list of clone links and attempt to instead use the
|
|
|
|
// clone url provided by bitbucket.
|
2015-10-06 06:17:59 +00:00
|
|
|
for _, link := range repo.Links.Clone {
|
|
|
|
if link.Name == "https" {
|
|
|
|
clone = link.Href
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-29 19:39:56 +00:00
|
|
|
// if no repository name is provided, we use the Html link. this excludes the
|
|
|
|
// .git suffix, but will still clone the repo.
|
2015-10-06 06:17:59 +00:00
|
|
|
if len(clone) == 0 {
|
|
|
|
clone = repo.Links.Html.Href
|
|
|
|
}
|
|
|
|
|
2016-04-29 19:39:56 +00:00
|
|
|
// if bitbucket tries to automatically populate the user in the url we must
|
|
|
|
// strip it out.
|
2015-10-06 06:17:59 +00:00
|
|
|
cloneurl, err := url.Parse(clone)
|
|
|
|
if err == nil {
|
|
|
|
cloneurl.User = nil
|
|
|
|
clone = cloneurl.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
return clone
|
|
|
|
}
|
|
|
|
|
2016-04-29 19:39:56 +00:00
|
|
|
// convertRepoLite is a helper function used to convert a Bitbucket repository
|
|
|
|
// structure to the simplified Drone repository structure.
|
|
|
|
func convertRepoLite(from *internal.Repo) *model.RepoLite {
|
2015-10-05 00:40:27 +00:00
|
|
|
return &model.RepoLite{
|
2015-11-26 01:09:57 +00:00
|
|
|
Owner: strings.Split(from.FullName, "/")[0],
|
|
|
|
Name: strings.Split(from.FullName, "/")[1],
|
2015-10-05 00:40:27 +00:00
|
|
|
FullName: from.FullName,
|
|
|
|
Avatar: from.Owner.Links.Avatar.Href,
|
|
|
|
}
|
|
|
|
}
|
2016-04-29 19:39:56 +00:00
|
|
|
|
|
|
|
// convertUser is a helper function used to convert a Bitbucket user account
|
|
|
|
// structure to the Drone User structure.
|
|
|
|
func convertUser(from *internal.Account, token *oauth2.Token) *model.User {
|
|
|
|
return &model.User{
|
|
|
|
Login: from.Login,
|
|
|
|
Token: token.AccessToken,
|
|
|
|
Secret: token.RefreshToken,
|
|
|
|
Expiry: token.Expiry.UTC().Unix(),
|
|
|
|
Avatar: from.Links.Avatar.Href,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// convertTeamList is a helper function used to convert a Bitbucket team list
|
|
|
|
// structure to the Drone Team structure.
|
|
|
|
func convertTeamList(from []*internal.Account) []*model.Team {
|
|
|
|
var teams []*model.Team
|
|
|
|
for _, team := range from {
|
|
|
|
teams = append(teams, convertTeam(team))
|
|
|
|
}
|
|
|
|
return teams
|
|
|
|
}
|
|
|
|
|
|
|
|
// convertTeam is a helper function used to convert a Bitbucket team account
|
|
|
|
// structure to the Drone Team structure.
|
|
|
|
func convertTeam(from *internal.Account) *model.Team {
|
|
|
|
return &model.Team{
|
|
|
|
Login: from.Login,
|
|
|
|
Avatar: from.Links.Avatar.Href,
|
|
|
|
}
|
|
|
|
}
|