diff options
| author | Shulhan <ms@kilabit.info> | 2021-08-22 16:46:17 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2021-08-22 17:13:31 +0700 |
| commit | 5bca3ea57f88359c10cfc086dab472573f63341d (patch) | |
| tree | 01ac26bafeb6ece96a1d9c5bac4646b78d97fca6 | |
| parent | e427fe4fe530de6dc750375f8ff6fad891f65567 (diff) | |
| download | pakakeh.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.go | 42 | ||||
| -rw-r--r-- | lib/memfs/generate_test/memfs_generate_test.go | 20 | ||||
| -rw-r--r-- | lib/memfs/memfs.go | 13 | ||||
| -rw-r--r-- | lib/memfs/memfs_example_test.go | 2 | ||||
| -rw-r--r-- | lib/memfs/memfs_test.go | 48 | ||||
| -rw-r--r-- | lib/memfs/node.go | 22 | ||||
| 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 |
