Skip to content

Commit

Permalink
added migrate history-sync command
Browse files Browse the repository at this point in the history
  • Loading branch information
ganigeorgiev committed Mar 25, 2023
1 parent e5a22b8 commit 5678339
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

- Added option to explicitly set the record id from the Admin UI ([#2118](https://github.com/pocketbase/pocketbase/issues/2118)).

- Added `migrate history-sync` command to clean `_migrations` history table from deleted migration files references.

- Added `core.RecordAuthWithOAuth2Event.IsNewRecord` bool field to indicate whether the OAuth2 action created a new auth record.

- **!** Renamed `daos.GetTableColumns()` to `daos.TableColumns()` for consistency with the other Dao table related helpers.
Expand Down
1 change: 1 addition & 0 deletions plugins/migratecmd/migratecmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ func (p *plugin) createCommand() *cobra.Command {
- down [number] - reverts the last [number] applied migrations
- create name - creates new blank migration template file
- collections - creates new migration file with snapshot of the local collections configuration
- history-sync - ensures that the _migrations history table doesn't have references to deleted migration files
`

command := &cobra.Command{
Expand Down
23 changes: 23 additions & 0 deletions tools/migrate/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ func (r *Runner) Run(args ...string) error {
}
}

return nil
case "history-sync":
if err := r.removeMissingAppliedMigrations(); err != nil {
color.Red(err.Error())
return err
}

color.Green("The %s table was synced with the available migrations.", r.tableName)
return nil
default:
return fmt.Errorf("Unsupported command: %q\n", cmd)
Expand Down Expand Up @@ -252,3 +260,18 @@ func (r *Runner) lastAppliedMigrations(limit int) ([]string, error) {

return files, nil
}

func (r *Runner) removeMissingAppliedMigrations() error {
loadedMigrations := r.migrationsList.Items()

names := make([]any, len(loadedMigrations))
for i, migration := range loadedMigrations {
names[i] = migration.File
}

_, err := r.db.Delete(r.tableName, dbx.Not(dbx.HashExp{
"file": names,
})).Execute()

return err
}
50 changes: 50 additions & 0 deletions tools/migrate/runner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,56 @@ func TestRunnerUpAndDown(t *testing.T) {
}
}

func TestHistorySync(t *testing.T) {
testDB, err := createTestDB()
if err != nil {
t.Fatal(err)
}
defer testDB.Close()

// mock migrations history
l := MigrationsList{}
l.Register(func(db dbx.Builder) error {
return nil
}, func(db dbx.Builder) error {
return nil
}, "1_test")
l.Register(func(db dbx.Builder) error {
return nil
}, func(db dbx.Builder) error {
return nil
}, "2_test")
l.Register(func(db dbx.Builder) error {
return nil
}, func(db dbx.Builder) error {
return nil
}, "3_test")

r, err := NewRunner(testDB.DB, l)
if err != nil {
t.Fatalf("Failed to initialize the runner: %v", err)
}

if _, err := r.Up(); err != nil {
t.Fatalf("Failed to apply the mock migrations: %v", err)
}

if !r.isMigrationApplied(testDB.DB, "2_test") {
t.Fatalf("Expected 2_test migration to be applied")
}

// mock deleted migrations
r.migrationsList.list = []*Migration{r.migrationsList.list[0], r.migrationsList.list[2]}

if err := r.removeMissingAppliedMigrations(); err != nil {
t.Fatalf("Failed to remove missing applied migrations: %v", err)
}

if r.isMigrationApplied(testDB.DB, "2_test") {
t.Fatalf("Expected 2_test migration to NOT be applied")
}
}

// -------------------------------------------------------------------
// Helpers
// -------------------------------------------------------------------
Expand Down

0 comments on commit 5678339

Please sign in to comment.