🎨 Treat the renaming of tags, bookmarks and assets as a data history Replace operation https://github.com/siyuan-note/siyuan/issues/17407#issuecomment-4283539036

Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
Daniel 2026-04-21 08:51:52 +08:00
parent 1cb44c4d24
commit 464b72b24d
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
8 changed files with 46 additions and 38 deletions

View file

@ -787,7 +787,7 @@ func RemoveUnusedAssets() (ret []string) {
unusedAssets := UnusedAssets(false)
historyDir, err := GetHistoryDir(HistoryOpClean)
historyDir, err := getHistoryDir(HistoryOpClean)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
@ -857,7 +857,7 @@ func RemoveUnusedAsset(p string) (ret string) {
return absPath
}
historyDir, err := GetHistoryDir(HistoryOpClean)
historyDir, err := getHistoryDir(HistoryOpClean)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
@ -942,7 +942,11 @@ func RenameAsset(oldPath, newName string) (newPath string, err error) {
return
}
historyDir, err := getHistoryDir(HistoryOpReplace, time.Now())
historyDir, err := getHistoryDir(HistoryOpReplace)
if nil != err {
return
}
luteEngine := util.NewLute()
for _, notebook := range notebooks {
pages := pagedPaths(filepath.Join(util.DataDir, notebook.ID), 32)
@ -975,7 +979,7 @@ func RenameAsset(oldPath, newName string) (newPath string, err error) {
continue
}
generateTreeHistory(historyDir, tree)
generateTreeHistory(tree, historyDir)
treenode.UpsertBlockTree(tree)
sql.UpsertTreeQueue(tree)

View file

@ -56,7 +56,7 @@ func RemoveUnusedAttributeView(id string) {
return
}
historyDir, err := GetHistoryDir(HistoryOpClean)
historyDir, err := getHistoryDir(HistoryOpClean)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
@ -94,7 +94,7 @@ func RemoveUnusedAttributeViews() (ret []string) {
unusedAttributeViews := UnusedAttributeViews(false)
historyDir, err := GetHistoryDir(HistoryOpClean)
historyDir, err := getHistoryDir(HistoryOpClean)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
@ -3808,7 +3808,7 @@ func removeAttributeViewBlock(srcIDs []string, avID string, tx *Transaction) (er
refreshRelatedSrcAvs(avID, tx)
historyDir, err := GetHistoryDir(HistoryOpUpdate)
historyDir, err := getHistoryDir(HistoryOpUpdate)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return

View file

@ -22,7 +22,6 @@ import (
"path/filepath"
"sort"
"strings"
"time"
"github.com/88250/gulu"
"github.com/88250/lute/parse"
@ -36,6 +35,7 @@ import (
func RemoveBookmark(bookmark string) (err error) {
util.PushEndlessProgress(Conf.Language(116))
defer util.PushClearProgress()
bookmarks := sql.QueryBookmarkBlocks()
treeBlocks := map[string][]string{}
@ -47,13 +47,15 @@ func RemoveBookmark(bookmark string) (err error) {
}
}
historyDir, err := getHistoryDir(HistoryOpReplace, time.Now())
historyDir, err := getHistoryDir(HistoryOpReplace)
if nil != err {
return
}
for treeID, blocks := range treeBlocks {
util.PushEndlessProgress("[" + treeID + "]")
tree, e := LoadTreeByBlockID(treeID)
if nil != e {
util.PushClearProgress()
return e
}
@ -72,7 +74,7 @@ func RemoveBookmark(bookmark string) (err error) {
}
if changed {
generateTreeHistory(historyDir, tree)
generateTreeHistory(tree, historyDir)
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(111), util.EscapeHTML(tree.Root.IALAttr("title"))))
if err = writeTreeUpsertQueue(tree); err != nil {
util.ClearPushProgress(100)
@ -105,6 +107,7 @@ func RenameBookmark(oldBookmark, newBookmark string) (err error) {
}
util.PushEndlessProgress(Conf.Language(110))
defer util.ClearPushProgress(100)
bookmarks := sql.QueryBookmarkBlocks()
treeBlocks := map[string][]string{}
@ -116,12 +119,15 @@ func RenameBookmark(oldBookmark, newBookmark string) (err error) {
}
}
historyDir, err := getHistoryDir(HistoryOpReplace, time.Now())
historyDir, err := getHistoryDir(HistoryOpReplace)
if nil != err {
return
}
for treeID, blocks := range treeBlocks {
util.PushEndlessProgress("[" + treeID + "]")
tree, e := LoadTreeByBlockID(treeID)
if nil != e {
util.ClearPushProgress(100)
return e
}
@ -140,7 +146,7 @@ func RenameBookmark(oldBookmark, newBookmark string) (err error) {
}
if changed {
generateTreeHistory(historyDir, tree)
generateTreeHistory(tree, historyDir)
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(111), util.EscapeHTML(tree.Root.IALAttr("title"))))
if err = writeTreeUpsertQueue(tree); err != nil {
util.ClearPushProgress(100)

View file

@ -1565,7 +1565,7 @@ func removeDoc(box *Box, p string, luteEngine *lute.Lute) (ret *parse.Tree) {
return
}
historyDir, err := GetHistoryDir(HistoryOpDelete)
historyDir, err := getHistoryDir(HistoryOpDelete)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return

View file

@ -633,7 +633,7 @@ func generateAssetsHistory() {
return
}
historyDir, err := GetHistoryDir(HistoryOpUpdate)
historyDir, err := getHistoryDir(HistoryOpUpdate)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
@ -662,7 +662,7 @@ func (box *Box) generateDocHistory0() {
return
}
historyDir, err := GetHistoryDir(HistoryOpUpdate)
historyDir, err := getHistoryDir(HistoryOpUpdate)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
@ -820,23 +820,21 @@ const (
)
func generateOpTypeHistory(tree *parse.Tree, opType string) {
historyDir, err := GetHistoryDir(opType)
historyDir, err := getHistoryDir(opType)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
}
if err = generateTreeHistory(historyDir, tree); err != nil {
return
}
generateTreeHistory(tree, historyDir)
generateAvHistoryInTree(tree, historyDir)
indexHistoryDir(filepath.Base(historyDir), util.NewLute())
}
func generateTreeHistory(historyDir string, tree *parse.Tree) (err error) {
func generateTreeHistory(tree *parse.Tree, historyDir string) {
historyPath := filepath.Join(historyDir, tree.Box, tree.Path)
var err error
if err = os.MkdirAll(filepath.Dir(historyPath), 0755); err != nil {
logging.LogErrorf("generate history failed: %s", err)
return
@ -866,12 +864,8 @@ func generateAvHistoryInTree(tree *parse.Tree, historyDir string) {
}
}
func GetHistoryDir(suffix string) (ret string, err error) {
return getHistoryDir(suffix, time.Now())
}
func getHistoryDir(suffix string, t time.Time) (ret string, err error) {
ret = filepath.Join(util.HistoryDir, t.Format("2006-01-02-150405")+"-"+suffix)
func getHistoryDir(suffix string) (ret string, err error) {
ret = filepath.Join(util.HistoryDir, time.Now().Format("2006-01-02-150405")+"-"+suffix)
if err = os.MkdirAll(ret, 0755); err != nil {
logging.LogErrorf("make history dir failed: %s", err)
return

View file

@ -138,7 +138,7 @@ func RemoveBox(boxID string) (err error) {
if !isUserGuide {
var historyDir string
historyDir, err = GetHistoryDir(HistoryOpDelete)
historyDir, err = getHistoryDir(HistoryOpDelete)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return

View file

@ -513,9 +513,8 @@ func FindReplace(keyword, replacement string, replaceTypes map[string]bool, ids
renameRootTitles := map[string]string{}
cachedTrees := map[string]*parse.Tree{}
historyDir, err := getHistoryDir(HistoryOpReplace, time.Now())
historyDir, err := getHistoryDir(HistoryOpReplace)
if err != nil {
logging.LogErrorf("get history dir failed: %s", err)
return
}
@ -543,7 +542,7 @@ func FindReplace(keyword, replacement string, replaceTypes map[string]bool, ids
continue
}
generateTreeHistory(historyDir, tree)
generateTreeHistory(tree, historyDir)
cachedTrees[bt.RootID] = tree
}

View file

@ -22,7 +22,6 @@ import (
"path/filepath"
"sort"
"strings"
"time"
"github.com/88250/gulu"
"github.com/88250/lute/ast"
@ -49,7 +48,10 @@ func RemoveTag(label string) (err error) {
var reloadTreeIDs []string
updateNodes := map[string]*ast.Node{}
historyDir, err := getHistoryDir(HistoryOpReplace, time.Now())
historyDir, err := getHistoryDir(HistoryOpReplace)
if nil != err {
return
}
for treeID, blocks := range treeBlocks {
util.PushEndlessProgress("[" + treeID + "]")
@ -59,7 +61,7 @@ func RemoveTag(label string) (err error) {
return e
}
generateTreeHistory(historyDir, tree)
generateTreeHistory(tree, historyDir)
var unlinks []*ast.Node
for _, blockID := range blocks {
@ -153,7 +155,10 @@ func RenameTag(oldLabel, newLabel string) (err error) {
var reloadTreeIDs []string
updateNodes := map[string]*ast.Node{}
historyDir, err := getHistoryDir(HistoryOpReplace, time.Now())
historyDir, err := getHistoryDir(HistoryOpReplace)
if nil != err {
return
}
for treeID, blocks := range treeBlocks {
util.PushEndlessProgress("[" + treeID + "]")
@ -163,7 +168,7 @@ func RenameTag(oldLabel, newLabel string) (err error) {
return e
}
generateTreeHistory(historyDir, tree)
generateTreeHistory(tree, historyDir)
for _, blockID := range blocks {
node := treenode.GetNodeInTree(tree, blockID)