service/gerrit/api_client.go (98 lines of code) (raw):

package gerrit import ( "context" "encoding/base64" "fmt" "net/url" "strings" goGerrit "github.com/andygrunwald/go-gerrit" "github.com/pkg/errors" "gopkg.in/resty.v1" coreV1Api "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" ) func (s *Service) initRestyClient() error { var secret coreV1Api.Secret if err := s.k8sClient.Get(context.Background(), types.NamespacedName{Namespace: s.Namespace, Name: fmt.Sprintf("%s-admin-password", s.RootGerritName)}, &secret); err != nil { return errors.Wrap(err, "unable to get admin secret") } gerritURL := strings.ReplaceAll(s.GerritAPIUrlTemplate, "{HOST}", fmt.Sprintf("%s.%s", s.RootGerritName, s.Namespace)) s.apiClient = resty.New(). SetHostURL(gerritURL). SetBasicAuth(string(secret.Data["user"]), string(secret.Data["password"])). SetDisableWarn(true) var err error s.goGerritClient, err = goGerrit.NewClient(strings.ReplaceAll(gerritURL, "/a/", "/"), s.goGerritHTTPClient) if err != nil { return errors.Wrap(err, "unable to init gerrit go client") } s.goGerritClient.Authentication.SetBasicAuth(string(secret.Data["user"]), string(secret.Data["password"])) return nil } func (s *Service) GoGerritClient() *goGerrit.Client { return s.goGerritClient } func checkErr(rsp *resty.Response, err error) error { if err != nil { return errors.Wrap(err, "error during request") } if rsp.StatusCode() >= 300 { return errors.Errorf("wrong response code: %d, content: %s", rsp.StatusCode(), rsp.String()) } return nil } func (s *Service) GetBranchContent(projectName, branch, fileLocation string) (string, error) { content, _, err := s.GoGerritClient().Projects.GetBranchContent(projectName, branch, fileLocation) if err != nil { return "", fmt.Errorf("unable to get branch content: %w", err) } return content, nil } func (s *Service) GetFileContents(ctx context.Context, projectName, branch, filePath string) (string, error) { filePath = url.PathEscape(filePath) path := fmt.Sprintf("projects/%s/branches/%s/files/%s/content", projectName, branch, filePath) rsp, err := s.apiClient.NewRequest().SetContext(ctx). Get(path) if err := checkErr(rsp, err); err != nil { return "", errors.Wrap(err, "unable to get file content") } bts, err := base64.StdEncoding.DecodeString(rsp.String()) if err != nil { return "", errors.Wrap(err, "unable to decode response") } return string(bts), nil } func (s *Service) GetMRFiles(ctx context.Context, changeID string) ([]string, error) { var rawRsp map[string]interface{} rsp, err := s.apiClient.NewRequest().SetContext(ctx).SetBody(&rawRsp). Get(fmt.Sprintf("/changes/%s/revisions/current/files", changeID)) if err := checkErr(rsp, err); err != nil { return nil, errors.Wrap(err, "unable to get mr files") } files := make([]string, len(rawRsp)) for k := range rawRsp { if k == "/COMMIT_MSG" { continue } files = append(files, k) } return files, nil } type Commit struct { Commit string `json:"commit"` Subject string `json:"subject"` } func (s *Service) GetMergeListCommits(ctx context.Context, changeID, revision string) ([]Commit, error) { rq, _ := s.GoGerritClient().NewRequest("GET", fmt.Sprintf("changes/%s/revisions/%s/mergelist", changeID, revision), nil) rq = rq.WithContext(ctx) var commits []Commit _, err := s.GoGerritClient().Do(rq, &commits) if err != nil { return nil, errors.Wrap(err, "unable to get merge list commits") } return commits, nil }