Skip to content

Commit

Permalink
Merge branch 'v2' into writer_fix
Browse files Browse the repository at this point in the history
  • Loading branch information
tigerinus committed Dec 21, 2022
2 parents acb7d9e + 24f8327 commit fc38208
Show file tree
Hide file tree
Showing 39 changed files with 288 additions and 222 deletions.
10 changes: 5 additions & 5 deletions cmd/compose/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import (
)

type buildOptions struct {
*projectOptions
*ProjectOptions
composeOptions
quiet bool
pull bool
Expand Down Expand Up @@ -73,16 +73,16 @@ var printerModes = []string{
buildx.PrinterModeQuiet,
}

func buildCommand(p *projectOptions, backend api.Service) *cobra.Command {
func buildCommand(p *ProjectOptions, streams api.Streams, backend api.Service) *cobra.Command {
opts := buildOptions{
projectOptions: p,
ProjectOptions: p,
}
cmd := &cobra.Command{
Use: "build [OPTIONS] [SERVICE...]",
Short: "Build or rebuild services",
PreRunE: Adapt(func(ctx context.Context, args []string) error {
if opts.memory != "" {
fmt.Println("WARNING --memory is ignored as not supported in buildkit.")
fmt.Fprintln(streams.Err(), "WARNING --memory is ignored as not supported in buildkit.")
}
if opts.quiet {
opts.progress = buildx.PrinterModeQuiet
Expand Down Expand Up @@ -129,7 +129,7 @@ func buildCommand(p *projectOptions, backend api.Service) *cobra.Command {
}

func runBuild(ctx context.Context, backend api.Service, opts buildOptions, services []string) error {
project, err := opts.toProject(services, cli.WithResolvedPaths(true))
project, err := opts.ToProject(services, cli.WithResolvedPaths(true))
if err != nil {
return err
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/compose/completion.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ func noCompletion() validArgsFn {
}
}

func completeServiceNames(p *projectOptions) validArgsFn {
func completeServiceNames(p *ProjectOptions) validArgsFn {
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
project, err := p.toProject(nil)
project, err := p.ToProject(nil)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
Expand Down
55 changes: 27 additions & 28 deletions cmd/compose/compose.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import (
"github.com/docker/buildx/util/logutil"
dockercli "github.com/docker/cli/cli"
"github.com/docker/cli/cli-plugins/manager"
"github.com/docker/cli/cli/command"
"github.com/morikuni/aec"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
Expand Down Expand Up @@ -91,7 +90,7 @@ func Adapt(fn Command) func(cmd *cobra.Command, args []string) error {
})
}

type projectOptions struct {
type ProjectOptions struct {
ProjectName string
Profiles []string
ConfigPaths []string
Expand All @@ -108,16 +107,16 @@ type ProjectFunc func(ctx context.Context, project *types.Project) error
type ProjectServicesFunc func(ctx context.Context, project *types.Project, services []string) error

// WithProject creates a cobra run command from a ProjectFunc based on configured project options and selected services
func (o *projectOptions) WithProject(fn ProjectFunc) func(cmd *cobra.Command, args []string) error {
func (o *ProjectOptions) WithProject(fn ProjectFunc) func(cmd *cobra.Command, args []string) error {
return o.WithServices(func(ctx context.Context, project *types.Project, services []string) error {
return fn(ctx, project)
})
}

// WithServices creates a cobra run command from a ProjectFunc based on configured project options and selected services
func (o *projectOptions) WithServices(fn ProjectServicesFunc) func(cmd *cobra.Command, args []string) error {
func (o *ProjectOptions) WithServices(fn ProjectServicesFunc) func(cmd *cobra.Command, args []string) error {
return Adapt(func(ctx context.Context, args []string) error {
project, err := o.toProject(args, cli.WithResolvedPaths(true))
project, err := o.ToProject(args, cli.WithResolvedPaths(true))
if err != nil {
return err
}
Expand All @@ -126,7 +125,7 @@ func (o *projectOptions) WithServices(fn ProjectServicesFunc) func(cmd *cobra.Co
})
}

func (o *projectOptions) addProjectFlags(f *pflag.FlagSet) {
func (o *ProjectOptions) addProjectFlags(f *pflag.FlagSet) {
f.StringArrayVar(&o.Profiles, "profile", []string{}, "Specify a profile to enable")
f.StringVarP(&o.ProjectName, "project-name", "p", "", "Project name")
f.StringArrayVarP(&o.ConfigPaths, "file", "f", []string{}, "Compose configuration files")
Expand All @@ -137,11 +136,11 @@ func (o *projectOptions) addProjectFlags(f *pflag.FlagSet) {
_ = f.MarkHidden("workdir")
}

func (o *projectOptions) projectOrName(services ...string) (*types.Project, string, error) {
func (o *ProjectOptions) projectOrName(services ...string) (*types.Project, string, error) {
name := o.ProjectName
var project *types.Project
if len(o.ConfigPaths) > 0 || o.ProjectName == "" {
p, err := o.toProject(services)
p, err := o.ToProject(services)
if err != nil {
envProjectName := os.Getenv("COMPOSE_PROJECT_NAME")
if envProjectName != "" {
Expand All @@ -155,7 +154,7 @@ func (o *projectOptions) projectOrName(services ...string) (*types.Project, stri
return project, name, nil
}

func (o *projectOptions) toProjectName() (string, error) {
func (o *ProjectOptions) toProjectName() (string, error) {
if o.ProjectName != "" {
return o.ProjectName, nil
}
Expand All @@ -165,14 +164,14 @@ func (o *projectOptions) toProjectName() (string, error) {
return envProjectName, nil
}

project, err := o.toProject(nil)
project, err := o.ToProject(nil)
if err != nil {
return "", err
}
return project.Name, nil
}

func (o *projectOptions) toProject(services []string, po ...cli.ProjectOptionsFn) (*types.Project, error) {
func (o *ProjectOptions) ToProject(services []string, po ...cli.ProjectOptionsFn) (*types.Project, error) {
options, err := o.toProjectOptions(po...)
if err != nil {
return nil, compose.WrapComposeError(err)
Expand Down Expand Up @@ -222,7 +221,7 @@ func (o *projectOptions) toProject(services []string, po ...cli.ProjectOptionsFn
return project, err
}

func (o *projectOptions) toProjectOptions(po ...cli.ProjectOptionsFn) (*cli.ProjectOptions, error) {
func (o *ProjectOptions) toProjectOptions(po ...cli.ProjectOptionsFn) (*cli.ProjectOptions, error) {
return cli.NewProjectOptions(o.ConfigPaths,
append(po,
cli.WithWorkingDirectory(o.ProjectDir),
Expand All @@ -243,7 +242,7 @@ func RunningAsStandalone() bool {
}

// RootCommand returns the compose command with its child commands
func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //nolint:gocyclo
func RootCommand(streams api.Streams, backend api.Service) *cobra.Command { //nolint:gocyclo
// filter out useless commandConn.CloseWrite warning message that can occur
// when using a remote context that is unreachable: "commandConn.CloseWrite: commandconn: failed to wait: signal: killed"
// https://github.com/docker/cli/blob/e1f24d3c93df6752d3c27c8d61d18260f141310c/cli/connhelper/commandconn/commandconn.go#L203-L215
Expand All @@ -254,7 +253,7 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
"commandConn.CloseRead:",
))

opts := projectOptions{}
opts := ProjectOptions{}
var (
ansi string
noAnsi bool
Expand Down Expand Up @@ -305,7 +304,7 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
if verbose {
logrus.SetLevel(logrus.TraceLevel)
}
formatter.SetANSIMode(ansi)
formatter.SetANSIMode(streams, ansi)
switch ansi {
case "never":
progress.Mode = progress.ModePlain
Expand Down Expand Up @@ -333,27 +332,27 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
}

c.AddCommand(
upCommand(&opts, backend),
upCommand(&opts, streams, backend),
downCommand(&opts, backend),
startCommand(&opts, backend),
restartCommand(&opts, backend),
stopCommand(&opts, backend),
psCommand(&opts, backend),
listCommand(backend),
logsCommand(&opts, backend),
convertCommand(&opts, backend),
psCommand(&opts, streams, backend),
listCommand(streams, backend),
logsCommand(&opts, streams, backend),
convertCommand(&opts, streams, backend),
killCommand(&opts, backend),
runCommand(&opts, dockerCli, backend),
runCommand(&opts, streams, backend),
removeCommand(&opts, backend),
execCommand(&opts, dockerCli, backend),
execCommand(&opts, streams, backend),
pauseCommand(&opts, backend),
unpauseCommand(&opts, backend),
topCommand(&opts, backend),
eventsCommand(&opts, backend),
portCommand(&opts, backend),
imagesCommand(&opts, backend),
topCommand(&opts, streams, backend),
eventsCommand(&opts, streams, backend),
portCommand(&opts, streams, backend),
imagesCommand(&opts, streams, backend),
versionCommand(),
buildCommand(&opts, backend),
buildCommand(&opts, streams, backend),
pushCommand(&opts, backend),
pullCommand(&opts, backend),
createCommand(&opts, backend),
Expand Down Expand Up @@ -383,7 +382,7 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
return c
}

func setEnvWithDotEnv(prjOpts *projectOptions) error {
func setEnvWithDotEnv(prjOpts *ProjectOptions) error {
options, err := prjOpts.toProjectOptions()
if err != nil {
return compose.WrapComposeError(err)
Expand Down
57 changes: 28 additions & 29 deletions cmd/compose/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import (
)

type convertOptions struct {
*projectOptions
*ProjectOptions
Format string
Output string
quiet bool
Expand All @@ -50,9 +50,9 @@ type convertOptions struct {
noConsistency bool
}

func convertCommand(p *projectOptions, backend api.Service) *cobra.Command {
func convertCommand(p *ProjectOptions, streams api.Streams, backend api.Service) *cobra.Command {
opts := convertOptions{
projectOptions: p,
ProjectOptions: p,
}
cmd := &cobra.Command{
Aliases: []string{"config"},
Expand All @@ -73,22 +73,22 @@ func convertCommand(p *projectOptions, backend api.Service) *cobra.Command {
}),
RunE: Adapt(func(ctx context.Context, args []string) error {
if opts.services {
return runServices(opts)
return runServices(streams, opts)
}
if opts.volumes {
return runVolumes(opts)
return runVolumes(streams, opts)
}
if opts.hash != "" {
return runHash(opts)
return runHash(streams, opts)
}
if opts.profiles {
return runProfiles(opts, args)
return runProfiles(streams, opts, args)
}
if opts.images {
return runConfigImages(opts, args)
return runConfigImages(streams, opts, args)
}

return runConvert(ctx, backend, opts, args)
return runConvert(ctx, streams, backend, opts, args)
}),
ValidArgsFunction: completeServiceNames(p),
}
Expand All @@ -110,15 +110,14 @@ func convertCommand(p *projectOptions, backend api.Service) *cobra.Command {
return cmd
}

func runConvert(ctx context.Context, backend api.Service, opts convertOptions, services []string) error {
func runConvert(ctx context.Context, streams api.Streams, backend api.Service, opts convertOptions, services []string) error {
var content []byte
project, err := opts.toProject(services,
project, err := opts.ToProject(services,
cli.WithInterpolation(!opts.noInterpolate),
cli.WithResolvedPaths(true),
cli.WithNormalization(!opts.noNormalize),
cli.WithConsistency(!opts.noConsistency),
cli.WithDiscardEnvFile)

if err != nil {
return err
}
Expand All @@ -140,7 +139,7 @@ func runConvert(ctx context.Context, backend api.Service, opts convertOptions, s
return nil
}

var out io.Writer = os.Stdout
var out io.Writer = streams.Out()
if opts.Output != "" && len(content) > 0 {
file, err := os.Create(opts.Output)
if err != nil {
Expand All @@ -152,34 +151,34 @@ func runConvert(ctx context.Context, backend api.Service, opts convertOptions, s
return err
}

func runServices(opts convertOptions) error {
project, err := opts.toProject(nil)
func runServices(streams api.Streams, opts convertOptions) error {
project, err := opts.ToProject(nil)
if err != nil {
return err
}
return project.WithServices(project.ServiceNames(), func(s types.ServiceConfig) error {
fmt.Println(s.Name)
fmt.Fprintln(streams.Out(), s.Name)
return nil
})
}

func runVolumes(opts convertOptions) error {
project, err := opts.toProject(nil)
func runVolumes(streams api.Streams, opts convertOptions) error {
project, err := opts.ToProject(nil)
if err != nil {
return err
}
for n := range project.Volumes {
fmt.Println(n)
fmt.Fprintln(streams.Out(), n)
}
return nil
}

func runHash(opts convertOptions) error {
func runHash(streams api.Streams, opts convertOptions) error {
var services []string
if opts.hash != "*" {
services = append(services, strings.Split(opts.hash, ",")...)
}
project, err := opts.toProject(services)
project, err := opts.ToProject(services)
if err != nil {
return err
}
Expand All @@ -188,14 +187,14 @@ func runHash(opts convertOptions) error {
if err != nil {
return err
}
fmt.Printf("%s %s\n", s.Name, hash)
fmt.Fprintf(streams.Out(), "%s %s\n", s.Name, hash)
}
return nil
}

func runProfiles(opts convertOptions, services []string) error {
func runProfiles(streams api.Streams, opts convertOptions, services []string) error {
set := map[string]struct{}{}
project, err := opts.toProject(services)
project, err := opts.ToProject(services)
if err != nil {
return err
}
Expand All @@ -210,21 +209,21 @@ func runProfiles(opts convertOptions, services []string) error {
}
sort.Strings(profiles)
for _, p := range profiles {
fmt.Println(p)
fmt.Fprintln(streams.Out(), p)
}
return nil
}

func runConfigImages(opts convertOptions, services []string) error {
project, err := opts.toProject(services)
func runConfigImages(streams api.Streams, opts convertOptions, services []string) error {
project, err := opts.ToProject(services)
if err != nil {
return err
}
for _, s := range project.Services {
if s.Image != "" {
fmt.Println(s.Image)
fmt.Fprintln(streams.Out(), s.Image)
} else {
fmt.Printf("%s%s%s\n", project.Name, api.Separator, s.Name)
fmt.Fprintf(streams.Out(), "%s%s%s\n", project.Name, api.Separator, s.Name)
}
}
return nil
Expand Down

0 comments on commit fc38208

Please sign in to comment.