fix.go

 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}