Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: main check when using gomod.proxy #2390

Merged
merged 4 commits into from Aug 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 12 additions & 6 deletions internal/builders/golang/build.go
Expand Up @@ -70,10 +70,8 @@ func (*Builder) WithDefaults(build config.Build) (config.Build, error) {

// Build builds a golang build.
func (*Builder) Build(ctx *context.Context, build config.Build, options api.Options) error {
if !ctx.Config.GoMod.Proxy {
if err := checkMain(build); err != nil {
return err
}
if err := checkMain(build); err != nil {
return err
}
target, err := newBuildTarget(options.Target)
if err != nil {
Expand Down Expand Up @@ -233,11 +231,19 @@ func (b buildTarget) Env() []string {

func checkMain(build config.Build) error {
main := build.Main
if build.UnproxiedMain != "" {
main = build.UnproxiedMain
}
dir := build.Dir
if build.UnproxiedDir != "" {
dir = build.UnproxiedDir
}

if main == "" {
main = "."
}
if build.Dir != "" {
main = filepath.Join(build.Dir, main)
if dir != "" {
main = filepath.Join(dir, main)
}
stat, ferr := os.Stat(main)
if ferr != nil {
Expand Down
55 changes: 40 additions & 15 deletions internal/builders/golang/build_test.go
Expand Up @@ -508,49 +508,71 @@ func TestRunInvalidFlags(t *testing.T) {
}

func TestRunPipeWithoutMainFunc(t *testing.T) {
folder := testlib.Mktmp(t)
writeMainWithoutMainFunc(t, folder)
config := config.Project{
Builds: []config.Build{
{
Binary: "no-main",
Hooks: config.HookConfig{},
Targets: []string{
runtimeTarget,
newCtx := func(t *testing.T) *context.Context {
t.Helper()
folder := testlib.Mktmp(t)
writeMainWithoutMainFunc(t, folder)
config := config.Project{
Builds: []config.Build{
{
Binary: "no-main",
Hooks: config.HookConfig{},
Targets: []string{
runtimeTarget,
},
},
},
},
}
ctx := context.New(config)
ctx.Git.CurrentTag = "5.6.7"
return ctx
}
ctx := context.New(config)
ctx.Git.CurrentTag = "5.6.7"
t.Run("empty", func(t *testing.T) {
ctx := newCtx(t)
ctx.Config.Builds[0].Main = ""
require.EqualError(t, Default.Build(ctx, ctx.Config.Builds[0], api.Options{
Target: runtimeTarget,
}), `build for no-main does not contain a main function`)
})
t.Run("not main.go", func(t *testing.T) {
ctx := newCtx(t)
ctx.Config.Builds[0].Main = "foo.go"
require.EqualError(t, Default.Build(ctx, ctx.Config.Builds[0], api.Options{
Target: runtimeTarget,
}), `couldn't find main file: stat foo.go: no such file or directory`)
})
t.Run("glob", func(t *testing.T) {
ctx := newCtx(t)
ctx.Config.Builds[0].Main = "."
require.EqualError(t, Default.Build(ctx, ctx.Config.Builds[0], api.Options{
Target: runtimeTarget,
}), `build for no-main does not contain a main function`)
})
t.Run("fixed main.go", func(t *testing.T) {
ctx := newCtx(t)
ctx.Config.Builds[0].Main = "main.go"
require.EqualError(t, Default.Build(ctx, ctx.Config.Builds[0], api.Options{
Target: runtimeTarget,
}), `build for no-main does not contain a main function`)
})
t.Run("using gomod.proxy", func(t *testing.T) {
ctx := newCtx(t)
ctx.Config.GoMod.Proxy = true
ctx.Config.Builds[0].Dir = "dist/proxy/test"
ctx.Config.Builds[0].Main = "github.com/caarlos0/test"
ctx.Config.Builds[0].UnproxiedDir = "."
ctx.Config.Builds[0].UnproxiedMain = "."
require.EqualError(t, Default.Build(ctx, ctx.Config.Builds[0], api.Options{
Target: runtimeTarget,
}), `build for no-main does not contain a main function`)
})
}

func TestRunPipeWithProxiedRepo(t *testing.T) {
folder := testlib.Mktmp(t)
out, err := exec.Command("git", "clone", "https://github.com/goreleaser/goreleaser", "-b", "v0.161.1", "--depth=1", ".").CombinedOutput()
require.NoError(t, err, string(out))

proxied := filepath.Join(folder, "dist/proxy/default")
require.NoError(t, os.MkdirAll(proxied, 0o750))
require.NoError(t, os.WriteFile(
Expand All @@ -567,6 +589,7 @@ import _ "github.com/goreleaser/goreleaser"
[]byte("module foo\nrequire github.com/goreleaser/goreleaser v0.161.1"),
0o666,
))

cmd := exec.Command("go", "mod", "tidy")
cmd.Dir = proxied
require.NoError(t, cmd.Run())
Expand All @@ -577,9 +600,11 @@ import _ "github.com/goreleaser/goreleaser"
},
Builds: []config.Build{
{
Binary: "foo",
Main: "github.com/goreleaser/goreleaser",
Dir: proxied,
Binary: "foo",
Main: "github.com/goreleaser/goreleaser",
Dir: proxied,
UnproxiedMain: ".",
UnproxiedDir: ".",
Targets: []string{
runtimeTarget,
},
Expand Down
2 changes: 2 additions & 0 deletions internal/pipe/gomod/gomod.go
Expand Up @@ -170,6 +170,8 @@ func proxyBuild(ctx *context.Context, build *config.Build) error {
return newDetailedErrProxy(err, string(out))
}

build.UnproxiedMain = build.Main
build.UnproxiedDir = build.Dir
build.Main = mainPackage
build.Dir = dir
return nil
Expand Down
3 changes: 3 additions & 0 deletions internal/pipe/gomod/gomod_test.go
Expand Up @@ -70,6 +70,7 @@ func TestGoModProxy(t *testing.T) {
Goos: []string{runtime.GOOS},
Goarch: []string{runtime.GOARCH},
Main: ".",
Dir: ".",
},
},
})
Expand All @@ -83,7 +84,9 @@ func TestGoModProxy(t *testing.T) {
requireGoMod(t, mod, ctx.Git.CurrentTag)
requireMainGo(t, mod)
require.Equal(t, mod, ctx.Config.Builds[0].Main)
require.Equal(t, ".", ctx.Config.Builds[0].UnproxiedMain)
require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir)
require.Equal(t, ".", ctx.Config.Builds[0].UnproxiedDir)
require.Equal(t, mod, ctx.ModulePath)
})

Expand Down
2 changes: 2 additions & 0 deletions pkg/config/config.go
Expand Up @@ -207,6 +207,8 @@ type Build struct {
Skip bool `yaml:",omitempty"`
GoBinary string `yaml:",omitempty"`
NoUniqueDistDir bool `yaml:"no_unique_dist_dir,omitempty"`
UnproxiedMain string `yaml:"-"` // used by gomod.proxy
UnproxiedDir string `yaml:"-"` // used by gomod.proxy
}

type HookConfig struct {
Expand Down