diff --git a/kernel/filesys/tree.go b/kernel/filesys/tree.go index 7372a9f43..7afec220d 100644 --- a/kernel/filesys/tree.go +++ b/kernel/filesys/tree.go @@ -64,23 +64,33 @@ func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err erro hPathBuilder := bytes.Buffer{} hPathBuilder.WriteString("/") for i, _ := range parts { - var parentPath string + var parentAbsPath string if 0 < i { - parentPath = strings.Join(parts[:i+1], "/") + parentAbsPath = strings.Join(parts[:i+1], "/") } else { - parentPath = parts[0] + parentAbsPath = parts[0] } - parentPath += ".sy" - parentPath = filepath.Join(util.DataDir, boxID, parentPath) - parentData, readErr := filelock.ReadFile(parentPath) + parentAbsPath += ".sy" + parentPath := parentAbsPath + parentAbsPath = filepath.Join(util.DataDir, boxID, parentAbsPath) + parentData, readErr := filelock.ReadFile(parentAbsPath) if nil != readErr { - logging.LogWarnf("read parent tree data [%s] failed: %s", parentPath, readErr) + if os.IsNotExist(readErr) { + parentTree := treenode.NewTree(boxID, parentPath, hPathBuilder.String()+"Untitled", "Untitled") + if writeErr := WriteTree(parentTree); nil != writeErr { + logging.LogErrorf("rebuild parent tree [%s] failed: %s", parentAbsPath, writeErr) + } else { + logging.LogInfof("rebuilt parent tree [%s]", parentAbsPath) + } + } else { + logging.LogWarnf("read parent tree data [%s] failed: %s", parentAbsPath, readErr) + } hPathBuilder.WriteString("Untitled/") continue } parentTree, parseErr := parse.ParseJSONWithoutFix(parentData, luteEngine.ParseOptions) if nil != parseErr { - logging.LogWarnf("parse parent tree [%s] failed: %s", parentPath, parseErr) + logging.LogWarnf("parse parent tree [%s] failed: %s", parentAbsPath, parseErr) hPathBuilder.WriteString("Untitled/") continue } diff --git a/kernel/treenode/tree.go b/kernel/treenode/tree.go index 22f9ba950..85d79fa0c 100644 --- a/kernel/treenode/tree.go +++ b/kernel/treenode/tree.go @@ -76,6 +76,7 @@ func NewTree(boxID, p, hp, title string) *parse.Tree { ret.Box = boxID ret.Path = p ret.HPath = hp + ret.Root.Spec = "1" newPara := &ast.Node{Type: ast.NodeParagraph, ID: ast.NewNodeID()} newPara.SetIALAttr("id", newPara.ID) newPara.SetIALAttr("updated", util.TimeFromID(newPara.ID))