Skip to content

Commit 59289d0

Browse files
authored
Merge pull request #67 from ynden/feature/config
Support both digger.[yml | yaml]
2 parents 190b23d + 110ba5f commit 59289d0

File tree

2 files changed

+124
-22
lines changed

2 files changed

+124
-22
lines changed

pkg/digger/digger_config.go

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package digger
22

33
import (
4+
"errors"
45
"fmt"
5-
"gopkg.in/yaml.v2"
66
"os"
77
"path"
88
"path/filepath"
99
"strings"
10+
11+
"gopkg.in/yaml.v2"
1012
)
1113

1214
type WorkflowConfiguration struct {
@@ -25,6 +27,8 @@ type Project struct {
2527
WorkflowConfiguration WorkflowConfiguration `yaml:"workflow_configuration"`
2628
}
2729

30+
var ErrDiggerConfigConflict error = errors.New("more than one digger config file detected, please keep either 'digger.yml' or 'digger.yaml'")
31+
2832
func (p *Project) UnmarshalYAML(unmarshal func(interface{}) error) error {
2933
type rawProject Project
3034
raw := rawProject{
@@ -44,17 +48,15 @@ func (p *Project) UnmarshalYAML(unmarshal func(interface{}) error) error {
4448

4549
func NewDiggerConfig(workingDir string) (*DiggerConfig, error) {
4650
config := &DiggerConfig{}
47-
var fileName string
48-
if workingDir == "" {
49-
fileName = "digger.yml"
50-
} else {
51-
fileName = workingDir + "/digger.yml"
52-
}
53-
if data, err := os.ReadFile(fileName); err == nil {
54-
if err := yaml.Unmarshal(data, config); err != nil {
55-
return nil, fmt.Errorf("error parsing digger.yml: %v", err)
51+
fileName, err := retrieveConfigFile(workingDir)
52+
if err != nil {
53+
if errors.Is(err, ErrDiggerConfigConflict) {
54+
return nil, fmt.Errorf("error while retrieving config file: %v", err)
5655
}
57-
} else {
56+
}
57+
58+
data, err := os.ReadFile(fileName)
59+
if err != nil {
5860
config.Projects = make([]Project, 1)
5961
config.Projects[0] = Project{Name: "default", Dir: ".", WorkflowConfiguration: WorkflowConfiguration{
6062
OnPullRequestPushed: []string{"digger plan"},
@@ -63,6 +65,11 @@ func NewDiggerConfig(workingDir string) (*DiggerConfig, error) {
6365
}}
6466
return config, nil
6567
}
68+
69+
if err := yaml.Unmarshal(data, config); err != nil {
70+
return nil, fmt.Errorf("error parsing '%s': %v", fileName, err)
71+
}
72+
6673
return config, nil
6774
}
6875

@@ -120,3 +127,39 @@ func (c *DiggerConfig) GetWorkflowConfiguration(projectName string) WorkflowConf
120127
type File struct {
121128
Filename string
122129
}
130+
131+
func isFileExists(path string) bool {
132+
fi, err := os.Stat(path)
133+
if os.IsNotExist(err) {
134+
return false
135+
}
136+
// file exists make sure it's not a directory
137+
return !fi.IsDir()
138+
}
139+
140+
func retrieveConfigFile(workingDir string) (string, error) {
141+
fileName := "digger"
142+
if workingDir != "" {
143+
fileName = path.Join(workingDir, fileName)
144+
}
145+
146+
// Make sure we don't have more than one digger config file
147+
ymlCfg := isFileExists(fileName + ".yml")
148+
yamlCfg := isFileExists(fileName + ".yaml")
149+
if ymlCfg && yamlCfg {
150+
return "", ErrDiggerConfigConflict
151+
}
152+
153+
// At this point we know there are no duplicates
154+
// Return the first one that exists
155+
if ymlCfg {
156+
return "digger.yml", nil
157+
}
158+
if yamlCfg {
159+
return "digger.yaml", nil
160+
}
161+
162+
// Passing this point means digger config file is
163+
// missing which is a non-error
164+
return "", nil
165+
}

pkg/digger/digger_config_test.go

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,18 @@ package digger
33
import (
44
"log"
55
"os"
6+
"path"
67
"testing"
8+
9+
"github.com/stretchr/testify/assert"
710
)
8-
import "github.com/stretchr/testify/assert"
11+
12+
func setUp() (string, func()) {
13+
tempDir := createTempDir()
14+
return tempDir, func() {
15+
deleteTempDir(tempDir)
16+
}
17+
}
918

1019
func TestDiggerConfigFileDoesNotExist(t *testing.T) {
1120
dg, err := NewDiggerConfig("")
@@ -14,16 +23,59 @@ func TestDiggerConfigFileDoesNotExist(t *testing.T) {
1423
assert.Equal(t, dg.Projects[0].Dir, ".", "expected default project dir to be '.'")
1524
}
1625

26+
func TestDiggerConfigWhenMultipleConfigExist(t *testing.T) {
27+
tempDir, teardown := setUp()
28+
defer teardown()
29+
30+
_, err := os.Create(path.Join(tempDir, "digger.yaml"))
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
35+
_, err = os.Create(path.Join(tempDir, "digger.yml"))
36+
if err != nil {
37+
t.Fatal(err)
38+
}
39+
40+
dg, err := NewDiggerConfig(tempDir)
41+
assert.Error(t, err, "expected error to be returned")
42+
assert.ErrorContains(t, err, ErrDiggerConfigConflict.Error(), "expected error to match target error")
43+
assert.Nil(t, dg, "expected diggerConfig to be nil")
44+
}
45+
46+
func TestDiggerConfigWhenOnlyYamlExists(t *testing.T) {
47+
tempDir, teardown := setUp()
48+
defer teardown()
49+
50+
_, err := os.Create(path.Join(tempDir, "digger.yaml"))
51+
if err != nil {
52+
t.Fatal(err)
53+
}
54+
55+
dg, err := NewDiggerConfig(tempDir)
56+
assert.NoError(t, err, "expected error to be nil")
57+
assert.NotNil(t, dg, "expected digger config to be not nil")
58+
}
59+
60+
func TestDiggerConfigWhenOnlyYmlExists(t *testing.T) {
61+
tempDir, teardown := setUp()
62+
defer teardown()
63+
64+
_, err := os.Create(path.Join(tempDir, "digger.yml"))
65+
if err != nil {
66+
t.Fatal(err)
67+
}
68+
69+
dg, err := NewDiggerConfig(tempDir)
70+
assert.NoError(t, err, "expected error to be nil")
71+
assert.NotNil(t, dg, "expected digger config to be not nil")
72+
}
73+
1774
func TestDefaultValuesForWorkflowConfiguration(t *testing.T) {
18-
tempDir := CreateTempDir()
19-
defer func(name string) {
20-
err := os.RemoveAll(name)
21-
if err != nil {
22-
log.Fatal(err)
23-
}
24-
}(tempDir)
75+
tempDir, teardown := setUp()
76+
defer teardown()
2577

26-
f, err := os.Create(tempDir + "/digger.yml")
78+
f, err := os.Create(path.Join(tempDir, "digger.yaml"))
2779
if err != nil {
2880
log.Fatal(err)
2981
}
@@ -48,16 +100,23 @@ projects:
48100
}
49101

50102
dg, err := NewDiggerConfig(tempDir)
51-
assert.NoError(t, err, "expected error to be not nil")
103+
assert.NoError(t, err, "expected error to be nil")
52104
assert.Equal(t, dg.Projects[0].WorkflowConfiguration.OnPullRequestPushed[0], "digger plan")
53105
assert.Equal(t, dg.Projects[0].WorkflowConfiguration.OnPullRequestClosed[0], "digger unlock")
54106
assert.Equal(t, dg.Projects[0].WorkflowConfiguration.OnCommitToDefault[0], "digger apply")
55107
}
56108

57-
func CreateTempDir() string {
109+
func createTempDir() string {
58110
dir, err := os.MkdirTemp("", "tmp")
59111
if err != nil {
60112
log.Fatal(err)
61113
}
62114
return dir
63115
}
116+
117+
func deleteTempDir(name string) {
118+
err := os.RemoveAll(name)
119+
if err != nil {
120+
log.Fatal(err)
121+
}
122+
}

0 commit comments

Comments
 (0)