Skip to content

Commit

Permalink
migrate to cobra
Browse files Browse the repository at this point in the history
  • Loading branch information
motatoes committed Jan 31, 2024
1 parent 0e49f41 commit 0aa992f
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 149 deletions.
144 changes: 8 additions & 136 deletions cli/cmd/digger/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,25 @@ import (
"context"
"encoding/json"
"fmt"
core_reporting "github.com/diggerhq/digger/cli/pkg/core/reporting"
"github.com/diggerhq/digger/cli/pkg/generic_ci"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"log"
"net/http"
"os"
"runtime/debug"
"strconv"
"strings"
"time"

"github.com/diggerhq/digger/cli/pkg/azure"
"github.com/diggerhq/digger/cli/pkg/backend"
"github.com/diggerhq/digger/cli/pkg/bitbucket"
core_backend "github.com/diggerhq/digger/cli/pkg/core/backend"
core_locking "github.com/diggerhq/digger/cli/pkg/core/locking"
core_policy "github.com/diggerhq/digger/cli/pkg/core/policy"
core_storage "github.com/diggerhq/digger/cli/pkg/core/storage"
"github.com/diggerhq/digger/cli/pkg/digger"
"github.com/diggerhq/digger/cli/pkg/gcp"
github_pkg "github.com/diggerhq/digger/cli/pkg/github"
github_models "github.com/diggerhq/digger/cli/pkg/github/models"
"github.com/diggerhq/digger/cli/pkg/gitlab"
"github.com/diggerhq/digger/cli/pkg/locking"
"github.com/diggerhq/digger/cli/pkg/policy"
"github.com/diggerhq/digger/cli/pkg/reporting"
"github.com/diggerhq/digger/cli/pkg/storage"
"github.com/diggerhq/digger/cli/pkg/usage"
Expand Down Expand Up @@ -775,12 +768,7 @@ func bitbucketCI(lock core_locking.Lock, policyChecker core_policy.Checker, back
reportErrorAndExit(actor, "Digger finished successfully", 0)
}

func plan(v *viper.Viper, projectName string, lock core_locking.Lock, policyChecker core_policy.Checker, reportingStrategy reporting.ReportStrategy, backendApi core_backend.Api) {
actor := "ACTOR"
repoNamespace := os.Getenv("REPO_NAMESPACE")
var runConfig RunConfig
if err := v.Unmarshal(&runConfig); err != nil {
}
func exec(actor string, projectName string, repoNamespace string, command string, lock core_locking.Lock, policyChecker core_policy.Checker, prService orchestrator.PullRequestService, orgService orchestrator.OrgService, reporter core_reporting.Reporter, backendApi core_backend.Api) {

//SCMOrganisation, SCMrepository := utils.ParseRepoNamespace(runConfig.RepoNamespace)
currentDir, err := os.Getwd()
Expand All @@ -792,26 +780,19 @@ func plan(v *viper.Viper, projectName string, lock core_locking.Lock, policyChec

planStorage := newPlanStorage("", "", "", actor, nil)

reporter := &reporting.StdoutReporter{
ReportStrategy: reportingStrategy,
IsSupportMarkdown: true,
}

prService := github_pkg.MockCiService{}

diggerConfig, _, dependencyGraph, err := digger_config.LoadDiggerConfig("./")
if err != nil {
reportErrorAndExit(actor, fmt.Sprintf("Failed to load digger config. %s", err), 4)
}
//impactedProjects := diggerConfig.GetModifiedProjects(strings.Split(runConfig.FilesChanged, ","))
impactedProjects := diggerConfig.GetProjects(projectName)
jobs, _, err := generic_ci.ConvertToCommands(actor, repoNamespace, "digger plan", impactedProjects, nil, diggerConfig.Workflows)
jobs, _, err := generic_ci.ConvertToCommands(actor, repoNamespace, command, impactedProjects, nil, diggerConfig.Workflows)
if err != nil {
reportErrorAndExit(actor, fmt.Sprintf("Failed to convert impacted projects to commands. %s", err), 4)
}

jobs = digger.SortedCommandsByDependency(jobs, &dependencyGraph)
_, _, err = digger.RunJobs(jobs, &prService, &prService, lock, reporter, planStorage, policyChecker, backendApi, "", false, 123, currentDir)
_, _, err = digger.RunJobs(jobs, prService, orgService, lock, reporter, planStorage, policyChecker, backendApi, "", false, 123, currentDir)
}

/*
Expand All @@ -829,122 +810,13 @@ Exit codes:
*/

func main() {
args := os.Args[1:]
if len(args) > 0 && args[0] == "version" {
log.Println(utils.GetVersion())
os.Exit(0)
}
if len(args) > 0 && args[0] == "help" {
utils.DisplayCommands()
os.Exit(0)
}

var policyChecker core_policy.Checker
var backendApi core_backend.Api
if os.Getenv("NO_BACKEND") == "true" {
log.Println("WARNING: running in 'backendless' mode. Features that require backend will not be available.")
policyChecker = policy.NoOpPolicyChecker{}
backendApi = backend.NoopApi{}
} else if os.Getenv("DIGGER_TOKEN") != "" {
if os.Getenv("DIGGER_ORGANISATION") == "" {
log.Fatalf("Token specified but missing organisation: DIGGER_ORGANISATION. Please set this value in action digger_config.")
}
policyChecker = policy.DiggerPolicyChecker{
PolicyProvider: &policy.DiggerHttpPolicyProvider{
DiggerHost: os.Getenv("DIGGER_HOSTNAME"),
DiggerOrganisation: os.Getenv("DIGGER_ORGANISATION"),
AuthToken: os.Getenv("DIGGER_TOKEN"),
HttpClient: http.DefaultClient,
}}
backendApi = backend.DiggerApi{
DiggerHost: os.Getenv("DIGGER_HOSTNAME"),
AuthToken: os.Getenv("DIGGER_TOKEN"),
HttpClient: http.DefaultClient,
}
} else {
reportErrorAndExit("", "DIGGER_TOKEN not specified. You can get one at https://cloud.digger.dev, or self-manage a backend of Digger Community Edition (change DIGGER_HOSTNAME). You can also pass 'no-backend: true' option; in this case some of the features may not be available.", 1)
}

var reportStrategy reporting.ReportStrategy

if os.Getenv("REPORTING_STRATEGY") == "comments_per_run" || os.Getenv("ACCUMULATE_PLANS") == "true" {
reportStrategy = &reporting.CommentPerRunStrategy{
TimeOfRun: time.Now(),
}
} else if os.Getenv("REPORTING_STRATEGY") == "latest_run_comment" {
reportStrategy = &reporting.LatestRunCommentStrategy{
TimeOfRun: time.Now(),
}
} else {
reportStrategy = &reporting.MultipleCommentsStrategy{}
if len(os.Args) == 1 {
os.Args = append([]string{os.Args[0]}, "default")
}

lock, err := locking.GetLock()
if err != nil {
log.Printf("Failed to create lock provider. %s\n", err)
os.Exit(2)
if err := rootCmd.Execute(); err != nil {
reportErrorAndExit("", fmt.Sprintf("Error occured during command exec: %v", err), 8)
}
log.Println("Lock provider has been created successfully")

if len(args) > 0 && args[0] == "plan" {
projectName := args[1]
runCmd := cobra.Command{Use: "plan"}
rootCmd.AddCommand(&runCmd)
v, err := initCobraCmdForRun(&runCmd)
runCmd.Run = func(cmd *cobra.Command, args []string) {
if err != nil {
reportErrorAndExit("", fmt.Sprintf("Could initialize command line args: %v", err), 1)
}
plan(v, projectName, lock, policyChecker, reportStrategy, backendApi)
}
runCmd.Flags().Visit(func(f *pflag.Flag) {
println(f.Name, f.Value)
})
if err := runCmd.Execute(); err != nil {
reportErrorAndExit("", fmt.Sprintf("Error occured during command exec: %v", err), 8)
}

os.Exit(0)
}

ci := digger.DetectCI()

var logLeader = "Unknown CI"

switch ci {
case digger.GitHub:
logLeader = os.Getenv("GITHUB_ACTOR")
gitHubCI(lock, policyChecker, backendApi, reportStrategy)
case digger.GitLab:
logLeader = os.Getenv("CI_PROJECT_NAME")
gitLabCI(lock, policyChecker, backendApi, reportStrategy)
case digger.Azure:
// This should be refactored in the future because in this way the parsing
// is done twice, both here and inside azureCI, a better solution might be
// to encapsulate it into a method on the azure package and then grab the
// value here and pass it into the azureCI call.
azureContext := os.Getenv("AZURE_CONTEXT")
parsedAzureContext, _ := azure.GetAzureReposContext(azureContext)
logLeader = parsedAzureContext.BaseUrl
azureCI(lock, policyChecker, backendApi, reportStrategy)
case digger.BitBucket:
logLeader = os.Getenv("BITBUCKET_STEP_TRIGGERER_UUID")
bitbucketCI(lock, policyChecker, backendApi, reportStrategy)
case digger.None:
print("No CI detected.")
os.Exit(10)
}

defer func() {
if r := recover(); r != nil {
log.Println(fmt.Sprintf("stacktrace from panic: \n" + string(debug.Stack())))
err := usage.SendLogRecord(logLeader, fmt.Sprintf("Panic occurred. %s", r))
if err != nil {
log.Printf("Failed to send log record. %s\n", err)
}
os.Exit(1)
}
}()
}

func newPlanStorage(ghToken string, ghRepoOwner string, ghRepositoryName string, requestedBy string, prNumber *int) core_storage.PlanStorage {
Expand Down
1 change: 1 addition & 0 deletions cli/pkg/reporting/mocks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package reporting
26 changes: 13 additions & 13 deletions libs/orchestrator/github/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ type GithubService struct {
Owner string
}

func (svc *GithubService) GetUserTeams(organisation string, user string) ([]string, error) {
func (svc GithubService) GetUserTeams(organisation string, user string) ([]string, error) {
teamsResponse, _, err := svc.Client.Teams.ListTeams(context.Background(), organisation, nil)
if err != nil {
return nil, fmt.Errorf("failed to list github teams: %v", err)
Expand All @@ -51,7 +51,7 @@ func (svc *GithubService) GetUserTeams(organisation string, user string) ([]stri
return teams, nil
}

func (svc *GithubService) GetChangedFiles(prNumber int) ([]string, error) {
func (svc GithubService) GetChangedFiles(prNumber int) ([]string, error) {
var fileNames []string
opts := github.ListOptions{PerPage: 100}
for {
Expand All @@ -74,12 +74,12 @@ func (svc *GithubService) GetChangedFiles(prNumber int) ([]string, error) {
return fileNames, nil
}

func (svc *GithubService) PublishComment(prNumber int, comment string) (int64, error) {
func (svc GithubService) PublishComment(prNumber int, comment string) (int64, error) {
githubComment, _, err := svc.Client.Issues.CreateComment(context.Background(), svc.Owner, svc.RepoName, prNumber, &github.IssueComment{Body: &comment})
return *githubComment.ID, err
}

func (svc *GithubService) GetComments(prNumber int) ([]orchestrator.Comment, error) {
func (svc GithubService) GetComments(prNumber int) ([]orchestrator.Comment, error) {
comments, _, err := svc.Client.Issues.ListComments(context.Background(), svc.Owner, svc.RepoName, prNumber, &github.IssueListCommentsOptions{ListOptions: github.ListOptions{PerPage: 100}})
commentBodies := make([]orchestrator.Comment, len(comments))
for i, comment := range comments {
Expand All @@ -91,7 +91,7 @@ func (svc *GithubService) GetComments(prNumber int) ([]orchestrator.Comment, err
return commentBodies, err
}

func (svc *GithubService) GetApprovals(prNumber int) ([]string, error) {
func (svc GithubService) GetApprovals(prNumber int) ([]string, error) {
reviews, _, err := svc.Client.PullRequests.ListReviews(context.Background(), svc.Owner, svc.RepoName, prNumber, &github.ListOptions{})
approvals := make([]string, 0)
for _, review := range reviews {
Expand All @@ -102,13 +102,13 @@ func (svc *GithubService) GetApprovals(prNumber int) ([]string, error) {
return approvals, err
}

func (svc *GithubService) EditComment(prNumber int, id interface{}, comment string) error {
func (svc GithubService) EditComment(prNumber int, id interface{}, comment string) error {
commentId := id.(int64)
_, _, err := svc.Client.Issues.EditComment(context.Background(), svc.Owner, svc.RepoName, commentId, &github.IssueComment{Body: &comment})
return err
}

func (svc *GithubService) SetStatus(prNumber int, status string, statusContext string) error {
func (svc GithubService) SetStatus(prNumber int, status string, statusContext string) error {
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
if err != nil {
log.Fatalf("error getting pull request: %v", err)
Expand All @@ -122,7 +122,7 @@ func (svc *GithubService) SetStatus(prNumber int, status string, statusContext s
return err
}

func (svc *GithubService) GetCombinedPullRequestStatus(prNumber int) (string, error) {
func (svc GithubService) GetCombinedPullRequestStatus(prNumber int) (string, error) {
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
if err != nil {
log.Fatalf("error getting pull request: %v", err)
Expand All @@ -136,7 +136,7 @@ func (svc *GithubService) GetCombinedPullRequestStatus(prNumber int) (string, er
return *statuses.State, nil
}

func (svc *GithubService) MergePullRequest(prNumber int) error {
func (svc GithubService) MergePullRequest(prNumber int) error {
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
if err != nil {
log.Fatalf("error getting pull request: %v", err)
Expand Down Expand Up @@ -164,7 +164,7 @@ func isMergeableState(mergeableState string) bool {
return exists
}

func (svc *GithubService) IsMergeable(prNumber int) (bool, error) {
func (svc GithubService) IsMergeable(prNumber int) (bool, error) {
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
if err != nil {
log.Fatalf("error getting pull request: %v", err)
Expand All @@ -174,7 +174,7 @@ func (svc *GithubService) IsMergeable(prNumber int) (bool, error) {
return pr.GetMergeable() && isMergeableState(pr.GetMergeableState()), nil
}

func (svc *GithubService) IsMerged(prNumber int) (bool, error) {
func (svc GithubService) IsMerged(prNumber int) (bool, error) {
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
if err != nil {
log.Fatalf("error getting pull request: %v", err)
Expand All @@ -183,7 +183,7 @@ func (svc *GithubService) IsMerged(prNumber int) (bool, error) {
return *pr.Merged, nil
}

func (svc *GithubService) IsClosed(prNumber int) (bool, error) {
func (svc GithubService) IsClosed(prNumber int) (bool, error) {
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
if err != nil {
log.Fatalf("error getting pull request: %v", err)
Expand All @@ -193,7 +193,7 @@ func (svc *GithubService) IsClosed(prNumber int) (bool, error) {
return pr.GetState() == "closed", nil
}

func (svc *GithubService) GetBranchName(prNumber int) (string, error) {
func (svc GithubService) GetBranchName(prNumber int) (string, error) {
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
if err != nil {
log.Fatalf("error getting pull request: %v", err)
Expand Down

0 comments on commit 0aa992f

Please sign in to comment.