Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9f6c7e5

Browse files
committed
Properly clean/normalize user specified directory for create command
Addresses: #238
1 parent 7c76166 commit 9f6c7e5

File tree

3 files changed

+63
-17
lines changed

3 files changed

+63
-17
lines changed

internal/cli/commands.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,22 @@ func nextSeq(matches []string, dir string, seqDigits int) (string, error) {
4949
return nextSeqStr, nil
5050
}
5151

52+
// cleanDir normalizes the provided directory
53+
func cleanDir(dir string) string {
54+
dir = filepath.Clean(dir)
55+
switch dir {
56+
case ".":
57+
return ""
58+
case "/":
59+
return dir
60+
default:
61+
return dir + "/"
62+
}
63+
}
64+
65+
// createCmd (meant to be called via a CLI command) creates a new migration
5266
func createCmd(dir string, startTime time.Time, format string, name string, ext string, seq bool, seqDigits int) {
67+
dir = cleanDir(dir)
5368
var base string
5469
if seq && format != defaultTimeFormat {
5570
log.fatalErr(errors.New("The seq and format options are mutually exclusive"))

internal/cli/commands_test.go

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,37 @@ import (
44
"testing"
55
)
66

7+
func TestCleanDir(t *testing.T) {
8+
cases := []struct {
9+
dir string
10+
expectedCleanDir string
11+
}{
12+
{dir: "", expectedCleanDir: ""},
13+
{dir: ".", expectedCleanDir: ""},
14+
{dir: "/", expectedCleanDir: "/"},
15+
{dir: "./", expectedCleanDir: ""},
16+
{dir: ".test", expectedCleanDir: ".test/"},
17+
{dir: ".test/", expectedCleanDir: ".test/"},
18+
{dir: "test", expectedCleanDir: "test/"},
19+
{dir: "test/", expectedCleanDir: "test/"},
20+
{dir: "./test", expectedCleanDir: "test/"},
21+
{dir: "./test/", expectedCleanDir: "test/"},
22+
{dir: "test/test", expectedCleanDir: "test/test/"},
23+
{dir: "test/test/", expectedCleanDir: "test/test/"},
24+
{dir: "./test/test", expectedCleanDir: "test/test/"},
25+
{dir: "./test/test/", expectedCleanDir: "test/test/"},
26+
}
27+
28+
for _, c := range cases {
29+
t.Run(c.dir, func(t *testing.T) {
30+
cleanedDir := cleanDir(c.dir)
31+
if cleanedDir != c.expectedCleanDir {
32+
t.Error("Incorrectly cleaned dir: " + cleanedDir + " != " + c.expectedCleanDir)
33+
}
34+
})
35+
}
36+
}
37+
738
func TestNextSeq(t *testing.T) {
839
cases := []struct {
940
name string
@@ -13,19 +44,23 @@ func TestNextSeq(t *testing.T) {
1344
expected string
1445
expectedErrStr string
1546
}{
16-
{"Bad digits", []string{}, "migrationDir", 0, "", "Digits must be positive"},
17-
{"Single digit initialize", []string{}, "migrationDir", 1, "1", ""},
18-
{"Single digit malformed", []string{"bad"}, "migrationDir", 1, "", "Malformed migration filename: bad"},
19-
{"Single digit no int", []string{"bad_bad"}, "migrationDir", 1, "", "strconv.Atoi: parsing \"bad\": invalid syntax"},
20-
{"Single digit negative seq", []string{"-5_test"}, "migrationDir", 1, "", "Next sequence number must be positive"},
21-
{"Single digit increment", []string{"3_test", "4_test"}, "migrationDir", 1, "5", ""},
22-
{"Single digit overflow", []string{"9_test"}, "migrationDir", 1, "", "Next sequence number 10 too large. At most 1 digits are allowed"},
23-
{"Zero-pad initialize", []string{}, "migrationDir", 6, "000001", ""},
24-
{"Zero-pad malformed", []string{"bad"}, "migrationDir", 6, "", "Malformed migration filename: bad"},
25-
{"Zero-pad no int", []string{"bad_bad"}, "migrationDir", 6, "", "strconv.Atoi: parsing \"bad\": invalid syntax"},
26-
{"Zero-pad negative seq", []string{"-000005_test"}, "migrationDir", 6, "", "Next sequence number must be positive"},
27-
{"Zero-pad increment", []string{"000003_test", "000004_test"}, "migrationDir", 6, "000005", ""},
28-
{"Zero-pad overflow", []string{"999999_test"}, "migrationDir", 6, "", "Next sequence number 1000000 too large. At most 6 digits are allowed"},
47+
{"Bad digits", []string{}, "migrationDir/", 0, "", "Digits must be positive"},
48+
{"Single digit initialize", []string{}, "migrationDir/", 1, "1", ""},
49+
{"Single digit malformed", []string{"bad"}, "migrationDir/", 1, "", "Malformed migration filename: bad"},
50+
{"Single digit no int", []string{"bad_bad"}, "migrationDir/", 1, "", "strconv.Atoi: parsing \"bad\": invalid syntax"},
51+
{"Single digit negative seq", []string{"-5_test"}, "migrationDir/", 1, "", "Next sequence number must be positive"},
52+
{"Single digit increment", []string{"3_test", "4_test"}, "migrationDir/", 1, "5", ""},
53+
{"Single digit overflow", []string{"9_test"}, "migrationDir/", 1, "", "Next sequence number 10 too large. At most 1 digits are allowed"},
54+
{"Zero-pad initialize", []string{}, "migrationDir/", 6, "000001", ""},
55+
{"Zero-pad malformed", []string{"bad"}, "migrationDir/", 6, "", "Malformed migration filename: bad"},
56+
{"Zero-pad no int", []string{"bad_bad"}, "migrationDir/", 6, "", "strconv.Atoi: parsing \"bad\": invalid syntax"},
57+
{"Zero-pad negative seq", []string{"-000005_test"}, "migrationDir/", 6, "", "Next sequence number must be positive"},
58+
{"Zero-pad increment", []string{"000003_test", "000004_test"}, "migrationDir/", 6, "000005", ""},
59+
{"Zero-pad overflow", []string{"999999_test"}, "migrationDir/", 6, "", "Next sequence number 1000000 too large. At most 6 digits are allowed"},
60+
{"dir - no trailing slash", []string{"migrationDir/000001_test"}, "migrationDir", 6, "", `strconv.Atoi: parsing "/000001": invalid syntax`},
61+
{"dir - with dot prefix success", []string{"migrationDir/000001_test"}, "./migrationDir/", 6, "", `strconv.Atoi: parsing "migrationDir/000001": invalid syntax`},
62+
{"dir - no dir prefix", []string{"000001_test"}, "migrationDir/", 6, "000002", ""},
63+
{"dir - strip success", []string{"migrationDir/000001_test"}, "migrationDir/", 6, "000002", ""},
2964
}
3065
for _, c := range cases {
3166
t.Run(c.name, func(t *testing.T) {

internal/cli/main.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,6 @@ Database drivers: `+strings.Join(database.List(), ", ")+"\n")
139139
}
140140
*extPtr = "." + strings.TrimPrefix(*extPtr, ".")
141141

142-
if *dirPtr != "" {
143-
*dirPtr = strings.Trim(*dirPtr, "/") + "/"
144-
}
145-
146142
createCmd(*dirPtr, startTime, *formatPtr, name, *extPtr, seq, seqDigits)
147143

148144
case "goto":

0 commit comments

Comments
 (0)