summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2021-08-22 16:46:17 +0700
committerShulhan <ms@kilabit.info>2021-08-22 17:13:31 +0700
commit5bca3ea57f88359c10cfc086dab472573f63341d (patch)
tree01ac26bafeb6ece96a1d9c5bac4646b78d97fca6
parente427fe4fe530de6dc750375f8ff6fad891f65567 (diff)
downloadpakakeh.go-5bca3ea57f88359c10cfc086dab472573f63341d.tar.xz
lib/memfs: fix symbolic link with different name
Previously, if file is symbolic link and has different name with their original file, it will return an error when we tried to open the file parentpath/filename: no such file or directory because we use the original file name, not the symlinked file name. This commit fix this issue by not replacing the original FileInfo for symlink but by setting only the size and mode.
-rw-r--r--lib/memfs/generate_test/gen_test.go42
-rw-r--r--lib/memfs/generate_test/memfs_generate_test.go20
-rw-r--r--lib/memfs/memfs.go13
-rw-r--r--lib/memfs/memfs_example_test.go2
-rw-r--r--lib/memfs/memfs_test.go48
-rw-r--r--lib/memfs/node.go22
l---------lib/memfs/testdata/exclude/index-link.css (renamed from lib/memfs/testdata/exclude/index.css)0
l---------lib/memfs/testdata/exclude/index-link.html (renamed from lib/memfs/testdata/exclude/index.html)0
l---------lib/memfs/testdata/exclude/index-link.js (renamed from lib/memfs/testdata/exclude/index.js)0
9 files changed, 79 insertions, 68 deletions
diff --git a/lib/memfs/generate_test/gen_test.go b/lib/memfs/generate_test/gen_test.go
index 8e6b1798..be1ddb44 100644
--- a/lib/memfs/generate_test/gen_test.go
+++ b/lib/memfs/generate_test/gen_test.go
@@ -93,50 +93,50 @@ func generate_testdata_exclude() *memfs.Node {
node.SetMode(2147484141)
node.SetName("exclude")
node.SetSize(0)
- node.AddChild(_memFS_getNode(memFS, "/exclude/index.css", generate_testdata_exclude_index_css))
- node.AddChild(_memFS_getNode(memFS, "/exclude/index.html", generate_testdata_exclude_index_html))
- node.AddChild(_memFS_getNode(memFS, "/exclude/index.js", generate_testdata_exclude_index_js))
+ node.AddChild(_memFS_getNode(memFS, "/exclude/index-link.css", generate_testdata_exclude_index_link_css))
+ node.AddChild(_memFS_getNode(memFS, "/exclude/index-link.html", generate_testdata_exclude_index_link_html))
+ node.AddChild(_memFS_getNode(memFS, "/exclude/index-link.js", generate_testdata_exclude_index_link_js))
return node
}
-func generate_testdata_exclude_index_css() *memfs.Node {
+func generate_testdata_exclude_index_link_css() *memfs.Node {
node := &memfs.Node{
- SysPath: "testdata/exclude/index.css",
- Path: "/exclude/index.css",
+ SysPath: "testdata/exclude/index-link.css",
+ Path: "/exclude/index-link.css",
ContentType: "text/css; charset=utf-8",
ContentEncoding: "",
V: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"),
}
node.SetMode(420)
- node.SetName("index.css")
+ node.SetName("index-link.css")
node.SetSize(9)
return node
}
-func generate_testdata_exclude_index_html() *memfs.Node {
+func generate_testdata_exclude_index_link_html() *memfs.Node {
node := &memfs.Node{
- SysPath: "testdata/exclude/index.html",
- Path: "/exclude/index.html",
+ SysPath: "testdata/exclude/index-link.html",
+ Path: "/exclude/index-link.html",
ContentType: "text/html; charset=utf-8",
ContentEncoding: "",
V: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"),
}
node.SetMode(420)
- node.SetName("index.html")
+ node.SetName("index-link.html")
node.SetSize(14)
return node
}
-func generate_testdata_exclude_index_js() *memfs.Node {
+func generate_testdata_exclude_index_link_js() *memfs.Node {
node := &memfs.Node{
- SysPath: "testdata/exclude/index.js",
- Path: "/exclude/index.js",
+ SysPath: "testdata/exclude/index-link.js",
+ Path: "/exclude/index-link.js",
ContentType: "text/javascript; charset=utf-8",
ContentEncoding: "",
V: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"),
}
node.SetMode(420)
- node.SetName("index.js")
+ node.SetName("index-link.js")
node.SetSize(16)
return node
}
@@ -292,12 +292,12 @@ func init() {
_memFS_getNode(memFS, "/direct/add/file2", generate_testdata_direct_add_file2))
memFS.PathNodes.Set("/exclude",
_memFS_getNode(memFS, "/exclude", generate_testdata_exclude))
- memFS.PathNodes.Set("/exclude/index.css",
- _memFS_getNode(memFS, "/exclude/index.css", generate_testdata_exclude_index_css))
- memFS.PathNodes.Set("/exclude/index.html",
- _memFS_getNode(memFS, "/exclude/index.html", generate_testdata_exclude_index_html))
- memFS.PathNodes.Set("/exclude/index.js",
- _memFS_getNode(memFS, "/exclude/index.js", generate_testdata_exclude_index_js))
+ memFS.PathNodes.Set("/exclude/index-link.css",
+ _memFS_getNode(memFS, "/exclude/index-link.css", generate_testdata_exclude_index_link_css))
+ memFS.PathNodes.Set("/exclude/index-link.html",
+ _memFS_getNode(memFS, "/exclude/index-link.html", generate_testdata_exclude_index_link_html))
+ memFS.PathNodes.Set("/exclude/index-link.js",
+ _memFS_getNode(memFS, "/exclude/index-link.js", generate_testdata_exclude_index_link_js))
memFS.PathNodes.Set("/include",
_memFS_getNode(memFS, "/include", generate_testdata_include))
memFS.PathNodes.Set("/include/index.css",
diff --git a/lib/memfs/generate_test/memfs_generate_test.go b/lib/memfs/generate_test/memfs_generate_test.go
index 73539cff..09af99fb 100644
--- a/lib/memfs/generate_test/memfs_generate_test.go
+++ b/lib/memfs/generate_test/memfs_generate_test.go
@@ -25,14 +25,14 @@ func TestGeneratePathNode(t *testing.T) {
expRoot.SetSize(0)
expExcludeIndexHTML := &memfs.Node{
- SysPath: filepath.Join("testdata", "exclude", "index.html"),
- Path: "/exclude/index.html",
+ SysPath: filepath.Join("testdata", "exclude", "index-link.html"),
+ Path: "/exclude/index-link.html",
ContentType: "text/html; charset=utf-8",
V: []byte("<html></html>\n"),
}
expExcludeIndexHTML.SetMode(0644)
- expExcludeIndexHTML.SetName("index.html")
+ expExcludeIndexHTML.SetName("index-link.html")
expExcludeIndexHTML.SetSize(14)
cases := []struct {
@@ -46,22 +46,20 @@ func TestGeneratePathNode(t *testing.T) {
path: "/",
exp: expRoot,
}, {
- path: "/exclude/index.html",
+ path: "/exclude/index-link.html",
exp: expExcludeIndexHTML,
}}
for _, c := range cases {
- t.Log(c.path)
-
got, err := memFS.Get(c.path)
if err != nil {
- test.Assert(t, "error", c.expError, err.Error())
+ test.Assert(t, c.path+": error", c.expError, err.Error())
continue
}
childs := got.Childs
got.Childs = nil
- test.Assert(t, "Node", c.exp, got)
+ test.Assert(t, c.path+": Node", c.exp, got)
got.Childs = childs
}
}
@@ -95,9 +93,9 @@ func TestNode_Readdir(t *testing.T) {
}, {
path: "/exclude",
exp: []string{
- "index.css",
- "index.html",
- "index.js",
+ "index-link.css",
+ "index-link.html",
+ "index-link.js",
},
}, {
path: "/include",
diff --git a/lib/memfs/memfs.go b/lib/memfs/memfs.go
index 9ea03553..70cae220 100644
--- a/lib/memfs/memfs.go
+++ b/lib/memfs/memfs.go
@@ -133,19 +133,6 @@ func New(opts *Options) (mfs *MemFS, err error) {
func (mfs *MemFS) AddChild(parent *Node, fi os.FileInfo) (child *Node, err error) {
sysPath := filepath.Join(parent.SysPath, fi.Name())
- if fi.Mode()&os.ModeSymlink != 0 {
- symPath := filepath.Join(parent.SysPath, fi.Name())
- absPath, err := filepath.EvalSymlinks(symPath)
- if err != nil {
- return nil, fmt.Errorf("memfs.AddChild: %w", err)
- }
-
- fi, err = os.Lstat(absPath)
- if err != nil {
- return nil, fmt.Errorf("memfs.AddChild: %w", err)
- }
- }
-
if !mfs.isIncluded(sysPath, fi.Mode()) {
return nil, nil
}
diff --git a/lib/memfs/memfs_example_test.go b/lib/memfs/memfs_example_test.go
index 5b21602d..cce8dfaf 100644
--- a/lib/memfs/memfs_example_test.go
+++ b/lib/memfs/memfs_example_test.go
@@ -50,7 +50,7 @@ func ExampleMemFS_Search() {
// Unordered output:
// Path: /include/index.css
// Snippets: ["body {\n}\n"]
- // Path: /exclude/index.css
+ // Path: /exclude/index-link.css
// Snippets: ["body {\n}\n"]
// Path: /index.css
// Snippets: ["body {\n}\n"]
diff --git a/lib/memfs/memfs_test.go b/lib/memfs/memfs_test.go
index f18b5ff9..998913a3 100644
--- a/lib/memfs/memfs_test.go
+++ b/lib/memfs/memfs_test.go
@@ -79,9 +79,9 @@ func TestNew(t *testing.T) {
expMapKeys: []string{
"/",
"/exclude",
- "/exclude/index.css",
- "/exclude/index.html",
- "/exclude/index.js",
+ "/exclude/index-link.css",
+ "/exclude/index-link.html",
+ "/exclude/index-link.js",
"/include",
"/include/index.css",
"/include/index.html",
@@ -104,8 +104,8 @@ func TestNew(t *testing.T) {
expMapKeys: []string{
"/",
"/exclude",
- "/exclude/index.css",
- "/exclude/index.html",
+ "/exclude/index-link.css",
+ "/exclude/index-link.html",
"/include",
"/include/index.css",
"/include/index.html",
@@ -128,7 +128,7 @@ func TestNew(t *testing.T) {
expMapKeys: []string{
"/",
"/exclude",
- "/exclude/index.js",
+ "/exclude/index-link.js",
"/include",
"/include/index.js",
"/index.js",
@@ -136,16 +136,14 @@ func TestNew(t *testing.T) {
}}
for _, c := range cases {
- t.Log(c.desc)
-
mfs, err := New(&c.opts)
if err != nil {
- test.Assert(t, "error", c.expErr, err.Error())
+ test.Assert(t, c.desc+": error", c.expErr, err.Error())
continue
}
gotListNames := mfs.ListNames()
- test.Assert(t, "names", c.expMapKeys, gotListNames)
+ test.Assert(t, c.desc+": names", c.expMapKeys, gotListNames)
}
}
@@ -251,15 +249,16 @@ func TestMemFS_Get(t *testing.T) {
path: "/exclude/dir",
expErr: os.ErrNotExist,
}, {
- path: "/exclude/index.css",
+ path: "/exclude/index-link.css",
expV: []byte("body {\n}\n"),
expContentType: []string{"text/css; charset=utf-8"},
}, {
- path: "/exclude/index.html",
+ path: "/exclude/index-link.html",
expV: []byte("<html></html>\n"),
expContentType: []string{"text/html; charset=utf-8"},
}, {
- path: "/exclude/index.js",
+ path: "/exclude/index-link.js",
+ expV: []byte("function X() {}\n"),
expContentType: []string{
"text/javascript; charset=utf-8",
"application/javascript",
@@ -279,6 +278,7 @@ func TestMemFS_Get(t *testing.T) {
expContentType: []string{"text/html; charset=utf-8"},
}, {
path: "/include/index.js",
+ expV: []byte("function X() {}\n"),
expContentType: []string{
"text/javascript; charset=utf-8",
"application/javascript",
@@ -316,16 +316,14 @@ func TestMemFS_Get(t *testing.T) {
}
for _, c := range cases {
- t.Logf("Get %s", c.path)
-
got, err := mfs.Get(c.path)
if err != nil {
- test.Assert(t, "error", c.expErr, err)
+ test.Assert(t, c.path+": error", c.expErr, err)
continue
}
if got.size <= opts.MaxFileSize {
- test.Assert(t, "node.V", c.expV, got.V)
+ test.Assert(t, c.path+": node.V", c.expV, got.V)
}
if len(got.ContentType) == 0 && len(c.expContentType) == 0 {
@@ -553,9 +551,9 @@ func TestMemFS_isIncluded(t *testing.T) {
filepath.Join(_testWD, "/testdata/exclude"),
filepath.Join(_testWD, "/testdata/exclude/dir"),
- filepath.Join(_testWD, "/testdata/exclude/index.css"),
- filepath.Join(_testWD, "/testdata/exclude/index.html"),
- filepath.Join(_testWD, "/testdata/exclude/index.js"),
+ filepath.Join(_testWD, "/testdata/exclude/index-link.css"),
+ filepath.Join(_testWD, "/testdata/exclude/index-link.html"),
+ filepath.Join(_testWD, "/testdata/exclude/index-link.js"),
filepath.Join(_testWD, "/testdata/include"),
filepath.Join(_testWD, "/testdata/include/dir"),
@@ -682,3 +680,13 @@ func TestMerge(t *testing.T) {
test.Assert(t, c.desc, c.exp.PathNodes.v, got.PathNodes.v)
}
}
+
+func TestScanDir(t *testing.T) {
+ opts := Options{
+ Root: "testdata/",
+ }
+ _, err := New(&opts)
+ if err != nil {
+ t.Fatal(err)
+ }
+}
diff --git a/lib/memfs/node.go b/lib/memfs/node.go
index 809df6cf..12d90340 100644
--- a/lib/memfs/node.go
+++ b/lib/memfs/node.go
@@ -62,6 +62,7 @@ func NewNode(parent *Node, fi os.FileInfo, maxFileSize int64) (node *Node, err e
}
var (
+ logp = "NewNode"
sysPath string
absPath string
)
@@ -92,14 +93,31 @@ func NewNode(parent *Node, fi os.FileInfo, maxFileSize int64) (node *Node, err e
return node, nil
}
+ // If the file is symbolic link, update the node size and mode based
+ // on original.
+ if fi.Mode()&os.ModeSymlink != 0 {
+ absPath, err := filepath.EvalSymlinks(sysPath)
+ if err != nil {
+ return nil, fmt.Errorf("%s: %w", logp, err)
+ }
+
+ fi, err = os.Lstat(absPath)
+ if err != nil {
+ return nil, fmt.Errorf("%s: %w", logp, err)
+ }
+
+ node.mode = fi.Mode()
+ node.size = fi.Size()
+ }
+
err = node.updateContent(maxFileSize)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("%s: %w", logp, err)
}
err = node.updateContentType()
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("%s: %w", logp, err)
}
return node, nil
diff --git a/lib/memfs/testdata/exclude/index.css b/lib/memfs/testdata/exclude/index-link.css
index 4d200efa..4d200efa 120000
--- a/lib/memfs/testdata/exclude/index.css
+++ b/lib/memfs/testdata/exclude/index-link.css
diff --git a/lib/memfs/testdata/exclude/index.html b/lib/memfs/testdata/exclude/index-link.html
index 79c5d6f0..79c5d6f0 120000
--- a/lib/memfs/testdata/exclude/index.html
+++ b/lib/memfs/testdata/exclude/index-link.html
diff --git a/lib/memfs/testdata/exclude/index.js b/lib/memfs/testdata/exclude/index-link.js
index e234193f..e234193f 120000
--- a/lib/memfs/testdata/exclude/index.js
+++ b/lib/memfs/testdata/exclude/index-link.js