github.com/bishtawi/migrate/v4@v4.8.11/source/github_ee/github_ee.go (about) 1 package github_ee 2 3 import ( 4 "crypto/tls" 5 "fmt" 6 "net/http" 7 nurl "net/url" 8 "strconv" 9 "strings" 10 11 "github.com/bishtawi/migrate/v4/source" 12 gh "github.com/bishtawi/migrate/v4/source/github" 13 "github.com/google/go-github/github" 14 ) 15 16 func init() { 17 source.Register("github-ee", &GithubEE{}) 18 } 19 20 type GithubEE struct { 21 source.Driver 22 } 23 24 func (g *GithubEE) Open(url string) (source.Driver, error) { 25 verifyTLS := true 26 27 u, err := nurl.Parse(url) 28 if err != nil { 29 return nil, err 30 } 31 32 if o := u.Query().Get("verify-tls"); o != "" { 33 verifyTLS = parseBool(o, verifyTLS) 34 } 35 36 if u.User == nil { 37 return nil, gh.ErrNoUserInfo 38 } 39 40 password, ok := u.User.Password() 41 if !ok { 42 return nil, gh.ErrNoUserInfo 43 } 44 45 ghc, err := g.createGithubClient(u.Host, u.User.Username(), password, verifyTLS) 46 if err != nil { 47 return nil, err 48 } 49 50 pe := strings.Split(strings.Trim(u.Path, "/"), "/") 51 52 if len(pe) < 1 { 53 return nil, gh.ErrInvalidRepo 54 } 55 56 cfg := &gh.Config{ 57 Owner: pe[0], 58 Repo: pe[1], 59 Ref: u.Fragment, 60 } 61 62 if len(pe) > 2 { 63 cfg.Path = strings.Join(pe[2:], "/") 64 } 65 66 i, err := gh.WithInstance(ghc, cfg) 67 if err != nil { 68 return nil, err 69 } 70 71 return &GithubEE{Driver: i}, nil 72 } 73 74 func (g *GithubEE) createGithubClient(host, username, password string, verifyTLS bool) (*github.Client, error) { 75 tr := &github.BasicAuthTransport{ 76 Username: username, 77 Password: password, 78 Transport: &http.Transport{ 79 TLSClientConfig: &tls.Config{InsecureSkipVerify: !verifyTLS}, 80 }, 81 } 82 83 apiHost := fmt.Sprintf("https://%s/api/v3", host) 84 uploadHost := fmt.Sprintf("https://uploads.%s", host) 85 86 return github.NewEnterpriseClient(apiHost, uploadHost, tr.Client()) 87 } 88 89 func parseBool(val string, fallback bool) bool { 90 b, err := strconv.ParseBool(val) 91 if err != nil { 92 return fallback 93 } 94 95 return b 96 }