github.com/bishtawi/migrate/v4@v4.8.11/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/bishtawi/migrate/v4/source"
    10  	"github.com/bishtawi/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  }