You've already forked drone-email
							
							
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			
		
			
				
	
	
		
			584 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			584 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package cmd
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| 
 | |
| 	"git.cryptic.systems/volker.raschek/drone-email-docker/pkg/domain"
 | |
| 	"git.cryptic.systems/volker.raschek/drone-email-docker/pkg/flags"
 | |
| 	"git.cryptic.systems/volker.raschek/drone-email-docker/pkg/mail"
 | |
| 	"github.com/spf13/cobra"
 | |
| 	"github.com/spf13/pflag"
 | |
| 	"github.com/spf13/viper"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	// The name of our config file, without the file extension because viper
 | |
| 	// supports many different config file languages.
 | |
| 	defaultConfigFilename  = "config"
 | |
| 	defaultConfigExtension = "yaml"
 | |
| 
 | |
| 	// The environment variable prefix of all environment variables bound to our command line flags.
 | |
| 	// For example, --number is bound to STING_NUMBER.
 | |
| 	envPrefix = ""
 | |
| )
 | |
| 
 | |
| func Execute(version string) error {
 | |
| 	rootCmd := &cobra.Command{
 | |
| 		Use: "drone-email",
 | |
| 		PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
 | |
| 			return initializeConfig(cmd)
 | |
| 		},
 | |
| 		RunE: func(cmd *cobra.Command, args []string) error {
 | |
| 			vars, err := newHTMLTemplateVarsByCommand(cmd)
 | |
| 			if err != nil {
 | |
| 				return fmt.Errorf("failed to initialize new html template vars: %w", err)
 | |
| 			}
 | |
| 
 | |
| 			smtpSettings, err := newSMTPSettingsByCommand(cmd)
 | |
| 			if err != nil {
 | |
| 				return fmt.Errorf("failed to initialize new config vars: %w", err)
 | |
| 			}
 | |
| 
 | |
| 			recipients, err := cmd.Flags().GetStringArray(flags.SMTP_TO_ADDRESSES)
 | |
| 			if err != nil {
 | |
| 				return fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_TO_ADDRESSES, err)
 | |
| 			}
 | |
| 
 | |
| 			err = mail.NewPlugin(smtpSettings).Exec(cmd.Context(), recipients, vars)
 | |
| 			if err != nil {
 | |
| 				return fmt.Errorf("failed to execute mail plugin: %w", err)
 | |
| 			}
 | |
| 
 | |
| 			_, err = fmt.Fprint(os.Stdout, "E-Mails successfully sent")
 | |
| 			if err != nil {
 | |
| 				return fmt.Errorf("failed to write message on stdout: %w", err)
 | |
| 			}
 | |
| 
 | |
| 			return nil
 | |
| 		},
 | |
| 		SilenceUsage: true,
 | |
| 		Version:      version,
 | |
| 	}
 | |
| 
 | |
| 	hostname, err := os.Hostname()
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("failed to detect hostname: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	// Drone environment variables/flags
 | |
| 	// Flags which receive their values from environment variables of the drone
 | |
| 	// CI/CD.
 | |
| 	//
 | |
| 	// The names of the FLags must match the environment variables, otherwise the
 | |
| 	// environment variables will not be bound correctly to the flags.
 | |
| 	rootCmd.Flags().Int64(flags.DRONE_BUILD_CREATED, 0, "Build created")
 | |
| 	rootCmd.Flags().Int64(flags.DRONE_BUILD_FINISHED, 0, "Build finished")
 | |
| 	rootCmd.Flags().Int64(flags.DRONE_BUILD_STARTED, 0, "Build stared")
 | |
| 	rootCmd.Flags().String(flags.DRONE_BUILD_EVENT, "push", "Build event")
 | |
| 	rootCmd.Flags().String(flags.DRONE_BUILD_LINK, "", "Build link")
 | |
| 	rootCmd.Flags().Int(flags.DRONE_BUILD_NUMBER, 0, "Build number")
 | |
| 	rootCmd.Flags().String(flags.DRONE_BUILD_STATUS, "success", "Build status")
 | |
| 
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_SHA, "", "SHA sum of the commit")
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_REF, "refs/heads/master", "Commit reference")
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_BRANCH, "master", "Commit branch")
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_LINK, "", "Link to the commit")
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_MESSAGE, "", "Commit message")
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_AUTHOR_NAME, "", "Name of the commit author")
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_AUTHOR_EMAIL, "", "E-Mail of the commit author")
 | |
| 	rootCmd.Flags().String(flags.DRONE_COMMIT_AUTHOR_AVATAR, "", "Avatar of the commit author")
 | |
| 
 | |
| 	rootCmd.Flags().String(flags.DRONE_DEPLOY_TO, "", "Deploy target")
 | |
| 
 | |
| 	rootCmd.Flags().String(flags.DRONE_JOB_NUMBER, "", "Job number")
 | |
| 	rootCmd.Flags().String(flags.DRONE_JOB_STATUS, "", "Job status")
 | |
| 	rootCmd.Flags().Int(flags.DRONE_JOB_EXIT_CODE, 0, "Job exit code")
 | |
| 	rootCmd.Flags().Int(flags.DRONE_JOB_STARTED, 0, "Job started")
 | |
| 	rootCmd.Flags().Int(flags.DRONE_JOB_FINISHED, 0, "Job finished")
 | |
| 
 | |
| 	rootCmd.Flags().String(flags.DRONE_PREV_BUILD_STATUS, "", "Previous build status")
 | |
| 	rootCmd.Flags().Int(flags.DRONE_PREV_BUILD_NUMBER, 0, "Previous build number")
 | |
| 	rootCmd.Flags().String(flags.DRONE_PREV_COMMIT_SHA, "", "Previous commit sha sum")
 | |
| 
 | |
| 	rootCmd.Flags().Int(flags.DRONE_PULL_REQUEST, 0, "Number of pull-request")
 | |
| 
 | |
| 	rootCmd.Flags().String(flags.DRONE_REMOTE_URL, "", "Clone URL of the repository")
 | |
| 
 | |
| 	rootCmd.Flags().Bool(flags.DRONE_REPO_PRIVATE, true, "Repository is private")
 | |
| 	rootCmd.Flags().Bool(flags.DRONE_REPO_TRUSTED, false, "Repository is trusted")
 | |
| 	rootCmd.Flags().String(flags.DRONE_REPO_AVATAR, "", "Avatar URL of the repository")
 | |
| 	rootCmd.Flags().String(flags.DRONE_REPO_BRANCH, "master", "Branch of the repository")
 | |
| 	rootCmd.Flags().String(flags.DRONE_REPO_LINK, "", "URL to the repository")
 | |
| 	rootCmd.Flags().String(flags.DRONE_REPO_NAME, "", "Name of the repository")
 | |
| 	rootCmd.Flags().String(flags.DRONE_REPO_OWNER, "", "Name of the repository owner")
 | |
| 	rootCmd.Flags().String(flags.DRONE_REPO_SCM, "git", "Source code management provider")
 | |
| 	rootCmd.Flags().String(flags.DRONE_REPO, "", "Full name of the repository")
 | |
| 
 | |
| 	rootCmd.Flags().String(flags.DRONE_TAG, "", "Tag")
 | |
| 
 | |
| 	rootCmd.Flags().Bool(flags.DRONE_YAML_SIGNED, false, "YAML is signed")
 | |
| 	rootCmd.Flags().Bool(flags.DRONE_YAML_VERIFIED, false, "YAML is verified")
 | |
| 
 | |
| 	// MAIL SETTINGS
 | |
| 	rootCmd.Flags().Bool(flags.SMTP_START_TLS, mail.DefaultSMTPStartTLS, "Use StartTLS instead of SSL")
 | |
| 	rootCmd.Flags().Bool(flags.SMTP_TLS_INSECURE_SKIP_VERIFY, mail.DefaultSMTPTLSInsecureSkipVerify, "Trust insecure TLS certificates")
 | |
| 	rootCmd.Flags().Int(flags.SMTP_PORT, mail.DefaultSMTPPort, "SMTP-Port")
 | |
| 	rootCmd.Flags().String(flags.SMTP_FROM_ADDRESS, mail.DefaultSMTPFromAddress, "SMTP-From Address")
 | |
| 	rootCmd.Flags().String(flags.SMTP_FROM_NAME, mail.DefaultSMTPFromName, "SMTP-From Name")
 | |
| 	rootCmd.Flags().String(flags.SMTP_HELO, hostname, "SMTP-HELO/EHLO")
 | |
| 	rootCmd.Flags().String(flags.SMTP_HOST, mail.DefaultSMTPHost, "SMTP-Host")
 | |
| 	rootCmd.Flags().String(flags.SMTP_PASSWORD, "", "SMTP-Password")
 | |
| 	rootCmd.Flags().String(flags.SMTP_USERNAME, "", "SMTP-User")
 | |
| 	rootCmd.Flags().StringArray(flags.SMTP_TO_ADDRESSES, []string{}, "List of recipients")
 | |
| 
 | |
| 	rootCmd.AddCommand(completionCmd)
 | |
| 
 | |
| 	err = rootCmd.Execute()
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("failed to execute root cmd: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func initializeConfig(cmd *cobra.Command) error {
 | |
| 	v := viper.New()
 | |
| 
 | |
| 	// Set the base name of the config file, without the file extension.
 | |
| 	v.SetConfigName(defaultConfigFilename)
 | |
| 	v.SetConfigType(defaultConfigExtension)
 | |
| 
 | |
| 	// Set as many paths as you like where viper should look for the
 | |
| 	// config file. We are only looking in the current working directory.
 | |
| 	v.AddConfigPath(".")
 | |
| 	v.AddConfigPath("$HOME/.config/drone-email/")
 | |
| 	v.AddConfigPath("/etc/drone-email/")
 | |
| 
 | |
| 	// Attempt to read the config file, gracefully ignoring errors
 | |
| 	// caused by a config file not being found. Return an error
 | |
| 	// if we cannot parse the config file.
 | |
| 	if err := v.ReadInConfig(); err != nil {
 | |
| 		// It's okay if there isn't a config file
 | |
| 		if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
 | |
| 			return fmt.Errorf("failed to read config: %w", err)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Bind to environment variables
 | |
| 	// Works great for simple config names, but needs help for names
 | |
| 	// like --favorite-color which we fix in the bindFlags function
 | |
| 	v.AutomaticEnv()
 | |
| 
 | |
| 	// Bind the current command's flags to viper
 | |
| 	bindFlags(cmd, v)
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // Bind each cobra flag to its associated viper configuration (config file and environment variable)
 | |
| func bindFlags(cmd *cobra.Command, v *viper.Viper) {
 | |
| 	cmd.Flags().VisitAll(func(f *pflag.Flag) {
 | |
| 		// Environment variables can't have dashes in them, so bind them to their equivalent
 | |
| 		// keys with underscores, e.g. --favorite-color to STING_FAVORITE_COLOR
 | |
| 		if strings.Contains(f.Name, "-") {
 | |
| 			envVarSuffix := strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_"))
 | |
| 			if len(envPrefix) <= 0 {
 | |
| 				_ = v.BindEnv(f.Name, envVarSuffix)
 | |
| 			} else {
 | |
| 				_ = v.BindEnv(f.Name, fmt.Sprintf("%s_%s", envPrefix, envVarSuffix))
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Apply the viper config value to the flag when the flag is not set and viper has a value
 | |
| 		if !f.Changed && v.IsSet(f.Name) {
 | |
| 			val := v.Get(f.Name)
 | |
| 			_ = cmd.Flags().Set(f.Name, fmt.Sprintf("%v", val))
 | |
| 		}
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func newHTMLTemplateVarsByCommand(cmd *cobra.Command) (*mail.CIVars, error) {
 | |
| 	build, err := newBuildByCommand(cmd)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to initialize new build struct: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	commit, err := newCommitByCommand(cmd)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to initialize new commit struct: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	deployTo, err := cmd.Flags().GetString(flags.DRONE_DEPLOY_TO)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_DEPLOY_TO, err)
 | |
| 	}
 | |
| 
 | |
| 	job, err := newJobByCommand(cmd)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to initialize new job struct: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	prev, err := newPrevByCommand(cmd)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to initialize new prev struct: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	pullRequests, err := cmd.Flags().GetInt(flags.DRONE_PULL_REQUEST)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PULL_REQUEST, err)
 | |
| 	}
 | |
| 
 | |
| 	remote, err := newRemoteByCommand(cmd)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to initialize new remote struct: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	repo, err := newRepoByCommand(cmd)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to initialize new repo struct: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	tag, err := cmd.Flags().GetString(flags.DRONE_TAG)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_TAG, err)
 | |
| 	}
 | |
| 
 | |
| 	yaml, err := newYAMLByCommand(cmd)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to initialize new yaml struct: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	return &mail.CIVars{
 | |
| 		Build:       build,
 | |
| 		Commit:      commit,
 | |
| 		DeployTo:    deployTo,
 | |
| 		Job:         job,
 | |
| 		Prev:        prev,
 | |
| 		PullRequest: pullRequests,
 | |
| 		Remote:      remote,
 | |
| 		Repo:        repo,
 | |
| 		Tag:         tag,
 | |
| 		Yaml:        yaml,
 | |
| 	}, nil
 | |
| }
 | |
| 
 | |
| func newBuildByCommand(cmd *cobra.Command) (*domain.Build, error) {
 | |
| 	buildCreated, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_CREATED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_CREATED, err)
 | |
| 	}
 | |
| 
 | |
| 	buildEvent, err := cmd.Flags().GetString(flags.DRONE_BUILD_EVENT)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_EVENT, err)
 | |
| 	}
 | |
| 
 | |
| 	buildFinished, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_FINISHED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_FINISHED, err)
 | |
| 	}
 | |
| 
 | |
| 	buildLink, err := cmd.Flags().GetString(flags.DRONE_BUILD_LINK)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_LINK, err)
 | |
| 	}
 | |
| 
 | |
| 	buildNumber, err := cmd.Flags().GetInt(flags.DRONE_BUILD_NUMBER)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_NUMBER, err)
 | |
| 	}
 | |
| 
 | |
| 	buildStared, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_STARTED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_STARTED, err)
 | |
| 	}
 | |
| 
 | |
| 	buildStatus, err := cmd.Flags().GetString(flags.DRONE_BUILD_STATUS)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_STATUS, err)
 | |
| 	}
 | |
| 
 | |
| 	build := &domain.Build{
 | |
| 		Created:  buildCreated,
 | |
| 		Event:    buildEvent,
 | |
| 		Finished: buildFinished,
 | |
| 		Link:     buildLink,
 | |
| 		Number:   buildNumber,
 | |
| 		Started:  buildStared,
 | |
| 		Status:   buildStatus,
 | |
| 	}
 | |
| 
 | |
| 	return build, nil
 | |
| }
 | |
| 
 | |
| func newCommitByCommand(cmd *cobra.Command) (*domain.Commit, error) {
 | |
| 	authorAvatar, err := cmd.Flags().GetString(flags.DRONE_COMMIT_AUTHOR_AVATAR)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_AUTHOR_AVATAR, err)
 | |
| 	}
 | |
| 
 | |
| 	authorEmail, err := cmd.Flags().GetString(flags.DRONE_COMMIT_AUTHOR_EMAIL)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_AUTHOR_EMAIL, err)
 | |
| 	}
 | |
| 
 | |
| 	authorName, err := cmd.Flags().GetString(flags.DRONE_COMMIT_AUTHOR_NAME)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_AUTHOR_NAME, err)
 | |
| 	}
 | |
| 
 | |
| 	branch, err := cmd.Flags().GetString(flags.DRONE_COMMIT_BRANCH)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_BRANCH, err)
 | |
| 	}
 | |
| 
 | |
| 	link, err := cmd.Flags().GetString(flags.DRONE_COMMIT_LINK)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_LINK, err)
 | |
| 	}
 | |
| 
 | |
| 	message, err := cmd.Flags().GetString(flags.DRONE_COMMIT_MESSAGE)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_MESSAGE, err)
 | |
| 	}
 | |
| 
 | |
| 	ref, err := cmd.Flags().GetString(flags.DRONE_COMMIT_REF)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_REF, err)
 | |
| 	}
 | |
| 
 | |
| 	sha, err := cmd.Flags().GetString(flags.DRONE_COMMIT_SHA)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_SHA, err)
 | |
| 	}
 | |
| 
 | |
| 	commit := &domain.Commit{
 | |
| 		Author: &domain.Author{
 | |
| 			Avatar: authorAvatar,
 | |
| 			Email:  authorEmail,
 | |
| 			Name:   authorName,
 | |
| 		},
 | |
| 		Branch:  branch,
 | |
| 		Link:    link,
 | |
| 		Message: message,
 | |
| 		Ref:     ref,
 | |
| 		Sha:     sha,
 | |
| 	}
 | |
| 
 | |
| 	return commit, nil
 | |
| }
 | |
| 
 | |
| func newJobByCommand(cmd *cobra.Command) (*domain.Job, error) {
 | |
| 	exitCode, err := cmd.Flags().GetInt(flags.DRONE_JOB_EXIT_CODE)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_JOB_EXIT_CODE, err)
 | |
| 	}
 | |
| 
 | |
| 	finished, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_FINISHED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_FINISHED, err)
 | |
| 	}
 | |
| 
 | |
| 	started, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_STARTED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_STARTED, err)
 | |
| 	}
 | |
| 
 | |
| 	status, err := cmd.Flags().GetString(flags.DRONE_JOB_STATUS)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_JOB_STATUS, err)
 | |
| 	}
 | |
| 
 | |
| 	job := &domain.Job{
 | |
| 		ExitCode: exitCode,
 | |
| 		Finished: finished,
 | |
| 		Started:  started,
 | |
| 		Status:   status,
 | |
| 	}
 | |
| 
 | |
| 	return job, nil
 | |
| }
 | |
| 
 | |
| func newPrevByCommand(cmd *cobra.Command) (*domain.Prev, error) {
 | |
| 	prevBuildNumber, err := cmd.Flags().GetInt(flags.DRONE_PREV_BUILD_NUMBER)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PREV_BUILD_NUMBER, err)
 | |
| 	}
 | |
| 
 | |
| 	prevBuildStatus, err := cmd.Flags().GetString(flags.DRONE_PREV_BUILD_STATUS)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PREV_BUILD_STATUS, err)
 | |
| 	}
 | |
| 
 | |
| 	prevCommitSha, err := cmd.Flags().GetString(flags.DRONE_PREV_COMMIT_SHA)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PREV_COMMIT_SHA, err)
 | |
| 	}
 | |
| 
 | |
| 	prev := &domain.Prev{
 | |
| 		Build: &domain.PrevBuild{
 | |
| 			Number: prevBuildNumber,
 | |
| 			Status: prevBuildStatus,
 | |
| 		},
 | |
| 		Commit: &domain.PrevCommit{
 | |
| 			Sha: prevCommitSha,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	return prev, nil
 | |
| }
 | |
| 
 | |
| func newRemoteByCommand(cmd *cobra.Command) (*domain.Remote, error) {
 | |
| 	remoteURL, err := cmd.Flags().GetString(flags.DRONE_REMOTE_URL)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REMOTE_URL, err)
 | |
| 	}
 | |
| 
 | |
| 	remote := &domain.Remote{
 | |
| 		URL: remoteURL,
 | |
| 	}
 | |
| 
 | |
| 	return remote, nil
 | |
| }
 | |
| 
 | |
| func newRepoByCommand(cmd *cobra.Command) (*domain.Repo, error) {
 | |
| 	avatar, err := cmd.Flags().GetString(flags.DRONE_REPO_AVATAR)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_AVATAR, err)
 | |
| 	}
 | |
| 
 | |
| 	branch, err := cmd.Flags().GetString(flags.DRONE_REPO_BRANCH)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_BRANCH, err)
 | |
| 	}
 | |
| 
 | |
| 	fullName, err := cmd.Flags().GetString(flags.DRONE_REPO_NAME)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_NAME, err)
 | |
| 	}
 | |
| 
 | |
| 	link, err := cmd.Flags().GetString(flags.DRONE_REPO_LINK)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_LINK, err)
 | |
| 	}
 | |
| 
 | |
| 	name, err := cmd.Flags().GetString(flags.DRONE_REPO)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO, err)
 | |
| 	}
 | |
| 
 | |
| 	owner, err := cmd.Flags().GetString(flags.DRONE_REPO_OWNER)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_OWNER, err)
 | |
| 	}
 | |
| 
 | |
| 	private, err := cmd.Flags().GetBool(flags.DRONE_REPO_PRIVATE)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_PRIVATE, err)
 | |
| 	}
 | |
| 
 | |
| 	scm, err := cmd.Flags().GetString(flags.DRONE_REPO_SCM)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_SCM, err)
 | |
| 	}
 | |
| 
 | |
| 	trusted, err := cmd.Flags().GetBool(flags.DRONE_REPO_TRUSTED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_TRUSTED, err)
 | |
| 	}
 | |
| 
 | |
| 	remote := &domain.Repo{
 | |
| 		Avatar:   avatar,
 | |
| 		Branch:   branch,
 | |
| 		FullName: fullName,
 | |
| 		Link:     link,
 | |
| 		Name:     name,
 | |
| 		Owner:    owner,
 | |
| 		Private:  private,
 | |
| 		SCM:      scm,
 | |
| 		Trusted:  trusted,
 | |
| 	}
 | |
| 
 | |
| 	return remote, nil
 | |
| }
 | |
| 
 | |
| func newYAMLByCommand(cmd *cobra.Command) (*domain.Yaml, error) {
 | |
| 	signed, err := cmd.Flags().GetBool(flags.DRONE_YAML_SIGNED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_YAML_SIGNED, err)
 | |
| 	}
 | |
| 
 | |
| 	verified, err := cmd.Flags().GetBool(flags.DRONE_YAML_VERIFIED)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_YAML_VERIFIED, err)
 | |
| 	}
 | |
| 
 | |
| 	yaml := &domain.Yaml{
 | |
| 		Signed:   signed,
 | |
| 		Verified: verified,
 | |
| 	}
 | |
| 
 | |
| 	return yaml, nil
 | |
| }
 | |
| 
 | |
| func newSMTPSettingsByCommand(cmd *cobra.Command) (*domain.SMTPSettings, error) {
 | |
| 	smtpStartTLS, err := cmd.Flags().GetBool(flags.SMTP_START_TLS)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_START_TLS, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpFromAddress, err := cmd.Flags().GetString(flags.SMTP_FROM_ADDRESS)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_FROM_ADDRESS, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpFromName, err := cmd.Flags().GetString(flags.SMTP_FROM_NAME)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_FROM_NAME, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpHELOName, err := cmd.Flags().GetString(flags.SMTP_HELO)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_HELO, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpHost, err := cmd.Flags().GetString(flags.SMTP_HOST)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_HOST, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpPassword, err := cmd.Flags().GetString(flags.SMTP_PASSWORD)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_PASSWORD, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpPort, err := cmd.Flags().GetInt(flags.SMTP_PORT)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_PORT, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpTLSInsecureSkipVerify, err := cmd.Flags().GetBool(flags.SMTP_TLS_INSECURE_SKIP_VERIFY)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_TLS_INSECURE_SKIP_VERIFY, err)
 | |
| 	}
 | |
| 
 | |
| 	smtpUsername, err := cmd.Flags().GetString(flags.SMTP_USERNAME)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_USERNAME, err)
 | |
| 	}
 | |
| 
 | |
| 	return &domain.SMTPSettings{
 | |
| 		FromAddress:           smtpFromAddress,
 | |
| 		FromName:              smtpFromName,
 | |
| 		HELOName:              smtpHELOName,
 | |
| 		Host:                  smtpHost,
 | |
| 		Password:              smtpPassword,
 | |
| 		Port:                  smtpPort,
 | |
| 		StartTLS:              smtpStartTLS,
 | |
| 		TLSInsecureSkipVerify: smtpTLSInsecureSkipVerify,
 | |
| 		Username:              smtpUsername,
 | |
| 	}, nil
 | |
| }
 |