forked from pressly/goose
-
Notifications
You must be signed in to change notification settings - Fork 0
/
goose.go
137 lines (122 loc) · 3.65 KB
/
goose.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package goose
import (
"context"
"database/sql"
"fmt"
"io/fs"
"strconv"
)
// Deprecated: VERSION will no longer be supported in the next major release.
const VERSION = "v3.2.0"
var (
minVersion = int64(0)
maxVersion = int64((1 << 63) - 1)
timestampFormat = "20060102150405"
verbose = false
noColor = false
// base fs to lookup migrations
baseFS fs.FS = osFS{}
)
// SetVerbose set the goose verbosity mode
func SetVerbose(v bool) {
verbose = v
}
// SetBaseFS sets a base FS to discover migrations. It can be used with 'embed' package.
// Calling with 'nil' argument leads to default behaviour: discovering migrations from os filesystem.
// Note that modifying operations like Create will use os filesystem anyway.
func SetBaseFS(fsys fs.FS) {
if fsys == nil {
fsys = osFS{}
}
baseFS = fsys
}
// Run runs a goose command.
func Run(command string, db *sql.DB, dir string, args ...string) error {
ctx := context.Background()
return RunContext(ctx, command, db, dir, args...)
}
// RunContext runs a goose command.
func RunContext(ctx context.Context, command string, db *sql.DB, dir string, args ...string) error {
return run(ctx, command, db, dir, args)
}
// RunWithOptions runs a goose command with options.
func RunWithOptions(command string, db *sql.DB, dir string, args []string, options ...OptionsFunc) error {
ctx := context.Background()
return RunWithOptionsContext(ctx, command, db, dir, args, options...)
}
// RunWithOptionsContext runs a goose command with options.
func RunWithOptionsContext(ctx context.Context, command string, db *sql.DB, dir string, args []string, options ...OptionsFunc) error {
return run(ctx, command, db, dir, args, options...)
}
func run(ctx context.Context, command string, db *sql.DB, dir string, args []string, options ...OptionsFunc) error {
switch command {
case "up":
if err := UpContext(ctx, db, dir, options...); err != nil {
return err
}
case "up-by-one":
if err := UpByOneContext(ctx, db, dir, options...); err != nil {
return err
}
case "up-to":
if len(args) == 0 {
return fmt.Errorf("up-to must be of form: goose [OPTIONS] DRIVER DBSTRING up-to VERSION")
}
version, err := strconv.ParseInt(args[0], 10, 64)
if err != nil {
return fmt.Errorf("version must be a number (got '%s')", args[0])
}
if err := UpToContext(ctx, db, dir, version, options...); err != nil {
return err
}
case "create":
if len(args) == 0 {
return fmt.Errorf("create must be of form: goose [OPTIONS] DRIVER DBSTRING create NAME [go|sql]")
}
migrationType := "go"
if len(args) == 2 {
migrationType = args[1]
}
if err := Create(db, dir, args[0], migrationType); err != nil {
return err
}
case "down":
if err := DownContext(ctx, db, dir, options...); err != nil {
return err
}
case "down-to":
if len(args) == 0 {
return fmt.Errorf("down-to must be of form: goose [OPTIONS] DRIVER DBSTRING down-to VERSION")
}
version, err := strconv.ParseInt(args[0], 10, 64)
if err != nil {
return fmt.Errorf("version must be a number (got '%s')", args[0])
}
if err := DownToContext(ctx, db, dir, version, options...); err != nil {
return err
}
case "fix":
if err := Fix(dir); err != nil {
return err
}
case "redo":
if err := RedoContext(ctx, db, dir, options...); err != nil {
return err
}
case "reset":
if err := ResetContext(ctx, db, dir, options...); err != nil {
return err
}
case "status":
if err := StatusContext(ctx, db, dir, options...); err != nil {
return err
}
case "version":
if err := VersionContext(ctx, db, dir, options...); err != nil {
return err
}
default:
return fmt.Errorf("%q: no such command", command)
}
return nil
}