Skip to content

Commit

Permalink
feat: improve check command (#1435)
Browse files Browse the repository at this point in the history
* feat: improve check command

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

* fix: main test

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

* fix: tests

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

* fix: tests, finally

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

* fix: lint

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>
  • Loading branch information
caarlos0 committed Apr 12, 2020
1 parent 34c8fd4 commit a5f0343
Show file tree
Hide file tree
Showing 10 changed files with 61 additions and 31 deletions.
2 changes: 1 addition & 1 deletion .goreleaser.yml
Expand Up @@ -97,7 +97,7 @@ scoop:
description: Deliver Go binaries as fast and easily as possible
license: MIT
nfpms:
- name_template: '{{ .ProjectName }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
- file_name_template: '{{ .ProjectName }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
homepage: https://goreleaser.com
description: Deliver Go binaries as fast and easily as possible
maintainer: Carlos Alexandro Becker <root@carlosbecker.com>
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -11,6 +11,7 @@ install:
- make setup
script:
- make ci
- ./goreleaser check
- test -n "$TRAVIS_TAG" || ./goreleaser --snapshot --parallelism 2
after_success:
- bash <(curl -s https://codecov.io/bash)
Expand Down
4 changes: 3 additions & 1 deletion internal/deprecate/deprecate.go
Expand Up @@ -8,12 +8,14 @@ import (
"github.com/apex/log"
"github.com/apex/log/handlers/cli"
"github.com/fatih/color"
"github.com/goreleaser/goreleaser/pkg/context"
)

const baseURL = "https://goreleaser.com/deprecations#"

// Notice warns the user about the deprecation of the given property
func Notice(property string) {
func Notice(ctx *context.Context, property string) {
ctx.Deprecated = true
cli.Default.Padding += 3
defer func() {
cli.Default.Padding -= 3
Expand Down
6 changes: 5 additions & 1 deletion internal/deprecate/deprecate_test.go
Expand Up @@ -8,6 +8,8 @@ import (
"github.com/apex/log"
"github.com/apex/log/handlers/cli"
"github.com/fatih/color"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
"github.com/stretchr/testify/require"
)

Expand All @@ -21,8 +23,10 @@ func TestNotice(t *testing.T) {
log.SetHandler(cli.New(f))

log.Info("first")
Notice("foo.bar.whatever")
var ctx = context.New(config.Project{})
Notice(ctx, "foo.bar.whatever")
log.Info("last")
require.True(t, ctx.Deprecated)

require.NoError(t, f.Close())

Expand Down
2 changes: 1 addition & 1 deletion internal/pipe/nfpm/nfpm.go
Expand Up @@ -48,7 +48,7 @@ func (Pipe) Default(ctx *context.Context) error {
fpm.PackageName = ctx.Config.ProjectName
}
if fpm.NameTemplate != "" && fpm.FileNameTemplate == "" {
deprecate.Notice("nfpms.name_template")
deprecate.Notice(ctx, "nfpms.name_template")
fpm.FileNameTemplate = fpm.NameTemplate
}
if fpm.FileNameTemplate == "" {
Expand Down
2 changes: 1 addition & 1 deletion internal/pipe/upload/upload.go
Expand Up @@ -23,7 +23,7 @@ func (Pipe) String() string {
// Default sets the pipe defaults
func (Pipe) Default(ctx *context.Context) error {
if len(ctx.Config.Puts) > 0 {
deprecate.Notice("puts")
deprecate.Notice(ctx, "puts")
ctx.Config.Uploads = append(ctx.Config.Uploads, ctx.Config.Puts...)
}
return http.Defaults(ctx.Config.Uploads)
Expand Down
27 changes: 17 additions & 10 deletions main.go
Expand Up @@ -86,14 +86,17 @@ func main() {
if err := initProject(filename); err != nil {
log.WithError(err).Error("failed to init project")
os.Exit(1)
return
}
log.WithField("file", filename).Info("config created; please edit accordingly to your needs")
case checkCmd.FullCommand():
if err := checkConfig(*config); err != nil {
ctx, err := checkConfig(*config)
if err != nil {
log.WithError(err).Errorf(color.New(color.Bold).Sprintf("config is invalid"))
os.Exit(1)
return
}
if ctx.Deprecated {
log.Warn(color.New(color.Bold).Sprintf("config is valid, but uses deprecated properties, check logs above for details"))
os.Exit(2)
}
log.Infof(color.New(color.Bold).Sprintf("config is valid"))
case releaseCmd.FullCommand():
Expand All @@ -112,31 +115,35 @@ func main() {
Parallelism: *parallelism,
Timeout: *timeout,
}
if err := releaseProject(options); err != nil {
ctx, err := releaseProject(options)
if err != nil {
log.WithError(err).Errorf(color.New(color.Bold).Sprintf("release failed after %0.2fs", time.Since(start).Seconds()))
os.Exit(1)
return
}
if ctx.Deprecated {
log.Warn(color.New(color.Bold).Sprintf("your config is using deprecated properties, check logs above for details"))
}
log.Infof(color.New(color.Bold).Sprintf("release succeeded after %0.2fs", time.Since(start).Seconds()))
}
}

func checkConfig(filename string) error {
func checkConfig(filename string) (*context.Context, error) {
cfg, err := loadConfig(filename)
if err != nil {
return err
return nil, err
}
var ctx = context.New(cfg)
return ctrlc.Default.Run(ctx, func() error {
return ctx, ctrlc.Default.Run(ctx, func() error {
log.Info(color.New(color.Bold).Sprint("checking config:"))
return defaults.Pipe{}.Run(ctx)
})
}

func releaseProject(options releaseOptions) error {
func releaseProject(options releaseOptions) (*context.Context, error) {
cfg, err := loadConfig(options.Config)
if err != nil {
return err
return nil, err
}
ctx, cancel := context.NewWithTimeout(cfg, options.Timeout)
defer cancel()
Expand All @@ -150,7 +157,7 @@ func releaseProject(options releaseOptions) error {
ctx.SkipValidate = ctx.Snapshot || options.SkipValidate
ctx.SkipSign = options.SkipSign
ctx.RmDist = options.RmDist
return ctrlc.Default.Run(ctx, func() error {
return ctx, ctrlc.Default.Run(ctx, func() error {
for _, pipe := range pipeline.Pipeline {
if err := middleware.Logging(
pipe.String(),
Expand Down
39 changes: 25 additions & 14 deletions main_test.go
Expand Up @@ -22,21 +22,24 @@ func init() {
func TestReleaseProject(t *testing.T) {
_, back := setup(t)
defer back()
assert.NoError(t, releaseProject(testParams()))
_, err := releaseProject(testParams())
assert.NoError(t, err)
}

func TestCheckConfig(t *testing.T) {
_, back := setup(t)
defer back()
assert.NoError(t, checkConfig(testParams().Config))
_, err := checkConfig(testParams().Config)
assert.NoError(t, err)
}

func TestCheckConfigFails(t *testing.T) {
_, back := setup(t)
defer back()
var filename = "fail.yaml"
assert.NoError(t, ioutil.WriteFile(filename, []byte("nope: 1"), 0644))
assert.Error(t, checkConfig(filename))
_, err := checkConfig(filename)
assert.Error(t, err)
}

func TestReleaseProjectSkipPublish(t *testing.T) {
Expand All @@ -45,15 +48,17 @@ func TestReleaseProjectSkipPublish(t *testing.T) {
params := testParams()
params.Snapshot = true
params.SkipPublish = true
assert.NoError(t, releaseProject(params))
_, err := releaseProject(params)
assert.NoError(t, err)
}

func TestConfigFileIsSetAndDontExist(t *testing.T) {
_, back := setup(t)
defer back()
params := testParams()
params.Config = "/this/wont/exist"
assert.Error(t, releaseProject(params))
_, err := releaseProject(params)
assert.Error(t, err)
}

func TestConfigFlagNotSetButExists(t *testing.T) {
Expand Down Expand Up @@ -93,7 +98,8 @@ func TestReleaseNotesFileDontExist(t *testing.T) {
defer back()
params := testParams()
params.ReleaseNotes = "/this/also/wont/exist"
assert.Error(t, releaseProject(params))
_, err := releaseProject(params)
assert.Error(t, err)
}

func TestCustomReleaseNotesFile(t *testing.T) {
Expand All @@ -104,7 +110,8 @@ func TestCustomReleaseNotesFile(t *testing.T) {
createFile(t, releaseNotes.Name(), "nothing important at all")
var params = testParams()
params.ReleaseNotes = releaseNotes.Name()
assert.NoError(t, releaseProject(params))
_, err = releaseProject(params)
assert.NoError(t, err)
}

func TestCustomReleaseHeaderFileDontExist(t *testing.T) {
Expand All @@ -113,7 +120,8 @@ func TestCustomReleaseHeaderFileDontExist(t *testing.T) {
params := testParams()
params.ReleaseHeader = "/header/that/dont/exist"
params.Snapshot = false
assert.Error(t, releaseProject(params))
_, err := releaseProject(params)
assert.Error(t, err)
}

func TestCustomReleaseHeaderFile(t *testing.T) {
Expand All @@ -126,7 +134,8 @@ func TestCustomReleaseHeaderFile(t *testing.T) {
params.ReleaseHeader = releaseHeader.Name()
params.Snapshot = false
params.SkipPublish = true
assert.NoError(t, releaseProject(params))
_, err = releaseProject(params)
assert.NoError(t, err)
}

func TestCustomReleaseFooterFileDontExist(t *testing.T) {
Expand All @@ -135,7 +144,8 @@ func TestCustomReleaseFooterFileDontExist(t *testing.T) {
params := testParams()
params.ReleaseFooter = "/footer/that/dont/exist"
params.Snapshot = false
assert.Error(t, releaseProject(params))
_, err := releaseProject(params)
assert.Error(t, err)
}

func TestCustomReleaseFooterFile(t *testing.T) {
Expand All @@ -148,14 +158,16 @@ func TestCustomReleaseFooterFile(t *testing.T) {
params.ReleaseFooter = releaseFooter.Name()
params.Snapshot = false
params.SkipPublish = true
assert.NoError(t, releaseProject(params))
_, err = releaseProject(params)
assert.NoError(t, err)
}

func TestBrokenPipe(t *testing.T) {
_, back := setup(t)
defer back()
createFile(t, "main.go", "not a valid go file")
assert.Error(t, releaseProject(testParams()))
_, err := releaseProject(testParams())
assert.Error(t, err)
}

func TestInitProject(t *testing.T) {
Expand All @@ -169,8 +181,7 @@ func TestInitProject(t *testing.T) {
out, err := ioutil.ReadAll(file)
assert.NoError(t, err)

var config = config.Project{}
assert.NoError(t, yaml.Unmarshal(out, &config))
assert.NoError(t, yaml.Unmarshal(out, &config.Project{}))
}

func TestInitProjectFileExist(t *testing.T) {
Expand Down
1 change: 1 addition & 0 deletions pkg/context/context.go
Expand Up @@ -78,6 +78,7 @@ type Context struct {
SkipValidate bool
RmDist bool
PreRelease bool
Deprecated bool
Parallelism int
Semver Semver
}
Expand Down
8 changes: 6 additions & 2 deletions www/content/ci.md
Expand Up @@ -18,16 +18,20 @@ You may want to setup your project to auto-deploy your new tags on
# .travis.yml
language: go

# needed only if you use the snap pipe:
addons:
apt:
packages:
# needed only if you use the snap pipe:
- snapcraft

# needed for the docker pipe
# needed only if you use the docker pipe
services:
- docker

script:
- go test ./... # replace this with your test script
- curl -sfL https://git.io/goreleaser | sh -s -- check # check goreleaser config for deprecations

after_success:
# docker login is required if you want to push docker images.
# DOCKER_PASSWORD should be a secret in your .travis.yml configuration.
Expand Down

0 comments on commit a5f0343

Please sign in to comment.