...
1 package file
2
3 import (
4 nurl "net/url"
5 "os"
6 "path/filepath"
7
8 "github.com/golang-migrate/migrate/v4/source"
9 "github.com/golang-migrate/migrate/v4/source/iofs"
10 )
11
12 func init() {
13 source.Register("file", &File{})
14 }
15
16 type File struct {
17 iofs.PartialDriver
18 url string
19 path string
20 }
21
22 func (f *File) Open(url string) (source.Driver, error) {
23 p, err := parseURL(url)
24 if err != nil {
25 return nil, err
26 }
27 nf := &File{
28 url: url,
29 path: p,
30 }
31 if err := nf.Init(os.DirFS(p), "."); err != nil {
32 return nil, err
33 }
34 return nf, nil
35 }
36
37 func parseURL(url string) (string, error) {
38 u, err := nurl.Parse(url)
39 if err != nil {
40 return "", err
41 }
42
43
44 p := u.Opaque
45 if len(p) == 0 {
46 p = u.Host + u.Path
47 }
48
49 if len(p) == 0 {
50
51 wd, err := os.Getwd()
52 if err != nil {
53 return "", err
54 }
55 p = wd
56
57 } else if p[0:1] == "." || p[0:1] != "/" {
58
59 abs, err := filepath.Abs(p)
60 if err != nil {
61 return "", err
62 }
63 p = abs
64 }
65 return p, nil
66 }
67
View as plain text