Skip to content

Commit

Permalink
fix: main check when using gomod.proxy (#2390)
Browse files Browse the repository at this point in the history
* fix: main check when using gomod.proxy

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* fix: main check when using gomod.proxy

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* test: fix

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* test: fix

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>
  • Loading branch information
caarlos0 committed Aug 13, 2021
1 parent 27150b0 commit a4a96ea
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 21 deletions.
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

1 comment on commit a4a96ea

@vercel
Copy link

@vercel vercel bot commented on a4a96ea Aug 13, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.