aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2019-04-19 13:00:20 +0700
committerShulhan <ms@kilabit.info>2019-04-19 13:04:27 +0700
commit825283f75c4c9d7da2cd03526de19a25bb83b618 (patch)
tree531a286d9944280fc38f138c1e506581082a230a
parent0b97e1df89d27dac0f8f35112a6d7ee0ac607b51 (diff)
downloadpakakeh.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.go43
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
+}