github.com/brandonmartin/migrate/v4@v4.14.2/source/file/file.go (about) 1 package file 2 3 import ( 4 "net/http" 5 nurl "net/url" 6 "os" 7 "path/filepath" 8 9 "github.com/golang-migrate/migrate/v4/source" 10 "github.com/golang-migrate/migrate/v4/source/httpfs" 11 ) 12 13 func init() { 14 source.Register("file", &File{}) 15 } 16 17 type File struct { 18 httpfs.PartialDriver 19 url string 20 path string 21 } 22 23 func (f *File) Open(url string) (source.Driver, error) { 24 u, err := nurl.Parse(url) 25 if err != nil { 26 return nil, err 27 } 28 29 // concat host and path to restore full path 30 // host might be `.` 31 p := u.Opaque 32 if len(p) == 0 { 33 p = u.Host + u.Path 34 } 35 36 if len(p) == 0 { 37 // default to current directory if no path 38 wd, err := os.Getwd() 39 if err != nil { 40 return nil, err 41 } 42 p = wd 43 44 } else if p[0:1] == "." || p[0:1] != "/" { 45 // make path absolute if relative 46 abs, err := filepath.Abs(p) 47 if err != nil { 48 return nil, err 49 } 50 p = abs 51 } 52 53 nf := &File{ 54 url: url, 55 path: p, 56 } 57 if err := nf.Init(http.Dir(p), ""); err != nil { 58 return nil, err 59 } 60 return nf, nil 61 }