Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cecce18

Browse files
committed
fix source/file relative paths, ref golang-migrate#178 thanks @matyunin
1 parent 1f37f41 commit cecce18

File tree

2 files changed

+70
-6
lines changed

2 files changed

+70
-6
lines changed

source/file/file.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
nurl "net/url"
88
"os"
99
"path"
10+
"path/filepath"
1011

1112
"github.com/mattes/migrate/source"
1213
)
@@ -27,24 +28,36 @@ func (f *File) Open(url string) (source.Driver, error) {
2728
return nil, err
2829
}
2930

30-
// default to current directory if empty
31-
if u.Path == "" {
31+
// concat host and path to restore full path
32+
// host might be `.`
33+
p := u.Host + u.Path
34+
35+
if len(p) == 0 {
36+
// default to current directory if no path
3237
wd, err := os.Getwd()
3338
if err != nil {
3439
return nil, err
3540
}
36-
u.Path = wd
41+
p = wd
42+
43+
} else if p[0:1] == "." || p[0:1] != "/" {
44+
// make path absolute if relative
45+
abs, err := filepath.Abs(p)
46+
if err != nil {
47+
return nil, err
48+
}
49+
p = abs
3750
}
3851

3952
// scan directory
40-
files, err := ioutil.ReadDir(u.Path)
53+
files, err := ioutil.ReadDir(p)
4154
if err != nil {
4255
return nil, err
4356
}
4457

4558
nf := &File{
4659
url: url,
47-
path: u.Path,
60+
path: p,
4861
migrations: source.NewMigrations(),
4962
}
5063

source/file/file_test.go

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"io/ioutil"
66
"os"
77
"path"
8+
"path/filepath"
89
"testing"
910

1011
st "github.com/mattes/migrate/source/testing"
@@ -50,11 +51,61 @@ func TestOpen(t *testing.T) {
5051
mustWriteFile(t, tmpDir, "1_foobar.up.sql", "")
5152
mustWriteFile(t, tmpDir, "1_foobar.down.sql", "")
5253

54+
if !filepath.IsAbs(tmpDir) {
55+
t.Fatal("expected tmpDir to be absolute path")
56+
}
57+
5358
f := &File{}
54-
_, err = f.Open("file://" + tmpDir)
59+
_, err = f.Open("file://" + tmpDir) // absolute path
60+
if err != nil {
61+
t.Fatal(err)
62+
}
63+
}
64+
65+
func TestOpenWithRelativePath(t *testing.T) {
66+
tmpDir, err := ioutil.TempDir("", "TestOpen")
67+
if err != nil {
68+
t.Fatal(err)
69+
}
70+
defer os.RemoveAll(tmpDir)
71+
72+
wd, err := os.Getwd()
73+
if err != nil {
74+
t.Fatal(err)
75+
}
76+
defer os.Chdir(wd) // rescue working dir after we are done
77+
78+
if err := os.Chdir(tmpDir); err != nil {
79+
t.Fatal(err)
80+
}
81+
82+
if err := os.Mkdir(filepath.Join(tmpDir, "foo"), os.ModePerm); err != nil {
83+
t.Fatal(err)
84+
}
85+
86+
mustWriteFile(t, filepath.Join(tmpDir, "foo"), "1_foobar.up.sql", "")
87+
88+
f := &File{}
89+
90+
// dir: foo
91+
d, err := f.Open("file://foo")
5592
if err != nil {
5693
t.Fatal(err)
5794
}
95+
_, err = d.First()
96+
if err != nil {
97+
t.Fatalf("expected first file in working dir %v for foo", tmpDir)
98+
}
99+
100+
// dir: ./foo
101+
d, err = f.Open("file://./foo")
102+
if err != nil {
103+
t.Fatal(err)
104+
}
105+
_, err = d.First()
106+
if err != nil {
107+
t.Fatalf("expected first file in working dir %v for ./foo", tmpDir)
108+
}
58109
}
59110

60111
func TestOpenDefaultsToCurrentDirectory(t *testing.T) {

0 commit comments

Comments
 (0)