From 825283f75c4c9d7da2cd03526de19a25bb83b618 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Fri, 19 Apr 2019 13:00:20 +0700 Subject: memfs: refresh the directory tree in Development mode if page not found If the program run in Development mode, any request URL that does not exist in mapped path will trigger the memfs to rescan the directory structure. --- lib/memfs/memfs.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/lib/memfs/memfs.go b/lib/memfs/memfs.go index cb196a6f..8ca0ced0 100644 --- a/lib/memfs/memfs.go +++ b/lib/memfs/memfs.go @@ -93,6 +93,14 @@ func New(includes, excludes []string, withContent bool) (*MemFS, error) { func (mfs *MemFS) Get(path string) (node *Node, err error) { node = mfs.pn.Get(path) if node == nil { + if Development { + node, err = mfs.refresh(path) + if err != nil { + log.Println("lib/memfs: Get: " + err.Error()) + return nil, os.ErrNotExist + } + return node, nil + } return nil, os.ErrNotExist } @@ -370,3 +378,38 @@ func (mfs *MemFS) pruneEmptyDirs() { delete(mfs.pn.v, k) } } + +// +// refresh the tree by rescanning from the root. +// +func (mfs *MemFS) refresh(url string) (node *Node, err error) { + syspath := filepath.Join(mfs.root.SysPath, url) + + _, err = os.Stat(syspath) + if err != nil { + return nil, err + } + + // Path exist on file system, try to refresh directory. + f, err := os.Open(mfs.root.SysPath) + if err != nil { + return nil, err + } + + err = mfs.scanDir(mfs.root, f) + if err != nil { + return nil, err + } + + err = f.Close() + if err != nil { + return nil, err + } + + node = mfs.pn.Get(url) + if node == nil { + return nil, os.ErrNotExist + } + + return node, nil +} -- cgit v1.3