aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-08-31 02:08:29 +0700
committerShulhan <ms@kilabit.info>2022-08-31 02:08:29 +0700
commitdcd3c7c73ca392fed1bfb0de16014ee7ab6fb5a7 (patch)
tree421a695c5e4152525b82491b9270b00c143b6404
parenta2f45e834763305b416d78406066764899bf0f7c (diff)
downloadpakakeh.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.
-rw-r--r--lib/memfs/internal/test/embed/embed_test.go10
-rw-r--r--lib/memfs/memfs.go34
-rw-r--r--lib/memfs/node.go30
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)