// Package pgtxtar loads migrations for github.com/go-pg/migrations/v8 package // in ad-hoc txtar format from a fs.FS filesystem.
package pgtxtar import ( ) // LoadFS loads migrations from SQL script archives in filesystem. func ( fs.FS) ([]*migrations.Migration, error) { var error var []*migrations.Migration := fs.WalkDir(, ".", func( string, fs.DirEntry, error) error { if != nil { return // fatal } if .IsDir() { return nil } , := fs.ReadFile(, ) if != nil { return // fatal } := strings.TrimSuffix(path.Base(), path.Ext()) := strings.SplitN(, "_", 2) , := strconv.ParseInt([0], 10, 64) if != nil { = multierr.Append(, fmt.Errorf("parse version: %q", )) return nil } := txtar.Parse() if := checkArchive(); != nil { = multierr.Append(, fmt.Errorf("migration %q: %v", , )) return nil } := &migrations.Migration{ Version: , UpTx: true, DownTx: true, } for , := range .Files { switch .Name { case "up": .Up = migrationExec(.Data) case "down": .Down = migrationExec(.Data) case "disable_tx": .UpTx = false .DownTx = false } } = append(, ) return nil }) return , multierr.Append(, ) } func ( *txtar.Archive) error { var error := map[string]int{} for , := range .Files { := .Name switch { case "up", "down": // ok case "disable_tx": := bytes.TrimSpace(.Data) if len() != 0 { = multierr.Append(, fmt.Errorf( "section %q must be empty", , )) } default: = multierr.Append(, fmt.Errorf( "unknown section %q", , )) } if [] == 1 { = multierr.Append(, fmt.Errorf( "duplicate section %q", , )) } []++ } := []string{"up"} for , := range { if [] != 0 { continue } = multierr.Append(, fmt.Errorf( "missing required section %q", , )) } return } func ( []byte) func( migrations.DB) error { return func( migrations.DB) error { , := .Exec(string()) return } }