Skip to content

Commit a7cb556

Browse files
cryptixrubenv
authored andcommitted
Add support for Go1.16 embed.FS
This just adds a new struct with embed.FS and slightly changes findMigrations() to also have a root from where to start searching.
1 parent a32ed26 commit a7cb556

3 files changed

Lines changed: 59 additions & 7 deletions

File tree

migrate.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"net/http"
1010
"os"
1111
"path"
12+
"path/filepath"
1213
"regexp"
1314
"sort"
1415
"strconv"
@@ -229,7 +230,7 @@ type HttpFileSystemMigrationSource struct {
229230
var _ MigrationSource = (*HttpFileSystemMigrationSource)(nil)
230231

231232
func (f HttpFileSystemMigrationSource) FindMigrations() ([]*Migration, error) {
232-
return findMigrations(f.FileSystem)
233+
return findMigrations(f.FileSystem, "/")
233234
}
234235

235236
// A set of migrations loaded from a directory.
@@ -241,13 +242,13 @@ var _ MigrationSource = (*FileMigrationSource)(nil)
241242

242243
func (f FileMigrationSource) FindMigrations() ([]*Migration, error) {
243244
filesystem := http.Dir(f.Dir)
244-
return findMigrations(filesystem)
245+
return findMigrations(filesystem, "/")
245246
}
246247

247-
func findMigrations(dir http.FileSystem) ([]*Migration, error) {
248+
func findMigrations(dir http.FileSystem, root string) ([]*Migration, error) {
248249
migrations := make([]*Migration, 0)
249250

250-
file, err := dir.Open("/")
251+
file, err := dir.Open(root)
251252
if err != nil {
252253
return nil, err
253254
}
@@ -259,7 +260,7 @@ func findMigrations(dir http.FileSystem) ([]*Migration, error) {
259260

260261
for _, info := range files {
261262
if strings.HasSuffix(info.Name(), ".sql") {
262-
migration, err := migrationFromFile(dir, info)
263+
migration, err := migrationFromFile(dir, root, info)
263264
if err != nil {
264265
return nil, err
265266
}
@@ -274,8 +275,8 @@ func findMigrations(dir http.FileSystem) ([]*Migration, error) {
274275
return migrations, nil
275276
}
276277

277-
func migrationFromFile(dir http.FileSystem, info os.FileInfo) (*Migration, error) {
278-
path := fmt.Sprintf("/%s", strings.TrimPrefix(info.Name(), "/"))
278+
func migrationFromFile(dir http.FileSystem, root string, info os.FileInfo) (*Migration, error) {
279+
path := filepath.Join(root, info.Name())
279280
file, err := dir.Open(path)
280281
if err != nil {
281282
return nil, fmt.Errorf("Error while opening %s: %s", info.Name(), err)

migrate_go116.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// +build go1.16
2+
3+
package migrate
4+
5+
import (
6+
"embed"
7+
"net/http"
8+
)
9+
10+
// A set of migrations loaded from an go1.16 embed.FS
11+
12+
type EmbedFileSystemMigrationSource struct {
13+
FileSystem embed.FS
14+
15+
Root string
16+
}
17+
18+
var _ MigrationSource = (*EmbedFileSystemMigrationSource)(nil)
19+
20+
func (f EmbedFileSystemMigrationSource) FindMigrations() ([]*Migration, error) {
21+
return findMigrations(http.FS(f.FileSystem), f.Root)
22+
}

migrate_go116_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// +build go1.16
2+
3+
package migrate
4+
5+
import (
6+
"embed"
7+
8+
. "gopkg.in/check.v1"
9+
)
10+
11+
//go:embed test-migrations/*
12+
var testEmbedFS embed.FS
13+
14+
func (s *SqliteMigrateSuite) TestEmbedSource(c *C) {
15+
migrations := EmbedFileSystemMigrationSource{
16+
FileSystem: testEmbedFS,
17+
Root: "test-migrations",
18+
}
19+
20+
// Executes two migrations
21+
n, err := Exec(s.Db, "sqlite3", migrations, Up)
22+
c.Assert(err, IsNil)
23+
c.Assert(n, Equals, 2)
24+
25+
// Has data
26+
id, err := s.DbMap.SelectInt("SELECT id FROM people")
27+
c.Assert(err, IsNil)
28+
c.Assert(id, Equals, int64(1))
29+
}

0 commit comments

Comments
 (0)