Skip to content

Commit

Permalink
fix: validate that tags, ldflags, and buildmode, are not provided twice
Browse files Browse the repository at this point in the history
  • Loading branch information
borgoat committed Nov 7, 2022
1 parent a957da6 commit 62da019
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
22 changes: 22 additions & 0 deletions internal/builders/golang/build.go
@@ -1,6 +1,7 @@
package golang

import (
"errors"
"fmt"
"go/ast"
"go/parser"
Expand Down Expand Up @@ -237,6 +238,12 @@ func withOverrides(ctx *context.Context, build config.Build, options api.Options
func buildGoBuildLine(ctx *context.Context, build config.Build, details config.BuildDetails, options api.Options, artifact *artifact.Artifact, env []string) ([]string, error) {
cmd := []string{build.GoBinary, build.Command}

// tags, ldflags, and buildmode, can only appear once
err := validateUniqueFlags(details)
if err != nil {
return cmd, err
}

flags, err := processFlags(ctx, artifact, env, details.Flags, "")
if err != nil {
return cmd, err
Expand Down Expand Up @@ -283,6 +290,21 @@ func buildGoBuildLine(ctx *context.Context, build config.Build, details config.B
return cmd, nil
}

func validateUniqueFlags(details config.BuildDetails) error {
for _, flag := range details.Flags {
if strings.HasPrefix(flag, "-tags") && len(details.Tags) > 0 {
return errors.New("tags is defined multiple times")
}
if strings.HasPrefix(flag, "-ldflags") && len(details.Ldflags) > 0 {
return errors.New("ldflags is defined multiple times")
}
if strings.HasPrefix(flag, "-buildmode") && details.Buildmode != "" {
return errors.New("buildmode is defined multiple times")
}
}
return nil
}

func processFlags(ctx *context.Context, a *artifact.Artifact, env, flags []string, flagPrefix string) ([]string, error) {
processed := make([]string, 0, len(flags))
for _, rawFlag := range flags {
Expand Down
28 changes: 28 additions & 0 deletions internal/builders/golang/build_test.go
Expand Up @@ -606,6 +606,34 @@ func TestBuildFailed(t *testing.T) {
require.Empty(t, ctx.Artifacts.List())
}

func TestBuildWithMultipleFlagsFails(t *testing.T) {
folder := testlib.Mktmp(t)
writeGoodMain(t, folder)
config := config.Project{
Builds: []config.Build{
{
ID: "buildid",
BuildDetails: config.BuildDetails{
Flags: []string{"-tags=test"},
Tags: []string{"xyz"},
},
Targets: []string{
runtimeTarget,
},
GoBinary: "go",
Command: "build",
},
},
}
ctx := context.New(config)
ctx.Git.CurrentTag = "5.6.7"
err := Default.Build(ctx, ctx.Config.Builds[0], api.Options{
Target: "darwin_amd64",
})
assertContainsError(t, err, `tags is defined multiple times`)
require.Empty(t, ctx.Artifacts.List())
}

func TestRunInvalidAsmflags(t *testing.T) {
folder := testlib.Mktmp(t)
writeGoodMain(t, folder)
Expand Down

0 comments on commit 62da019

Please sign in to comment.