forked from drone/go-scm
-
Notifications
You must be signed in to change notification settings - Fork 84
/
factory.go
115 lines (108 loc) · 3.09 KB
/
factory.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package factory
import (
"context"
"fmt"
"net/http"
"os"
"strings"
"github.com/jenkins-x/go-scm/scm"
"github.com/jenkins-x/go-scm/scm/driver/bitbucket"
"github.com/jenkins-x/go-scm/scm/driver/fake"
"github.com/jenkins-x/go-scm/scm/driver/gitea"
"github.com/jenkins-x/go-scm/scm/driver/github"
"github.com/jenkins-x/go-scm/scm/driver/gitlab"
"github.com/jenkins-x/go-scm/scm/driver/gogs"
"github.com/jenkins-x/go-scm/scm/driver/stash"
"github.com/jenkins-x/go-scm/scm/transport"
"golang.org/x/oauth2"
)
// MissingGitServerURL the error returned if you use a git driver that needs a git server URL
var MissingGitServerURL = fmt.Errorf("No git serverURL was specified")
// NewClient creates a new client for a given driver, serverURL and OAuth token
func NewClient(driver, serverURL, oauthToken string) (*scm.Client, error) {
if driver == "" {
driver = "github"
}
var client *scm.Client
var err error
switch driver {
case "bitbucket", "bitbucketcloud":
if serverURL != "" {
client, err = bitbucket.New(serverURL)
} else {
client = bitbucket.NewDefault()
}
case "fake":
client, _ = fake.NewDefault()
case "gitea":
if serverURL == "" {
return nil, MissingGitServerURL
}
client, err = gitea.New(serverURL)
case "github":
if serverURL != "" {
client, err = github.New(ensureGHEEndpoint(serverURL))
} else {
client = github.NewDefault()
}
case "gitlab":
if serverURL != "" {
client, err = gitlab.New(serverURL)
} else {
client = gitlab.NewDefault()
}
case "gogs":
if serverURL == "" {
return nil, MissingGitServerURL
}
client, err = gogs.New(serverURL)
case "stash", "bitbucketserver":
if serverURL == "" {
return nil, MissingGitServerURL
}
client, err = stash.New(serverURL)
default:
return nil, fmt.Errorf("Unsupported $GIT_KIND value: %s", driver)
}
if err != nil {
return client, err
}
if oauthToken != "" {
if driver == "gitlab" {
client.Client = &http.Client{
Transport: &transport.PrivateToken{
Token: oauthToken,
},
}
} else {
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: oauthToken},
)
client.Client = oauth2.NewClient(context.Background(), ts)
}
}
return client, err
}
// NewClientFromEnvironment creates a new client using environment variables $GIT_KIND, $GIT_SERVER, $GIT_TOKEN
// defaulting to github if no $GIT_KIND or $GIT_SERVER
func NewClientFromEnvironment() (*scm.Client, error) {
driver := os.Getenv("GIT_KIND")
serverURL := os.Getenv("GIT_SERVER")
oauthToken := os.Getenv("GIT_TOKEN")
if oauthToken == "" {
return nil, fmt.Errorf("No Git OAuth token specified for $GIT_TOKEN")
}
fmt.Printf("using driver: %s and serverURL: %s\n", driver, serverURL)
return NewClient(driver, serverURL, oauthToken)
}
// ensureGHEEndpoint lets ensure we have the /api/v3 suffix on the URL
func ensureGHEEndpoint(u string) string {
if strings.HasPrefix(u, "https://github.com") || strings.HasPrefix(u, "http://github.com") {
return "https://api.github.com"
}
// lets ensure we use the API endpoint to login
if strings.Index(u, "/api/") < 0 {
u = scm.UrlJoin(u, "/api/v3")
}
return u
}