diff options
| author | Shulhan <ms@kilabit.info> | 2022-08-31 02:08:29 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2022-08-31 02:08:29 +0700 |
| commit | dcd3c7c73ca392fed1bfb0de16014ee7ab6fb5a7 (patch) | |
| tree | 421a695c5e4152525b82491b9270b00c143b6404 /lib/memfs | |
| parent | a2f45e834763305b416d78406066764899bf0f7c (diff) | |
| download | pakakeh.go-dcd3c7c73ca392fed1bfb0de16014ee7ab6fb5a7.tar.xz | |
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.
Diffstat (limited to 'lib/memfs')
| -rw-r--r-- | lib/memfs/internal/test/embed/embed_test.go | 10 | ||||
| -rw-r--r-- | lib/memfs/memfs.go | 34 | ||||
| -rw-r--r-- | lib/memfs/node.go | 30 |
3 files changed, 27 insertions, 47 deletions
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) |
