From dcd3c7c73ca392fed1bfb0de16014ee7ab6fb5a7 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Wed, 31 Aug 2022 02:08:29 +0700 Subject: lib/memfs: simplify checking for symlink Instead of calling filepath.EvalSymlink and Lstat, call os.Stat directly to the symlink system path. This also fix the modTime not currently set to the original file when creating Node from symlink-ed file. --- lib/memfs/internal/test/embed/embed_test.go | 10 ++++----- lib/memfs/memfs.go | 34 ++++++++++------------------- lib/memfs/node.go | 30 +++++++++---------------- 3 files changed, 27 insertions(+), 47 deletions(-) (limited to 'lib') diff --git a/lib/memfs/internal/test/embed/embed_test.go b/lib/memfs/internal/test/embed/embed_test.go index 9ad68920..f36f5638 100644 --- a/lib/memfs/internal/test/embed/embed_test.go +++ b/lib/memfs/internal/test/embed/embed_test.go @@ -16,7 +16,7 @@ func generate_testdata() *memfs.Node { GenFuncName: "generate_testdata", } node.SetMode(2147484141) - node.SetModTimeUnix(1633772772, 881353676) + node.SetModTimeUnix(1661878911, 219020749) node.SetName("/") node.SetSize(0) node.AddChild(_memFS_getNode(memFS, "/direct", generate_testdata_direct)) @@ -116,7 +116,7 @@ func generate_testdata_exclude_index_link_css() *memfs.Node { Content: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1633792794, 467899662) + node.SetModTimeUnix(1562038157, 0) node.SetName("index-link.css") node.SetSize(9) return node @@ -131,7 +131,7 @@ func generate_testdata_exclude_index_link_html() *memfs.Node { Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1633792794, 467899662) + node.SetModTimeUnix(1588592347, 0) node.SetName("index-link.html") node.SetSize(14) return node @@ -146,7 +146,7 @@ func generate_testdata_exclude_index_link_js() *memfs.Node { Content: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1633792794, 467899662) + node.SetModTimeUnix(1562038157, 0) node.SetName("index-link.js") node.SetSize(16) return node @@ -193,7 +193,7 @@ func generate_testdata_include_index_html() *memfs.Node { Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1588592346, 0) + node.SetModTimeUnix(1588592347, 0) node.SetName("index.html") node.SetSize(14) return node diff --git a/lib/memfs/memfs.go b/lib/memfs/memfs.go index 019ffb33..f0f3e5bd 100644 --- a/lib/memfs/memfs.go +++ b/lib/memfs/memfs.go @@ -475,10 +475,9 @@ func (mfs *MemFS) isExcluded(sysPath string, mode os.FileMode) bool { // pass the list of Includes regexp or no filter defined. func (mfs *MemFS) isIncluded(sysPath string, mode os.FileMode) bool { var ( - re *regexp.Regexp - fi os.FileInfo - absPath string - err error + re *regexp.Regexp + fi os.FileInfo + err error ) if len(mfs.incRE) == 0 { @@ -490,26 +489,17 @@ func (mfs *MemFS) isIncluded(sysPath string, mode os.FileMode) bool { return true } } - if mode&os.ModeSymlink == 0 { - // If file is NOT a symlink and its a directory, include it. - return mode.IsDir() - } - - // File is symlink, get the real FileInfo to check if its - // directory or not. - absPath, err = filepath.EvalSymlinks(sysPath) - if err != nil { - return false + if mode&os.ModeSymlink == os.ModeSymlink { + // File is symlink, get the real FileInfo to check if its + // directory or not. + fi, err = os.Stat(sysPath) + if err != nil { + return false + } + mode = fi.Mode() } - fi, err = os.Lstat(absPath) - if err != nil { - return false - } - if fi.IsDir() { - return true - } - return false + return mode.IsDir() } // isWatched will return true if the system path is filtered to be watched. diff --git a/lib/memfs/node.go b/lib/memfs/node.go index 0520a044..76720f66 100644 --- a/lib/memfs/node.go +++ b/lib/memfs/node.go @@ -89,39 +89,29 @@ func NewNode(parent *Node, fi os.FileInfo, maxFileSize int64) (node *Node, err e SysPath: sysPath, Path: relPath, name: fi.Name(), - modTime: fi.ModTime(), - mode: fi.Mode(), - size: fi.Size(), Parent: parent, } node.generateFuncName(sysPath) - if node.mode.IsDir() { - node.size = 0 - return node, nil - } - // If the file is symbolic link, update the node size and mode based // on original. - if fi.Mode()&os.ModeSymlink != 0 { - sysPath, err = filepath.EvalSymlinks(sysPath) + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + fi, err = os.Stat(sysPath) if err != nil { return nil, fmt.Errorf("%s: %w", logp, err) } + } - fi, err = os.Lstat(sysPath) - if err != nil { - return nil, fmt.Errorf("%s: %w", logp, err) - } + node.mode = fi.Mode() + node.modTime = fi.ModTime() - node.mode = fi.Mode() - if node.mode.IsDir() { - node.size = 0 - return node, nil - } - node.size = fi.Size() + if node.mode.IsDir() { + node.size = 0 + return node, nil } + node.size = fi.Size() + err = node.updateContent(maxFileSize) if err != nil { return nil, fmt.Errorf("%s: %w", logp, err) -- cgit v1.3