Skip to content

Commit b9aeb2a

Browse files
committed
Add CLI flags
1 parent f5fb235 commit b9aeb2a

File tree

2 files changed

+64
-8
lines changed

2 files changed

+64
-8
lines changed

main.go

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,22 @@ func NewApp() *cli.App {
148148
Name: "migrate",
149149
Usage: "Migrate to the latest version",
150150
Flags: []cli.Flag{
151+
&cli.StringFlag{
152+
Name: "only",
153+
Usage: "apply only the specified migration version",
154+
},
155+
&cli.StringFlag{
156+
Name: "to",
157+
Usage: "apply migrations up to specified version (inclusive)",
158+
},
159+
&cli.BoolFlag{
160+
Name: "one",
161+
Usage: "apply exactly one pending migration",
162+
},
163+
&cli.BoolFlag{
164+
Name: "all",
165+
Usage: "apply all pending migrations (default)",
166+
},
151167
&cli.BoolFlag{
152168
Name: "strict",
153169
EnvVars: []string{"DBMATE_STRICT"},
@@ -163,14 +179,42 @@ func NewApp() *cli.App {
163179
Action: action(func(db *dbmate.DB, c *cli.Context) error {
164180
db.Strict = c.Bool("strict")
165181
db.Verbose = c.Bool("verbose")
166-
return db.Migrate()
182+
if version := c.String("only"); version != "" {
183+
migrations, err := db.FindMigrations()
184+
if err != nil {
185+
return err
186+
}
187+
return db.MigrateOnly(migrations, version)
188+
} else if version := c.String("to"); version != "" {
189+
return db.MigrateTo(version)
190+
} else if c.Bool("one") {
191+
return db.MigrateNext()
192+
} else {
193+
return db.Migrate() // default: apply all
194+
}
167195
}),
168196
},
169197
{
170198
Name: "rollback",
171199
Aliases: []string{"down"},
172200
Usage: "Rollback the most recent migration",
173201
Flags: []cli.Flag{
202+
&cli.StringFlag{
203+
Name: "only",
204+
Usage: "rollback only the specified migration version",
205+
},
206+
&cli.StringFlag{
207+
Name: "to",
208+
Usage: "rollback migrations down to specified version (exclusive)",
209+
},
210+
&cli.BoolFlag{
211+
Name: "one",
212+
Usage: "rollback exactly one migration (default)",
213+
},
214+
&cli.BoolFlag{
215+
Name: "all",
216+
Usage: "rollback all migrations",
217+
},
174218
&cli.BoolFlag{
175219
Name: "verbose",
176220
Aliases: []string{"v"},
@@ -180,7 +224,19 @@ func NewApp() *cli.App {
180224
},
181225
Action: action(func(db *dbmate.DB, c *cli.Context) error {
182226
db.Verbose = c.Bool("verbose")
183-
return db.Rollback()
227+
if version := c.String("only"); version != "" {
228+
migrations, err := db.FindMigrations()
229+
if err != nil {
230+
return err
231+
}
232+
return db.RollbackOnly(migrations, version)
233+
} else if version := c.String("to"); version != "" {
234+
return db.RollbackTo(version)
235+
} else if c.Bool("all") {
236+
return db.RollbackAll()
237+
} else {
238+
return db.Rollback() // default: rollback one migration
239+
}
184240
}),
185241
},
186242
{

pkg/dbmate/db.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -741,8 +741,8 @@ func (db *DB) Rollback() error {
741741
return nil
742742
}
743743

744-
// migrateOnly applies exactly one pending migration that matches the given version.
745-
func (db *DB) migrateOnly(migrations []Migration, version string) error {
744+
// MigrateOnly applies exactly one pending migration that matches the given version.
745+
func (db *DB) MigrateOnly(migrations []Migration, version string) error {
746746
drv, err := db.Driver()
747747
if err != nil {
748748
return err
@@ -808,8 +808,8 @@ func (db *DB) migrateOnly(migrations []Migration, version string) error {
808808
return nil
809809
}
810810

811-
// rollbackOnly rolls back exactly one applied migration that matches the given version.
812-
func (db *DB) rollbackOnly(migrations []Migration, version string) error {
811+
// RollbackOnly rolls back exactly one applied migration that matches the given version.
812+
func (db *DB) RollbackOnly(migrations []Migration, version string) error {
813813
drv, err := db.Driver()
814814
if err != nil {
815815
return err
@@ -883,7 +883,7 @@ func (db *DB) MigrateTo(target string) error {
883883
if m.Applied || m.Version > target {
884884
continue
885885
}
886-
if err := db.migrateOnly(migrations, m.Version); err != nil {
886+
if err := db.MigrateOnly(migrations, m.Version); err != nil {
887887
return err
888888
}
889889
}
@@ -922,7 +922,7 @@ func (db *DB) RollbackTo(target string) error {
922922
if !m.Applied || m.Version <= target {
923923
continue
924924
}
925-
if err := db.rollbackOnly(migrations, m.Version); err != nil {
925+
if err := db.RollbackOnly(migrations, m.Version); err != nil {
926926
return err
927927
}
928928
}

0 commit comments

Comments
 (0)