You've already forked go-semantic-release
177 lines
4.5 KiB
Go
177 lines
4.5 KiB
Go
package util
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
//CreateBearerHTTPClient with given token
|
|
func CreateBearerHTTPClient(ctx context.Context, token string) *http.Client {
|
|
tokenSource := oauth2.StaticTokenSource(&oauth2.Token{
|
|
AccessToken: token},
|
|
)
|
|
|
|
client := oauth2.NewClient(ctx, tokenSource)
|
|
|
|
return client
|
|
}
|
|
|
|
// AddHeaderTransport struct
|
|
type AddHeaderTransport struct {
|
|
T http.RoundTripper
|
|
key string
|
|
value string
|
|
}
|
|
|
|
// RoundTrip add header
|
|
func (adt *AddHeaderTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
req.Header.Add(adt.key, adt.value)
|
|
return adt.T.RoundTrip(req)
|
|
}
|
|
|
|
//NewAddHeaderTransport to add default header
|
|
func NewAddHeaderTransport(T http.RoundTripper, key, value string) *AddHeaderTransport {
|
|
if T == nil {
|
|
T = http.DefaultTransport
|
|
}
|
|
return &AddHeaderTransport{T, key, value}
|
|
}
|
|
|
|
// GetAccessToken lookup for the providers accesstoken
|
|
func GetAccessToken(envName string) (string, error) {
|
|
var token string
|
|
var exists bool
|
|
log.Debugf("check if %s environment variable is set", envName)
|
|
|
|
if token, exists = os.LookupEnv(envName); !exists {
|
|
return "", fmt.Errorf("could not find %s in the enviroment variables. Please check if it is set", envName)
|
|
} else if token == "" {
|
|
return "", fmt.Errorf("token %s is set in environment variables but is empty", envName)
|
|
}
|
|
return token, nil
|
|
}
|
|
|
|
// // PrepareAssets prepare all files before uploading
|
|
// func PrepareAssets(repository string, assets []config.Asset) ([]*string, error) {
|
|
// filesToUpload := []*string{}
|
|
// for _, asset := range assets {
|
|
// if asset.Name != "" && asset.Path == "" {
|
|
// log.Warn("Name is deprecated. Please update your config. See https://nightapes.github.io/go-semantic-release/")
|
|
// }
|
|
|
|
// if asset.Path == "" {
|
|
// return nil, fmt.Errorf("asset path declaration is empty, please check your configuration file")
|
|
// } else if asset.Compress {
|
|
// log.Debugf("Asset %s will now be compressed", asset.Name)
|
|
// log.Debugf("Repo url %s", repository)
|
|
// zipNameWithPath, err := zipFile(repository, asset.Name)
|
|
// if err != nil {
|
|
// return filesToUpload, err
|
|
// }
|
|
// filesToUpload = append(filesToUpload, &zipNameWithPath)
|
|
// } else {
|
|
// tmpFileName := fmt.Sprintf("%s/%s", repository, asset.Name)
|
|
// filesToUpload = append(filesToUpload, &tmpFileName)
|
|
// }
|
|
// log.Debugf("Add asset %s to files to upload", asset.Name)
|
|
// }
|
|
// return filesToUpload, nil
|
|
// }
|
|
|
|
// // ZipFile compress given file in zip format
|
|
// func zipFile(repository string, file string) (string, error) {
|
|
|
|
// fileToZip, err := os.Open(repository + "/" + file)
|
|
// if err != nil {
|
|
// return "", err
|
|
// }
|
|
// defer fileToZip.Close()
|
|
|
|
// zipFileName := fmt.Sprintf("%s/%s.zip", strings.TrimSuffix(repository, "/"), file)
|
|
// zipFile, err := os.Create(zipFileName)
|
|
|
|
// if err != nil {
|
|
// return "", err
|
|
// }
|
|
// log.Debugf("Created zipfile %s", zipFile.Name())
|
|
|
|
// defer zipFile.Close()
|
|
|
|
// fileToZipInfo, err := fileToZip.Stat()
|
|
// if err != nil {
|
|
// return "", err
|
|
// }
|
|
|
|
// zipWriter := zip.NewWriter(zipFile)
|
|
// defer zipWriter.Close()
|
|
|
|
// fileToZipHeader, err := zip.FileInfoHeader(fileToZipInfo)
|
|
// if err != nil {
|
|
// return "", err
|
|
// }
|
|
|
|
// fileToZipHeader.Name = fileToZipInfo.Name()
|
|
|
|
// fileToZipWriter, err := zipWriter.CreateHeader(fileToZipHeader)
|
|
// if err != nil {
|
|
// return "", err
|
|
// }
|
|
|
|
// if _, err = io.Copy(fileToZipWriter, fileToZip); err != nil {
|
|
// return "", err
|
|
// }
|
|
|
|
// return zipFileName, nil
|
|
// }
|
|
|
|
//PathEscape to be url save
|
|
func PathEscape(s string) string {
|
|
return strings.Replace(url.PathEscape(s), ".", "%2E", -1)
|
|
}
|
|
|
|
// Do request for client
|
|
func Do(client *http.Client, req *http.Request, v interface{}) (*http.Response, error) {
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
switch resp.StatusCode {
|
|
case 200, 201, 202, 204:
|
|
if v != nil {
|
|
if w, ok := v.(io.Writer); ok {
|
|
_, err = io.Copy(w, resp.Body)
|
|
} else {
|
|
err = json.NewDecoder(resp.Body).Decode(v)
|
|
}
|
|
}
|
|
}
|
|
|
|
return resp, err
|
|
}
|
|
|
|
// IsValidResult validates response code
|
|
func IsValidResult(resp *http.Response) error {
|
|
switch resp.StatusCode {
|
|
case 200, 201, 202, 204:
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("%s %s: %d", resp.Request.Method, resp.Request.URL, resp.StatusCode)
|
|
}
|
|
}
|
|
|
|
// ShouldRetry request
|
|
func ShouldRetry(resp *http.Response) bool {
|
|
return resp.StatusCode == http.StatusTooManyRequests
|
|
}
|