diff --git a/kernel/model/file.go b/kernel/model/file.go index 3ee39650d..95e642572 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1093,9 +1093,24 @@ func DuplicateDoc(tree *parse.Tree) { msgId := util.PushMsg(Conf.Language(116), 30000) defer util.PushClearMsg(msgId) - resetTree(tree, "Duplicated") + previousID := tree.Root.ID + resetTree(tree, "Duplicated", false) createTreeTx(tree) WaitForWritingFiles() + + // 复制为副本时将该副本块插入到数据库中 https://github.com/siyuan-note/siyuan/issues/11959 + avs := tree.Root.IALAttr(av.NodeAttrNameAvs) + for _, avID := range strings.Split(avs, ",") { + if !ast.IsNodeIDPattern(avID) { + continue + } + + AddAttributeViewBlock(nil, []map[string]interface{}{{ + "id": tree.Root.ID, + "isDetached": false, + }}, avID, "", previousID, false) + util.PushReloadAttrView(avID) + } return } diff --git a/kernel/model/index_fix.go b/kernel/model/index_fix.go index fe6ff34d5..d5e76354b 100644 --- a/kernel/model/index_fix.go +++ b/kernel/model/index_fix.go @@ -268,7 +268,7 @@ func recreateTree(tree *parse.Tree, absPath string) { treenode.RemoveBlockTreesByPathPrefix(strings.TrimSuffix(tree.Path, ".sy")) treenode.RemoveBlockTreesByRootID(tree.ID) - resetTree(tree, "") + resetTree(tree, "", true) if err := filesys.WriteTree(tree); nil != err { logging.LogWarnf("write tree [%s] failed: %s", tree.Path, err) return diff --git a/kernel/model/repository.go b/kernel/model/repository.go index 1e336f8c4..c54ad2c0b 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -1380,7 +1380,7 @@ func processSyncMergeResult(exit, byHand bool, mergeResult *dejavu.MergeResult, tree.Box = boxID tree.Path = strings.TrimPrefix(file.Path, "/"+boxID) - resetTree(tree, "Conflicted") + resetTree(tree, "Conflicted", true) createTreeTx(tree) } diff --git a/kernel/model/tree.go b/kernel/model/tree.go index e90e79c93..87d79d303 100644 --- a/kernel/model/tree.go +++ b/kernel/model/tree.go @@ -39,7 +39,7 @@ import ( "golang.org/x/time/rate" ) -func resetTree(tree *parse.Tree, titleSuffix string) { +func resetTree(tree *parse.Tree, titleSuffix string, removeAvBinding bool) { tree.ID = ast.NewNodeID() tree.Root.ID = tree.ID @@ -121,8 +121,10 @@ func resetTree(tree *parse.Tree, titleSuffix string) { return ast.WalkContinue }) - // 清空文档绑定的数据库 - tree.Root.RemoveIALAttr(av.NodeAttrNameAvs) + if removeAvBinding { + // 清空文档绑定的数据库 + tree.Root.RemoveIALAttr(av.NodeAttrNameAvs) + } } func pagedPaths(localPath string, pageSize int) (ret map[int][]string) {