From e64b7cc233dcfdc2739eb478e4a82bdc8a942375 Mon Sep 17 00:00:00 2001 From: Matthias Kadenbach Date: Sun, 19 Feb 2017 15:51:12 -0800 Subject: [PATCH] explain dirty version error --- migrate.go | 21 ++++++++++++++------- migrate_test.go | 10 +++++----- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/migrate.go b/migrate.go index a53f52f..2a620c0 100644 --- a/migrate.go +++ b/migrate.go @@ -29,7 +29,6 @@ var ( ErrNilVersion = fmt.Errorf("no migration") ErrLocked = fmt.Errorf("database locked") ErrLockTimeout = fmt.Errorf("timeout: can't acquire database lock") - ErrDirty = fmt.Errorf("dirty database") ) // ErrShortLimit is an error returned when not enough migrations @@ -43,6 +42,14 @@ func (e ErrShortLimit) Error() string { return fmt.Sprintf("limit %v short", e.Short) } +type ErrDirty struct { + Version int +} + +func (e ErrDirty) Error() string { + return fmt.Sprintf("Dirty database version %v. Fix and force version.", e.Version) +} + type Migrate struct { sourceName string sourceDrv source.Driver @@ -210,7 +217,7 @@ func (m *Migrate) Migrate(version uint) error { } if dirty { - return m.unlockErr(ErrDirty) + return m.unlockErr(ErrDirty{curVersion}) } ret := make(chan interface{}, m.PrefetchMigrations) @@ -236,7 +243,7 @@ func (m *Migrate) Steps(n int) error { } if dirty { - return m.unlockErr(ErrDirty) + return m.unlockErr(ErrDirty{curVersion}) } ret := make(chan interface{}, m.PrefetchMigrations) @@ -263,7 +270,7 @@ func (m *Migrate) Up() error { } if dirty { - return m.unlockErr(ErrDirty) + return m.unlockErr(ErrDirty{curVersion}) } ret := make(chan interface{}, m.PrefetchMigrations) @@ -285,7 +292,7 @@ func (m *Migrate) Down() error { } if dirty { - return m.unlockErr(ErrDirty) + return m.unlockErr(ErrDirty{curVersion}) } ret := make(chan interface{}, m.PrefetchMigrations) @@ -317,13 +324,13 @@ func (m *Migrate) Run(migration ...*Migration) error { return err } - _, dirty, err := m.databaseDrv.Version() + curVersion, dirty, err := m.databaseDrv.Version() if err != nil { return m.unlockErr(err) } if dirty { - return m.unlockErr(ErrDirty) + return m.unlockErr(ErrDirty{curVersion}) } ret := make(chan interface{}, m.PrefetchMigrations) diff --git a/migrate_test.go b/migrate_test.go index 21aa64c..0ec4bce 100644 --- a/migrate_test.go +++ b/migrate_test.go @@ -289,7 +289,7 @@ func TestMigrateDirty(t *testing.T) { } err := m.Migrate(1) - if err != ErrDirty { + if _, ok := err.(ErrDirty); !ok { t.Fatalf("expected ErrDirty, got %v", err) } } @@ -370,7 +370,7 @@ func TestStepsDirty(t *testing.T) { } err := m.Steps(1) - if err != ErrDirty { + if _, ok := err.(ErrDirty); !ok { t.Fatalf("expected ErrDirty, got %v", err) } } @@ -420,7 +420,7 @@ func TestUpDirty(t *testing.T) { } err := m.Up() - if err != ErrDirty { + if _, ok := err.(ErrDirty); !ok { t.Fatalf("expected ErrDirty, got %v", err) } } @@ -433,7 +433,7 @@ func TestDownDirty(t *testing.T) { } err := m.Down() - if err != ErrDirty { + if _, ok := err.(ErrDirty); !ok { t.Fatalf("expected ErrDirty, got %v", err) } } @@ -514,7 +514,7 @@ func TestRunDirty(t *testing.T) { } err = m.Run(migr) - if err != ErrDirty { + if _, ok := err.(ErrDirty); !ok { t.Fatalf("expected ErrDirty, got %v", err) } }