diff options
| author | Shulhan <ms@kilabit.info> | 2019-04-19 13:00:20 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2019-04-19 13:04:27 +0700 |
| commit | 825283f75c4c9d7da2cd03526de19a25bb83b618 (patch) | |
| tree | 531a286d9944280fc38f138c1e506581082a230a | |
| parent | 0b97e1df89d27dac0f8f35112a6d7ee0ac607b51 (diff) | |
| download | pakakeh.go-825283f75c4c9d7da2cd03526de19a25bb83b618.tar.xz | |
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.
| -rw-r--r-- | lib/memfs/memfs.go | 43 |
1 files changed, 43 insertions, 0 deletions
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 +} |
