diff --git a/cli/README.md b/cli/README.md index b3b38d2..74865dc 100644 --- a/cli/README.md +++ b/cli/README.md @@ -54,6 +54,8 @@ Options: -help Print usage Commands: + create [-ext E] [-dir D] NAME + Create a set of timestamped up/down migrations titled NAME, in directory D with extension E goto V Migrate to version V up [N] Apply all or N up migrations down [N] Apply all or N down migrations diff --git a/cli/commands.go b/cli/commands.go index e264621..703896d 100644 --- a/cli/commands.go +++ b/cli/commands.go @@ -4,8 +4,23 @@ import ( "github.com/mattes/migrate" _ "github.com/mattes/migrate/database/stub" // TODO remove again _ "github.com/mattes/migrate/source/file" + "os" + "fmt" ) +func createCmd(dir string, timestamp int64, name string, ext string) { + base := fmt.Sprintf("%v%v_%v.", dir, timestamp, name) + os.MkdirAll(dir, os.ModePerm) + createFile(base + "up" + ext) + createFile(base + "down" + ext) +} + +func createFile(fname string) { + if _, err := os.Create(fname); err != nil { + log.fatalErr(err) + } +} + func gotoCmd(m *migrate.Migrate, v uint) { if err := m.Migrate(v); err != nil { if err != migrate.ErrNoChange { diff --git a/cli/main.go b/cli/main.go index 58b17c1..f019b5c 100644 --- a/cli/main.go +++ b/cli/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "strings" "os" "os/signal" "strconv" @@ -41,6 +42,8 @@ Options: -help Print usage Commands: + create [-ext E] [-dir D] NAME + Create a set of timestamped up/down migrations titled NAME, in directory D with extension E goto V Migrate to version V up [N] Apply all or N up migrations down [N] Apply all or N down migrations @@ -101,6 +104,30 @@ Commands: startTime := time.Now() switch flag.Arg(0) { + case "create": + args := flag.Args()[1:] + + createFlagSet := flag.NewFlagSet("create", flag.ExitOnError) + extPtr := createFlagSet.String("ext", "", "File extension") + dirPtr := createFlagSet.String("dir", "", "Directory to place file in (default: current working directory)") + createFlagSet.Parse(args) + + if createFlagSet.NArg() == 0 { + log.fatal("error: please specify name") + } + name := createFlagSet.Arg(0) + + if *extPtr != "" { + *extPtr = "." + strings.TrimPrefix(*extPtr, ".") + } + if *dirPtr != "" { + *dirPtr = strings.Trim(*dirPtr, "/") + "/" + } + + timestamp := startTime.Unix() + + createCmd(*dirPtr, timestamp, name, *extPtr) + case "goto": if migraterErr != nil { log.fatalErr(migraterErr)