From 540faa754c6795d94796d11c625bc16185f3304e Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 28 Apr 2024 21:14:48 +0800 Subject: [PATCH] :art: Data History - File history - Assets support `update` operation indexing https://github.com/siyuan-note/siyuan/issues/11177 --- kernel/model/history.go | 57 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/kernel/model/history.go b/kernel/model/history.go index bd66e0207..d202c8548 100644 --- a/kernel/model/history.go +++ b/kernel/model/history.go @@ -69,7 +69,8 @@ func generateFileHistory() { box.generateDocHistory0() } - // 目前没有生成资源文件历史 https://github.com/siyuan-note/siyuan/issues/11177 + // 生成资源文件历史 + generateAssetsHistory() historyDir := util.HistoryDir clearOutdatedHistoryDir(historyDir) @@ -478,6 +479,35 @@ func GetNotebookHistory() (ret []*History, err error) { return } +func generateAssetsHistory() { + files := recentModifiedAssets() + if 1 > len(files) { + return + } + + historyDir, err := GetHistoryDir(HistoryOpUpdate) + if nil != err { + logging.LogErrorf("get history dir failed: %s", err) + return + } + + for _, file := range files { + historyPath := filepath.Join(historyDir, "assets", strings.TrimPrefix(file, filepath.Join(util.DataDir, "assets"))) + if err = os.MkdirAll(filepath.Dir(historyPath), 0755); nil != err { + logging.LogErrorf("generate history failed: %s", err) + return + } + + if err = filelock.Copy(file, historyPath); nil != err { + logging.LogErrorf("copy file [%s] to [%s] failed: %s", file, historyPath, err) + return + } + } + + indexHistoryDir(filepath.Base(historyDir), util.NewLute()) + return +} + func (box *Box) generateDocHistory0() { files := box.recentModifiedDocs() if 1 > len(files) { @@ -596,6 +626,31 @@ func (box *Box) recentModifiedDocs() (ret []string) { return } +var ( + assetsUpdated = map[string]int64{} +) + +func recentModifiedAssets() (ret []string) { + filelock.Walk(filepath.Join(util.DataDir, "assets"), func(path string, info fs.FileInfo, err error) error { + if nil == info { + return nil + } + + if info.IsDir() { + return nil + } + + updated := info.ModTime().Unix() + oldUpdated, ok := assetsUpdated[path] + if ok && updated > oldUpdated { + ret = append(ret, path) + } + assetsUpdated[path] = updated + return nil + }) + return +} + const ( HistoryOpClean = "clean" HistoryOpUpdate = "update"