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  }