1package goose
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7 "strings"
8)
9
10const seqVersionTemplate = "%05v"
11
12func Fix(dir string) error {
13 // always use osFS here because it's modifying operation
14 migrations, err := collectMigrationsFS(osFS{}, dir, minVersion, maxVersion, registeredGoMigrations)
15 if err != nil {
16 return err
17 }
18
19 // split into timestamped and versioned migrations
20 tsMigrations, err := migrations.timestamped()
21 if err != nil {
22 return err
23 }
24
25 vMigrations, err := migrations.versioned()
26 if err != nil {
27 return err
28 }
29 // Initial version.
30 version := int64(1)
31 if last, err := vMigrations.Last(); err == nil {
32 version = last.Version + 1
33 }
34
35 // fix filenames by replacing timestamps with sequential versions
36 for _, tsm := range tsMigrations {
37 oldPath := tsm.Source
38 newPath := strings.Replace(
39 oldPath,
40 fmt.Sprintf("%d", tsm.Version),
41 fmt.Sprintf(seqVersionTemplate, version),
42 1,
43 )
44
45 if err := os.Rename(oldPath, newPath); err != nil {
46 return err
47 }
48
49 log.Printf("RENAMED %s => %s", filepath.Base(oldPath), filepath.Base(newPath))
50 version++
51 }
52
53 return nil
54}