From 12436a5bf40742d5b15c33daea9e100983bcde12 Mon Sep 17 00:00:00 2001
From: Carlos Alexandro Becker <caarlos0@gmail.com>
Date: Sat, 31 Dec 2016 10:03:25 -0200
Subject: [PATCH] improved config

---
 config/config.go      | 74 +++++++++++++++++++++----------------------
 config/config_test.go | 72 +++++++++++++++++++++++++++++------------
 2 files changed, 88 insertions(+), 58 deletions(-)

diff --git a/config/config.go b/config/config.go
index 42af9e2e9..96e12b33f 100644
--- a/config/config.go
+++ b/config/config.go
@@ -3,7 +3,6 @@ package config
 import (
 	"errors"
 	"io/ioutil"
-	"log"
 	"os"
 	"path"
 	"path/filepath"
@@ -56,33 +55,43 @@ func Load(file string) (config ProjectConfig, err error) {
 		return config, err
 	}
 	err = yaml.Unmarshal(data, &config)
-	config = fix(config)
-	config, err = fillGitData(config)
-	if err != nil {
+	config.fillBasicData()
+	if err := config.fillFiles(); err != nil {
 		return config, err
 	}
-	if config.BinaryName == "" {
-		return config, errors.New("missing binary_name")
+	if err := config.fillGitData(); err != nil {
+		return config, err
 	}
-	if config.Repo == "" {
-		return config, errors.New("missing repo")
-	}
-	return config, err
+	return config, config.validade()
 }
 
-func fix(config ProjectConfig) ProjectConfig {
-	if len(config.Files) == 0 {
-		config.Files = []string{}
-
-		for _, pattern := range filePatterns {
-			matches, err := globPath(pattern)
-			if err != nil {
-				log.Fatalf("Error searching for %q: %v", pattern, err)
-			}
-
-			config.Files = append(config.Files, matches...)
-		}
+func (config *ProjectConfig) validade() (err error) {
+	if config.BinaryName == "" {
+		return errors.New("missing binary_name")
 	}
+	if config.Repo == "" {
+		return errors.New("missing repo")
+	}
+	return
+}
+
+func (config *ProjectConfig) fillFiles() (err error) {
+	if len(config.Files) != 0 {
+		return
+	}
+	config.Files = []string{}
+	for _, pattern := range filePatterns {
+		matches, err := globPath(pattern)
+		if err != nil {
+			return err
+		}
+
+		config.Files = append(config.Files, matches...)
+	}
+	return
+}
+
+func (config *ProjectConfig) fillBasicData() {
 	if config.Token == "" {
 		config.Token = os.Getenv("GITHUB_TOKEN")
 	}
@@ -98,37 +107,26 @@ func fix(config ProjectConfig) ProjectConfig {
 	if len(config.Build.Arches) == 0 {
 		config.Build.Arches = []string{"amd64", "386"}
 	}
-
-	return config
 }
 
-func fillGitData(config ProjectConfig) (ProjectConfig, error) {
+func (config *ProjectConfig) fillGitData() (err error) {
 	tag, err := git.CurrentTag()
 	if err != nil {
-		return config, err
+		return
 	}
 	previous, err := git.PreviousTag(tag)
 	if err != nil {
-		return config, err
+		return
 	}
 	log, err := git.Log(previous, tag)
 	if err != nil {
-		return config, err
+		return
 	}
 
 	config.Git.CurrentTag = tag
 	config.Git.PreviousTag = previous
 	config.Git.Diff = log
-	return config, nil
-}
-
-func contains(s string, ss []string) bool {
-	for _, sx := range ss {
-		if sx == s {
-			return true
-		}
-	}
-	return false
+	return
 }
 
 func globPath(p string) (m []string, err error) {
diff --git a/config/config_test.go b/config/config_test.go
index e79e625dd..a141aca13 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -7,9 +7,10 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
-func TestFixConfig(t *testing.T) {
+func TestFillBasicData(t *testing.T) {
 	assert := assert.New(t)
-	config := fix(ProjectConfig{})
+	config := ProjectConfig{}
+	config.fillBasicData()
 
 	assert.Equal("main.go", config.Build.Main)
 	assert.Contains(config.Build.Oses, "darwin")
@@ -18,57 +19,88 @@ func TestFixConfig(t *testing.T) {
 	assert.Contains(config.Build.Arches, "amd64")
 }
 
-func TestFixConfigMissingFiles(t *testing.T) {
+func TestFillFilesMissingFiles(t *testing.T) {
 	assert := assert.New(t)
-	config := fix(ProjectConfig{})
+	config := ProjectConfig{}
+	err := config.fillFiles()
 
+	assert.NoError(err)
 	assert.Equal([]string{}, config.Files)
 }
 
-func TestFixConfigUSENMarkdown(t *testing.T) {
+func TestFillFilesUSENMarkdown(t *testing.T) {
 	assert := assert.New(t)
 
 	cwd, _ := os.Getwd()
 	os.Chdir("./.test/1")
+	defer os.Chdir(cwd)
 
-	config := fix(ProjectConfig{})
+	config := ProjectConfig{}
+	err := config.fillFiles()
+
+	assert.NoError(err)
 	assert.Equal([]string{"LICENSE.md", "README.md"}, config.Files)
-
-	os.Chdir(cwd)
 }
 
-func TestFixConfigRealENMarkdown(t *testing.T) {
+func TestFillFilesRealENMarkdown(t *testing.T) {
 	assert := assert.New(t)
 
 	cwd, _ := os.Getwd()
 	os.Chdir("./.test/2")
+	defer os.Chdir(cwd)
 
-	config := fix(ProjectConfig{})
+	config := ProjectConfig{}
+	err := config.fillFiles()
+
+	assert.NoError(err)
 	assert.Equal([]string{"LICENCE.md", "README.md"}, config.Files)
-
-	os.Chdir(cwd)
 }
 
-func TestFixConfigArbitratryENTXT(t *testing.T) {
+func TestFillFilesArbitratryENTXT(t *testing.T) {
 	assert := assert.New(t)
 
 	cwd, _ := os.Getwd()
 	os.Chdir("./.test/3")
+	defer os.Chdir(cwd)
 
-	config := fix(ProjectConfig{})
+	config := ProjectConfig{}
+	err := config.fillFiles()
+
+	assert.NoError(err)
 	assert.Equal([]string{"LICENCE.txt", "README.txt"}, config.Files)
-
-	os.Chdir(cwd)
 }
 
-func TestFixConfigArbitratryENNoSuffix(t *testing.T) {
+func TestFillFilesArbitratryENNoSuffix(t *testing.T) {
 	assert := assert.New(t)
 
 	cwd, _ := os.Getwd()
 	os.Chdir("./.test/4")
+	defer os.Chdir(cwd)
 
-	config := fix(ProjectConfig{})
+	config := ProjectConfig{}
+	err := config.fillFiles()
+
+	assert.NoError(err)
 	assert.Equal([]string{"LICENCE"}, config.Files)
-
-	os.Chdir(cwd)
+}
+
+func TestValidadeMissingBinaryName(t *testing.T) {
+	assert := assert.New(t)
+
+	config := ProjectConfig{Repo: "asd/asd"}
+	assert.Error(config.validade())
+}
+
+func TestValidadeMissingRepo(t *testing.T) {
+	assert := assert.New(t)
+
+	config := ProjectConfig{BinaryName: "asd"}
+	assert.Error(config.validade())
+}
+
+func TestValidadeMinimalConfig(t *testing.T) {
+	assert := assert.New(t)
+
+	config := ProjectConfig{BinaryName: "asd", Repo: "asd/asd"}
+	assert.NoError(config.validade())
 }