diff --git a/cmd/kosli/assertPRAzure.go b/cmd/kosli/assertPRAzure.go index 29513ba57..cf4031677 100644 --- a/cmd/kosli/assertPRAzure.go +++ b/cmd/kosli/assertPRAzure.go @@ -59,7 +59,7 @@ func newAssertPullRequestAzureCmd(out io.Writer) *cobra.Command { } func (o *assertPullRequestAzureOptions) run(args []string) error { - pullRequestsEvidence, err := o.azureConfig.PREvidenceForCommit(o.commit) + pullRequestsEvidence, err := o.azureConfig.PREvidenceForCommitV2(o.commit) if err != nil { return err } diff --git a/cmd/kosli/assertPRBitbucket.go b/cmd/kosli/assertPRBitbucket.go index 69f7d1b74..79bb9ebb9 100644 --- a/cmd/kosli/assertPRBitbucket.go +++ b/cmd/kosli/assertPRBitbucket.go @@ -81,7 +81,7 @@ func newAssertPullRequestBitbucketCmd(out io.Writer) *cobra.Command { } func (o *assertPullRequestBitbucketOptions) run(args []string) error { - pullRequestsEvidence, err := o.bbConfig.PREvidenceForCommit(o.commit) + pullRequestsEvidence, err := o.bbConfig.PREvidenceForCommitV2(o.commit) if err != nil { return err } diff --git a/cmd/kosli/assertPRGithub.go b/cmd/kosli/assertPRGithub.go index 83e60c518..a74243128 100644 --- a/cmd/kosli/assertPRGithub.go +++ b/cmd/kosli/assertPRGithub.go @@ -58,7 +58,7 @@ func newAssertPullRequestGithubCmd(out io.Writer) *cobra.Command { } func (o *assertPullRequestGithubOptions) run(args []string) error { - pullRequestsEvidence, err := o.githubConfig.PREvidenceForCommit(o.commit) + pullRequestsEvidence, err := o.githubConfig.PREvidenceForCommitV2(o.commit) if err != nil { return err } diff --git a/cmd/kosli/assertPRGithub_test.go b/cmd/kosli/assertPRGithub_test.go index 1d442ac28..65cc63f10 100644 --- a/cmd/kosli/assertPRGithub_test.go +++ b/cmd/kosli/assertPRGithub_test.go @@ -47,7 +47,7 @@ func (suite *AssertPRGithubCommandTestSuite) TestAssertPRGithubCmd() { name: "assert Github PR evidence fails when commit does not exist", cmd: `assert pullrequest github --github-org kosli-dev --repository cli --commit 19aab7f063147614451c88969602a10afba123ab` + suite.defaultKosliArguments, - golden: "Error: GET https://api.github.com/repos/kosli-dev/cli/commits/19aab7f063147614451c88969602a10afba123ab/pulls: 422 No commit found for SHA: 19aab7f063147614451c88969602a10afba123ab []\n", + golden: "Error: assert failed: found no pull request(s) in Github for commit: 19aab7f063147614451c88969602a10afba123ab\n", }, } diff --git a/cmd/kosli/assertPRGitlab.go b/cmd/kosli/assertPRGitlab.go index f906eaf83..019f5912e 100644 --- a/cmd/kosli/assertPRGitlab.go +++ b/cmd/kosli/assertPRGitlab.go @@ -58,7 +58,7 @@ func newAssertPullRequestGitlabCmd(out io.Writer) *cobra.Command { } func (o *assertPullRequestGitlabOptions) run(args []string) error { - pullRequestsEvidence, err := o.gitlabConfig.PREvidenceForCommit(o.commit) + pullRequestsEvidence, err := o.gitlabConfig.PREvidenceForCommitV2(o.commit) if err != nil { return err } diff --git a/cmd/kosli/docs.go b/cmd/kosli/docs.go index 491b4df85..1ba802983 100644 --- a/cmd/kosli/docs.go +++ b/cmd/kosli/docs.go @@ -340,6 +340,6 @@ var liveCliMap = map[string]string{ "kosli list flows": "kosli list flows --output=json", "kosli get flow": "kosli get flow dashboard-ci --output=json", //"kosli list trails": "kosli list trails dashboard-ci --output=json", // Produces too much output - "kosli get trail": "kosli get trail dashboard-ci 1159a6f1193150681b8484545150334e89de6c1c --output=json", - "kosli get attestation": "kosli get attestation snyk-container-scan --flow=differ-ci --fingerprint=0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0 --output=json", + "kosli get trail": "kosli get trail dashboard-ci 1159a6f1193150681b8484545150334e89de6c1c --output=json", + "kosli get attestation": "kosli get attestation snyk-container-scan --flow=differ-ci --fingerprint=0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0 --output=json", } diff --git a/cmd/kosli/pullrequest.go b/cmd/kosli/pullrequest.go index 4b352d0f2..897c45338 100644 --- a/cmd/kosli/pullrequest.go +++ b/cmd/kosli/pullrequest.go @@ -48,8 +48,19 @@ func (o *pullRequestArtifactOptions) run(out io.Writer, args []string) error { } } + label := "" + o.payload.GitProvider, label = getGitProviderAndLabel(o.retriever) + url := fmt.Sprintf("%s/api/v2/evidence/%s/artifact/%s/pull_request", global.Host, global.Org, o.flowName) - pullRequestsEvidence, err := o.getRetriever().PREvidenceForCommit(o.commit) + + // TODO: after the PR payload is enhanced for all git providers they will all use the same method + var pullRequestsEvidence []*types.PREvidence + if o.payload.GitProvider == "github" { + pullRequestsEvidence, err = o.getRetriever().PREvidenceForCommitV1(o.commit) + } else { + pullRequestsEvidence, err = o.getRetriever().PREvidenceForCommitV2(o.commit) + } + if err != nil { return err } @@ -60,9 +71,6 @@ func (o *pullRequestArtifactOptions) run(out io.Writer, args []string) error { return err } - label := "" - o.payload.GitProvider, label = getGitProviderAndLabel(o.retriever) - // PR evidence does not have files to upload form, cleanupNeeded, evidencePath, err := newEvidenceForm(o.payload, []string{}) // if we created a tar package, remove it after uploading it @@ -119,7 +127,7 @@ func (o *attestPROptions) run(args []string) error { return err } - pullRequestsEvidence, err := o.getRetriever().PREvidenceForCommit(o.payload.Commit.Sha1) + pullRequestsEvidence, err := o.getRetriever().PREvidenceForCommitV2(o.payload.Commit.Sha1) if err != nil { return err } @@ -175,14 +183,21 @@ func (o *pullRequestCommitOptions) run(args []string) error { return err } - pullRequestsEvidence, err := o.getRetriever().PREvidenceForCommit(o.payload.CommitSHA) + label := "" + o.payload.GitProvider, label = getGitProviderAndLabel(o.retriever) + + // TODO: after the PR payload is enhanced for all git providers they will all use the same method + var pullRequestsEvidence []*types.PREvidence + if o.payload.GitProvider == "github" { + pullRequestsEvidence, err = o.getRetriever().PREvidenceForCommitV1(o.payload.CommitSHA) + } else { + pullRequestsEvidence, err = o.getRetriever().PREvidenceForCommitV2(o.payload.CommitSHA) + } if err != nil { return err } o.payload.PullRequests = pullRequestsEvidence - label := "" - o.payload.GitProvider, label = getGitProviderAndLabel(o.retriever) // PR evidence does not have files to upload form, cleanupNeeded, evidencePath, err := newEvidenceForm(o.payload, []string{}) diff --git a/go.mod b/go.mod index 9a976e37d..3910db57d 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/owenrumney/go-sarif/v2 v2.3.3 github.com/pkg/errors v0.9.1 github.com/rjeczalik/notify v0.9.3 + github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 diff --git a/go.sum b/go.sum index 15c6e9316..ec5cbabf3 100644 --- a/go.sum +++ b/go.sum @@ -611,6 +611,8 @@ github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPr github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 h1:17JxqqJY66GmZVHkmAsGEkcIu0oCe3AM420QDgGwZx0= +github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466/go.mod h1:9dIRpgIY7hVhoqfe0/FcYp0bpInZaT7dc3BYOprrIUE= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= diff --git a/internal/azure/azure.go b/internal/azure/azure.go index 557f8cf2a..5cc269daa 100644 --- a/internal/azure/azure.go +++ b/internal/azure/azure.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/kosli-dev/cli/internal/types" + "github.com/kosli-dev/cli/internal/utils" "github.com/microsoft/azure-devops-go-api/azuredevops" "github.com/microsoft/azure-devops-go-api/azuredevops/git" ) @@ -54,7 +55,8 @@ func NewAzureClientFromToken(ctx context.Context, azToken, orgURL string) (git.C return gitClient, nil } -func (c *AzureConfig) PREvidenceForCommit(commit string) ([]*types.PREvidence, error) { +// This is the old implementation, it will be removed after the PR payload is enhanced for Azure +func (c *AzureConfig) PREvidenceForCommitV2(commit string) ([]*types.PREvidence, error) { pullRequestsEvidence := []*types.PREvidence{} prs, err := c.PullRequestsForCommit(commit) if err != nil { @@ -70,6 +72,11 @@ func (c *AzureConfig) PREvidenceForCommit(commit string) ([]*types.PREvidence, e return pullRequestsEvidence, nil } +// This is the new implementation, it will be used for Azure +func (c *AzureConfig) PREvidenceForCommitV1(commit string) ([]*types.PREvidence, error) { + return []*types.PREvidence{}, nil +} + func (c *AzureConfig) newPRAzureEvidence(pr git.GitPullRequest) (*types.PREvidence, error) { prID := strconv.Itoa(*pr.PullRequestId) url, err := url.JoinPath(c.OrgURL, c.Project, "_git", c.Repository, "pullrequest", prID) @@ -85,7 +92,7 @@ func (c *AzureConfig) newPRAzureEvidence(pr git.GitPullRequest) (*types.PREviden if err != nil { return evidence, err } - evidence.Approvers = approvers + evidence.Approvers = utils.ConvertStringListToInterfaceList(approvers) return evidence, nil } diff --git a/internal/azure/azure_test.go b/internal/azure/azure_test.go index 155c051e2..4a75eab4e 100644 --- a/internal/azure/azure_test.go +++ b/internal/azure/azure_test.go @@ -66,7 +66,7 @@ func (suite *AzureTestSuite) TestPREvidenceForCommit() { testHelpers.SkipIfEnvVarUnset(suite.Suite.T(), []string{"KOSLI_AZURE_TOKEN"}) t.config.Token = os.Getenv("KOSLI_AZURE_TOKEN") } - prs, err := t.config.PREvidenceForCommit(t.commit) + prs, err := t.config.PREvidenceForCommitV2(t.commit) if t.result.wantError { require.Errorf(suite.Suite.T(), err, "expected an error but got: %s", err) } else { diff --git a/internal/bitbucket/bitbucket.go b/internal/bitbucket/bitbucket.go index f3b0a85e6..33a57faad 100644 --- a/internal/bitbucket/bitbucket.go +++ b/internal/bitbucket/bitbucket.go @@ -8,6 +8,7 @@ import ( "github.com/kosli-dev/cli/internal/logger" "github.com/kosli-dev/cli/internal/requests" "github.com/kosli-dev/cli/internal/types" + "github.com/kosli-dev/cli/internal/utils" ) type Config struct { @@ -21,10 +22,16 @@ type Config struct { Assert bool } -func (c *Config) PREvidenceForCommit(commit string) ([]*types.PREvidence, error) { +// This is the old implementation, it will be removed after the PR payload is enhanced for Bitbucket +func (c *Config) PREvidenceForCommitV2(commit string) ([]*types.PREvidence, error) { return c.getPullRequestsFromBitbucketApi(commit) } +// This is the new implementation, it will be used for Bitbucket +func (c *Config) PREvidenceForCommitV1(commit string) ([]*types.PREvidence, error) { + return []*types.PREvidence{}, nil +} + func (c *Config) getPullRequestsFromBitbucketApi(commit string) ([]*types.PREvidence, error) { pullRequestsEvidence := []*types.PREvidence{} @@ -122,7 +129,7 @@ func (c *Config) getPullRequestDetailsFromBitbucket(prApiUrl, prHtmlLink, commit } else { c.Logger.Debug("no approvers found") } - evidence.Approvers = approvers + evidence.Approvers = utils.ConvertStringListToInterfaceList(approvers) // prID := int(responseData["id"].(float64)) // evidence.LastCommit, evidence.LastCommitter, err = getBitbucketPRLastCommit(workspace, repository, username, password, prID) // if err != nil { diff --git a/internal/github/github.go b/internal/github/github.go index 50a5a0550..6c2f380ff 100644 --- a/internal/github/github.go +++ b/internal/github/github.go @@ -2,10 +2,15 @@ package github import ( "context" + "fmt" + "io" "strings" + "time" gh "github.com/google/go-github/v42/github" "github.com/kosli-dev/cli/internal/types" + "github.com/kosli-dev/cli/internal/utils" + "github.com/shurcooL/graphql" "golang.org/x/oauth2" ) @@ -59,34 +64,187 @@ func NewGithubClientFromToken(ctx context.Context, ghToken string, baseURL strin return gh.NewClient(tc), nil } -func (c *GithubConfig) PREvidenceForCommit(commit string) ([]*types.PREvidence, error) { +func graphqlEndpoint(baseURL string) string { + if baseURL == "" || baseURL == "https://api.github.com" { + return "https://api.github.com/graphql" + } + return strings.TrimSuffix(baseURL, "/") + "/api/graphql" +} + +func (c *GithubConfig) PREvidenceForCommitV2(commit string) ([]*types.PREvidence, error) { + ctx := context.Background() pullRequestsEvidence := []*types.PREvidence{} - prs, err := c.PullRequestsForCommit(commit) + + ghClient, err := NewGithubClientFromToken(ctx, c.Token, c.BaseURL) if err != nil { return pullRequestsEvidence, err } - for _, pr := range prs { - evidence, err := c.newPRGithubEvidence(pr) + httpClient := ghClient.Client() + + client := graphql.NewClient(graphqlEndpoint(c.BaseURL), httpClient) + + var query struct { + Repository struct { + Object struct { + Commit struct { + AssociatedPullRequests struct { + Nodes []struct { + Number graphql.Int + Title graphql.String + State graphql.String + HeadRefName graphql.String + URL graphql.String + CreatedAt graphql.String + MergedAt graphql.String + + Author struct { + Login graphql.String + } + + Commits struct { + Nodes []struct { + Commit struct { + Oid graphql.String + MessageHeadline graphql.String + CommittedDate graphql.String + URL graphql.String + Committer struct { + Name graphql.String + Email graphql.String + Date graphql.String + User *struct { + Login graphql.String + } + } + } + } + PageInfo struct { + HasNextPage graphql.Boolean + EndCursor graphql.String + } + } `graphql:"commits(first: 100, after: $commitCursor)"` + + Reviews struct { + Nodes []struct { + Author struct { + Login graphql.String + } + State graphql.String + SubmittedAt graphql.String + } + PageInfo struct { + HasNextPage graphql.Boolean + EndCursor graphql.String + } + } `graphql:"reviews(first: 100, states: APPROVED, after: $reviewCursor)"` + } + PageInfo struct { + HasNextPage graphql.Boolean + EndCursor graphql.String + } + } `graphql:"associatedPullRequests(first: 100, after: $prCursor)"` + } `graphql:"... on Commit"` + } `graphql:"object(oid: $commitSHA)"` + } `graphql:"repository(owner: $owner, name: $repo)"` + } + + variables := map[string]interface{}{ + "owner": graphql.String(c.Org), + "repo": graphql.String(c.Repository), + "commitSHA": GitObjectID(commit), + "prCursor": (*graphql.String)(nil), + "commitCursor": (*graphql.String)(nil), + "reviewCursor": (*graphql.String)(nil), + } + + err = client.Query(context.Background(), &query, variables) + if err != nil { + return pullRequestsEvidence, err + } + + // Print results for demonstration + for _, pr := range query.Repository.Object.Commit.AssociatedPullRequests.Nodes { + createdAt, err := time.Parse(time.RFC3339, string(pr.CreatedAt)) if err != nil { return pullRequestsEvidence, err } + mergedAt := int64(0) + if pr.MergedAt != "" { + mergedAtTime, err := time.Parse(time.RFC3339, string(pr.MergedAt)) + if err != nil { + return pullRequestsEvidence, err + } + mergedAt = mergedAtTime.Unix() + } + + evidence := &types.PREvidence{ + URL: string(pr.URL), + MergeCommit: commit, + State: string(pr.State), + Author: string(pr.Author.Login), + CreatedAt: createdAt.Unix(), + MergedAt: mergedAt, + Title: string(pr.Title), + HeadRef: string(pr.HeadRefName), + Approvers: []interface{}{}, + Commits: []types.Commit{}, + } + + for _, c := range pr.Commits.Nodes { + timestamp, err := time.Parse(time.RFC3339, string(c.Commit.CommittedDate)) + if err != nil { + return pullRequestsEvidence, err + } + + evidence.Commits = append(evidence.Commits, types.Commit{ + SHA: string(c.Commit.Oid), + Message: string(c.Commit.MessageHeadline), + Committer: fmt.Sprintf("%s <%s>", string(c.Commit.Committer.Name), string(c.Commit.Committer.Email)), + CommitterUsername: string(c.Commit.Committer.User.Login), + Timestamp: timestamp.Unix(), + Branch: string(pr.HeadRefName), + URL: string(c.Commit.URL), + }) + } + + for _, r := range pr.Reviews.Nodes { + submittedAt, err := time.Parse(time.RFC3339, string(r.SubmittedAt)) + if err != nil { + return pullRequestsEvidence, err + } + + evidence.Approvers = append(evidence.Approvers, types.PRApprovals{ + Username: string(r.Author.Login), + State: string(r.State), + Timestamp: submittedAt.Unix(), + }) + } + pullRequestsEvidence = append(pullRequestsEvidence, evidence) } return pullRequestsEvidence, nil } -func (c *GithubConfig) newPRGithubEvidence(pr *gh.PullRequest) (*types.PREvidence, error) { - evidence := &types.PREvidence{ - URL: pr.GetHTMLURL(), - MergeCommit: pr.GetMergeCommitSHA(), - State: pr.GetState(), - } - approvers, err := c.GetPullRequestApprovers(pr.GetNumber()) +type GitObjectID string + +func (v GitObjectID) MarshalGQL(w io.Writer) { + fmt.Fprintf(w, `"%s"`, string(v)) +} + +func (c *GithubConfig) PREvidenceForCommitV1(commit string) ([]*types.PREvidence, error) { + pullRequestsEvidence := []*types.PREvidence{} + prs, err := c.PullRequestsForCommit(commit) if err != nil { - return evidence, err + return pullRequestsEvidence, err } - evidence.Approvers = approvers - return evidence, nil + for _, pr := range prs { + evidence, err := c.newPRGithubEvidence(pr) + if err != nil { + return pullRequestsEvidence, err + } + pullRequestsEvidence = append(pullRequestsEvidence, evidence) + } + return pullRequestsEvidence, nil } // PullRequestsForCommit returns a list of pull requests for a specific commit @@ -121,3 +279,17 @@ func (c *GithubConfig) GetPullRequestApprovers(number int) ([]string, error) { } return approvers, nil } + +func (c *GithubConfig) newPRGithubEvidence(pr *gh.PullRequest) (*types.PREvidence, error) { + evidence := &types.PREvidence{ + URL: pr.GetHTMLURL(), + MergeCommit: pr.GetMergeCommitSHA(), + State: pr.GetState(), + } + approvers, err := c.GetPullRequestApprovers(pr.GetNumber()) + if err != nil { + return evidence, err + } + evidence.Approvers = utils.ConvertStringListToInterfaceList(approvers) + return evidence, nil +} diff --git a/internal/github/github_test.go b/internal/github/github_test.go index 5977cb1c4..7845e8a69 100644 --- a/internal/github/github_test.go +++ b/internal/github/github_test.go @@ -95,7 +95,7 @@ func (suite *GithubTestSuite) TestPREvidenceForCommit() { if t.commit == "" { t.commit = testHelpers.GithubCommitWithPR() } - prs, err := t.config.PREvidenceForCommit(t.commit) + prs, err := t.config.PREvidenceForCommitV2(t.commit) if t.result.wantError { require.Errorf(suite.Suite.T(), err, "expected an error but got: %s", err) } else { diff --git a/internal/gitlab/gitlab.go b/internal/gitlab/gitlab.go index fd8307c57..ec4545521 100644 --- a/internal/gitlab/gitlab.go +++ b/internal/gitlab/gitlab.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/kosli-dev/cli/internal/types" + "github.com/kosli-dev/cli/internal/utils" gitlab "gitlab.com/gitlab-org/api/client-go" ) @@ -38,7 +39,8 @@ func (c *GitlabConfig) ProjectID() string { return fmt.Sprintf("%s/%s", c.Org, c.Repository) } -func (c *GitlabConfig) PREvidenceForCommit(commit string) ([]*types.PREvidence, error) { +// This is the old implementation, it will be removed after the PR payload is enhanced for Gitlab +func (c *GitlabConfig) PREvidenceForCommitV2(commit string) ([]*types.PREvidence, error) { pullRequestsEvidence := []*types.PREvidence{} mrs, err := c.MergeRequestsForCommit(commit) if err != nil { @@ -54,6 +56,11 @@ func (c *GitlabConfig) PREvidenceForCommit(commit string) ([]*types.PREvidence, return pullRequestsEvidence, nil } +// This is the new implementation, it will be used for Gitlab +func (c *GitlabConfig) PREvidenceForCommitV1(commit string) ([]*types.PREvidence, error) { + return []*types.PREvidence{}, nil +} + func (c *GitlabConfig) newPRGitlabEvidence(mr *gitlab.BasicMergeRequest) (*types.PREvidence, error) { evidence := &types.PREvidence{ URL: mr.WebURL, @@ -64,7 +71,7 @@ func (c *GitlabConfig) newPRGitlabEvidence(mr *gitlab.BasicMergeRequest) (*types if err != nil { return evidence, err } - evidence.Approvers = approvers + evidence.Approvers = utils.ConvertStringListToInterfaceList(approvers) return evidence, nil } diff --git a/internal/gitlab/gitlab_test.go b/internal/gitlab/gitlab_test.go index 4786106e4..40bc3af33 100644 --- a/internal/gitlab/gitlab_test.go +++ b/internal/gitlab/gitlab_test.go @@ -214,7 +214,7 @@ func (suite *GitlabTestSuite) TestPREvidenceForCommit() { testHelpers.SkipIfEnvVarUnset(suite.Suite.T(), []string{"KOSLI_GITLAB_TOKEN"}) t.gitlabConfig.Token = os.Getenv("KOSLI_GITLAB_TOKEN") } - prs, err := t.gitlabConfig.PREvidenceForCommit(t.commit) + prs, err := t.gitlabConfig.PREvidenceForCommitV2(t.commit) if t.result.wantError { require.Error(suite.Suite.T(), err) } else { diff --git a/internal/types/types.go b/internal/types/types.go index 772ff3b44..303182729 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -1,15 +1,35 @@ package types type PREvidence struct { - MergeCommit string `json:"merge_commit"` - URL string `json:"url"` - State string `json:"state"` - Approvers []string `json:"approvers"` - // LastCommit string `json:"lastCommit"` - // LastCommitter string `json:"lastCommitter"` - // SelfApproved bool `json:"selfApproved"` + MergeCommit string `json:"merge_commit"` + URL string `json:"url"` + State string `json:"state"` + Approvers []interface{} `json:"approvers"` + Author string `json:"author,omitempty"` + CreatedAt int64 `json:"created_at,omitempty"` + MergedAt int64 `json:"merged_at,omitempty"` + Title string `json:"title,omitempty"` + HeadRef string `json:"head_ref,omitempty"` + Commits []Commit `json:"commits,omitempty"` +} + +type PRApprovals struct { + Username string `json:"username"` + State string `json:"state"` + Timestamp int64 `json:"timestamp"` +} + +type Commit struct { + SHA string `json:"sha1"` + Message string `json:"message"` + Committer string `json:"author"` + CommitterUsername string `json:"author_username"` + Timestamp int64 `json:"timestamp"` + Branch string `json:"branch"` + URL string `json:"url,omitempty"` } type PRRetriever interface { - PREvidenceForCommit(string) ([]*PREvidence, error) + PREvidenceForCommitV2(string) ([]*PREvidence, error) + PREvidenceForCommitV1(string) ([]*PREvidence, error) } diff --git a/internal/utils/utils.go b/internal/utils/utils.go index d6e9d069c..e104f593e 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -150,3 +150,11 @@ func CreateFileWithContent(path, content string) error { _, err = file.Write([]byte(content)) return err } + +func ConvertStringListToInterfaceList(approversList []string) []interface{} { + approversIface := make([]interface{}, len(approversList)) + for i, v := range approversList { + approversIface[i] = v + } + return approversIface +}