github.com/ghosta3/migrate/v4@v4.15.10/source/file/file.go (about) 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 // concat host and path to restore full path 43 // host might be `.` 44 p := u.Opaque 45 if len(p) == 0 { 46 p = u.Host + u.Path 47 } 48 49 if len(p) == 0 { 50 // default to current directory if no path 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 // make path absolute if relative 59 abs, err := filepath.Abs(p) 60 if err != nil { 61 return "", err 62 } 63 p = abs 64 } 65 return p, nil 66 }