diff --git a/kernel/api/asset.go b/kernel/api/asset.go index 5988f98ae..e8514cb4d 100644 --- a/kernel/api/asset.go +++ b/kernel/api/asset.go @@ -18,7 +18,6 @@ package api import ( "net/http" - "os" "path/filepath" "strings" @@ -153,12 +152,12 @@ func getFileAnnotation(c *gin.Context) { ret.Data = map[string]interface{}{"closeTimeout": 5000} return } - if !gulu.File.IsExist(readPath) { + if !filelock.IsExist(readPath) { ret.Code = 1 return } - data, err := os.ReadFile(readPath) + data, err := filelock.ReadFile(readPath) if nil != err { ret.Code = -1 ret.Msg = err.Error() diff --git a/kernel/api/file.go b/kernel/api/file.go index 56a9ddf88..fb8db6f64 100644 --- a/kernel/api/file.go +++ b/kernel/api/file.go @@ -204,28 +204,21 @@ func renameFile(c *gin.Context) { filePath := arg["path"].(string) filePath = filepath.Join(util.WorkspaceDir, filePath) - _, err := os.Stat(filePath) - if os.IsNotExist(err) { + if !filelock.IsExist(filePath) { ret.Code = 404 - ret.Msg = err.Error() - return - } - if nil != err { - logging.LogErrorf("stat [%s] failed: %s", filePath, err) - ret.Code = 500 - ret.Msg = err.Error() + ret.Msg = "the [path] file or directory does not exist" return } newPath := arg["newPath"].(string) newPath = filepath.Join(util.WorkspaceDir, newPath) - if gulu.File.IsExist(newPath) { + if filelock.IsExist(newPath) { ret.Code = 409 ret.Msg = "the [newPath] file or directory already exists" return } - if err = filelock.Rename(filePath, newPath); nil != err { + if err := filelock.Rename(filePath, newPath); nil != err { logging.LogErrorf("rename file [%s] to [%s] failed: %s", filePath, newPath, err) ret.Code = 500 ret.Msg = err.Error() diff --git a/kernel/av/av.go b/kernel/av/av.go index 0b87967ae..cf1419a62 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -586,7 +586,7 @@ func NewAttributeView(id string) (ret *AttributeView) { func ParseAttributeView(avID string) (ret *AttributeView, err error) { avJSONPath := GetAttributeViewDataPath(avID) - if !gulu.File.IsExist(avJSONPath) { + if !filelock.IsExist(avJSONPath) { err = ErrViewNotFound return } diff --git a/kernel/av/mirror.go b/kernel/av/mirror.go index 215e52b7e..12675c946 100644 --- a/kernel/av/mirror.go +++ b/kernel/av/mirror.go @@ -21,7 +21,7 @@ func GetMirrorBlockIDs(avID string) []string { defer attributeViewBlocksLock.Unlock() blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") - if !gulu.File.IsExist(blocks) { + if !filelock.IsExist(blocks) { return nil } @@ -46,7 +46,7 @@ func IsMirror(avID string) bool { defer attributeViewBlocksLock.Unlock() blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") - if !gulu.File.IsExist(blocks) { + if !filelock.IsExist(blocks) { return false } @@ -71,7 +71,7 @@ func RemoveBlockRel(avID, blockID string) { defer attributeViewBlocksLock.Unlock() blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") - if !gulu.File.IsExist(blocks) { + if !filelock.IsExist(blocks) { return } @@ -117,7 +117,7 @@ func UpsertBlockRel(avID, blockID string) { avBlocks := map[string][]string{} blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") - if !gulu.File.IsExist(blocks) { + if !filelock.IsExist(blocks) { if err := os.MkdirAll(filepath.Dir(blocks), 0755); nil != err { logging.LogErrorf("create attribute view dir failed: %s", err) return diff --git a/kernel/bazaar/package.go b/kernel/bazaar/package.go index 6b9101cf4..9c238f3d4 100644 --- a/kernel/bazaar/package.go +++ b/kernel/bazaar/package.go @@ -241,11 +241,11 @@ func getPreferredFunding(funding *Funding) string { func PluginJSON(pluginDirName string) (ret *Plugin, err error) { p := filepath.Join(util.DataDir, "plugins", pluginDirName, "plugin.json") - if !gulu.File.IsExist(p) { + if !filelock.IsExist(p) { err = os.ErrNotExist return } - data, err := os.ReadFile(p) + data, err := filelock.ReadFile(p) if nil != err { logging.LogErrorf("read plugin.json [%s] failed: %s", p, err) return @@ -261,11 +261,11 @@ func PluginJSON(pluginDirName string) (ret *Plugin, err error) { func WidgetJSON(widgetDirName string) (ret *Widget, err error) { p := filepath.Join(util.DataDir, "widgets", widgetDirName, "widget.json") - if !gulu.File.IsExist(p) { + if !filelock.IsExist(p) { err = os.ErrNotExist return } - data, err := os.ReadFile(p) + data, err := filelock.ReadFile(p) if nil != err { logging.LogErrorf("read widget.json [%s] failed: %s", p, err) return @@ -301,11 +301,11 @@ func IconJSON(iconDirName string) (ret *Icon, err error) { func TemplateJSON(templateDirName string) (ret *Template, err error) { p := filepath.Join(util.DataDir, "templates", templateDirName, "template.json") - if !gulu.File.IsExist(p) { + if !filelock.IsExist(p) { err = os.ErrNotExist return } - data, err := os.ReadFile(p) + data, err := filelock.ReadFile(p) if nil != err { logging.LogErrorf("read template.json [%s] failed: %s", p, err) return diff --git a/kernel/go.mod b/kernel/go.mod index 7cb0271fb..868c568b7 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -50,19 +50,19 @@ require ( github.com/siyuan-note/dejavu v0.0.0-20231031012159-d985a65825cf github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75 github.com/siyuan-note/eventbus v0.0.0-20230804030110-cf250f838c80 - github.com/siyuan-note/filelock v0.0.0-20231030092426-0ff158f5f8ca + github.com/siyuan-note/filelock v0.0.0-20231106131407-1cd9e9a9230c github.com/siyuan-note/httpclient v0.0.0-20231028070852-3c2c5a151c13 github.com/siyuan-note/logging v0.0.0-20231030034701-8265764f00ff - github.com/siyuan-note/riff v0.0.0-20230928143458-ffd178c7e0fc + github.com/siyuan-note/riff v0.0.0-20231106140614-c67ff0c69e33 github.com/steambap/captcha v1.4.1 github.com/studio-b12/gowebdav v0.9.0 - github.com/vmihailenco/msgpack/v5 v5.4.0 + github.com/vmihailenco/msgpack/v5 v5.4.1 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 github.com/xuri/excelize/v2 v2.8.0 golang.org/x/image v0.12.0 golang.org/x/mobile v0.0.0-20230901161150-52620a4a7557 golang.org/x/mod v0.13.0 - golang.org/x/text v0.13.0 + golang.org/x/text v0.14.0 ) require ( @@ -158,7 +158,7 @@ require ( golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect golang.org/x/tools v0.14.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/kernel/go.sum b/kernel/go.sum index 29364195e..292841d87 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -344,14 +344,14 @@ github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75 h1:Bi7/7f29 github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75/go.mod h1:H8fyqqAbp9XreANjeSbc72zEdFfKTXYN34tc1TjZwtw= github.com/siyuan-note/eventbus v0.0.0-20230804030110-cf250f838c80 h1:XghjHKJd+SiL0DkGYFVC+UGUDFtnR4v9gkAbPeh9Eq8= github.com/siyuan-note/eventbus v0.0.0-20230804030110-cf250f838c80/go.mod h1:Sqo4FYX5lAXu7gWkbEdJF0e6P57tNNVV4WDKYDctokI= -github.com/siyuan-note/filelock v0.0.0-20231030092426-0ff158f5f8ca h1:e0+lU1gxFXV+SOjuce4H2QH9VNfAibXbPyuU+dlC4wk= -github.com/siyuan-note/filelock v0.0.0-20231030092426-0ff158f5f8ca/go.mod h1:H735iw2ycTmG31yNWu4/zEzFtYUSTTcY3DPEV8y98IQ= +github.com/siyuan-note/filelock v0.0.0-20231106131407-1cd9e9a9230c h1:thK+FFmQEGHjVxpTCM7BAlbEQ9HD71nzR92rV/bgZYA= +github.com/siyuan-note/filelock v0.0.0-20231106131407-1cd9e9a9230c/go.mod h1:HjtfP1NLDw53BRSeAPJgZDIGqyxi4bANYn1IhgDCQUY= github.com/siyuan-note/httpclient v0.0.0-20231028070852-3c2c5a151c13 h1:DQwiRQa63wsjSKQN5TvTWI2Dd5XSulhnXvxIdOG8/x8= github.com/siyuan-note/httpclient v0.0.0-20231028070852-3c2c5a151c13/go.mod h1:mS0nX5fX99R/5HLnKqG40kpbathSCXxL/oxe88rURNI= github.com/siyuan-note/logging v0.0.0-20231030034701-8265764f00ff h1:5GcxrTOJTsusXOLhg4GuHWbEa4M5gu+CNfL0giwNjDM= github.com/siyuan-note/logging v0.0.0-20231030034701-8265764f00ff/go.mod h1:6mRFtAAvYPn3cDzqvyv+t8BVPGqpONDMMb5ywOhY1D4= -github.com/siyuan-note/riff v0.0.0-20230928143458-ffd178c7e0fc h1:EDbkzdLfR+gMYyU4h/xUiwxngz75d3L5M0IN0NTqdVU= -github.com/siyuan-note/riff v0.0.0-20230928143458-ffd178c7e0fc/go.mod h1:WxG165xAPeGok0Q/15KMhnNbesoU5ZG+/zikTyWzZi8= +github.com/siyuan-note/riff v0.0.0-20231106140614-c67ff0c69e33 h1:oEJoBL0ZSDwKckZcS37zMuIsPplTnN1aHz+04700P2o= +github.com/siyuan-note/riff v0.0.0-20231106140614-c67ff0c69e33/go.mod h1:Y1kKl2ZTGKovrs+/4k/4OteHpF04XbgJ+MsnLetP8Jk= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY= @@ -393,8 +393,8 @@ github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95 github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/vmihailenco/msgpack/v5 v5.4.0 h1:hRM0digJwyR6vll33NNAwCFguy5JuBD6jxDmQP3l608= -github.com/vmihailenco/msgpack/v5 v5.4.0/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/wmentor/html v1.0.1 h1:iIuDyH7pohHMMzdD5WQhvya5UyIecFDWTYzdM873Ook= @@ -484,8 +484,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -506,8 +506,9 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/kernel/model/assets.go b/kernel/model/assets.go index 7d148a95c..89ebf1810 100644 --- a/kernel/model/assets.go +++ b/kernel/model/assets.go @@ -440,7 +440,7 @@ func RemoveUnusedAssets() (ret []string) { var hashes []string for _, p := range unusedAssets { historyPath := filepath.Join(historyDir, p) - if p = filepath.Join(util.DataDir, p); gulu.File.IsExist(p) { + if p = filepath.Join(util.DataDir, p); filelock.IsExist(p) { if err = filelock.Copy(p, historyPath); nil != err { return } @@ -453,7 +453,7 @@ func RemoveUnusedAssets() (ret []string) { sql.BatchRemoveAssetsQueue(hashes) for _, unusedAsset := range unusedAssets { - if unusedAsset = filepath.Join(util.DataDir, unusedAsset); gulu.File.IsExist(unusedAsset) { + if unusedAsset = filepath.Join(util.DataDir, unusedAsset); filelock.IsExist(unusedAsset) { if err := os.RemoveAll(unusedAsset); nil != err { logging.LogErrorf("remove unused asset [%s] failed: %s", unusedAsset, err) } @@ -471,7 +471,7 @@ func RemoveUnusedAssets() (ret []string) { func RemoveUnusedAsset(p string) (ret string) { absPath := filepath.Join(util.DataDir, p) - if !gulu.File.IsExist(absPath) { + if !filelock.IsExist(absPath) { return absPath } @@ -483,7 +483,7 @@ func RemoveUnusedAsset(p string) (ret string) { newP := strings.TrimPrefix(absPath, util.DataDir) historyPath := filepath.Join(historyDir, newP) - if gulu.File.IsExist(absPath) { + if filelock.IsExist(absPath) { if err = filelock.Copy(absPath, historyPath); nil != err { return } @@ -528,7 +528,7 @@ func RenameAsset(oldPath, newName string) (err error) { return } - if gulu.File.IsExist(filepath.Join(util.DataDir, oldPath+".sya")) { + if filelock.IsExist(filepath.Join(util.DataDir, oldPath+".sya")) { // Rename the .sya annotation file when renaming a PDF asset https://github.com/siyuan-note/siyuan/issues/9390 if err = filelock.Copy(filepath.Join(util.DataDir, oldPath+".sya"), filepath.Join(util.DataDir, newPath+".sya")); nil != err { logging.LogErrorf("copy PDF annotation [%s] failed: %s", oldPath+".sya", err) @@ -804,7 +804,7 @@ func MissingAssets() (ret []string) { if "" == assetsPathMap[dest] { if strings.HasPrefix(dest, "assets/.") { // Assets starting with `.` should not be considered missing assets https://github.com/siyuan-note/siyuan/issues/8821 - if !gulu.File.IsExist(filepath.Join(util.DataDir, dest)) { + if !filelock.IsExist(filepath.Join(util.DataDir, dest)) { ret = append(ret, dest) } } else { diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index ae435fb64..603ff105b 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -27,6 +27,7 @@ import ( "github.com/88250/lute/ast" "github.com/88250/lute/parse" "github.com/Masterminds/sprig/v3" + "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/av" "github.com/siyuan-note/siyuan/kernel/treenode" @@ -183,7 +184,7 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) { func RenderAttributeView(avID string) (viewable av.Viewable, attrView *av.AttributeView, err error) { waitForSyncingStorages() - if avJSONPath := av.GetAttributeViewDataPath(avID); !gulu.File.IsExist(avJSONPath) { + if avJSONPath := av.GetAttributeViewDataPath(avID); !filelock.IsExist(avJSONPath) { attrView = av.NewAttributeView(avID) if err = av.SaveAttributeView(attrView); nil != err { logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) diff --git a/kernel/model/box.go b/kernel/model/box.go index f43010af2..76de3bb06 100644 --- a/kernel/model/box.go +++ b/kernel/model/box.go @@ -111,7 +111,7 @@ func ListNotebooks() (ret []*Box, err error) { boxConf := conf.NewBoxConf() boxDirPath := filepath.Join(util.DataDir, dir.Name()) boxConfPath := filepath.Join(boxDirPath, ".siyuan", "conf.json") - if !gulu.File.IsExist(boxConfPath) { + if !filelock.IsExist(boxConfPath) { // Automatically move corrupted notebook folders to the corrupted folder https://github.com/siyuan-note/siyuan/issues/9202 logging.LogWarnf("found a corrupted box [%s]", boxDirPath) to := filepath.Join(util.WorkspaceDir, "corrupted", time.Now().Format("2006-01-02-150405"), dir.Name()) @@ -184,7 +184,7 @@ func (box *Box) GetConf() (ret *conf.BoxConf) { ret = conf.NewBoxConf() confPath := filepath.Join(util.DataDir, box.ID, ".siyuan/conf.json") - if !gulu.File.IsExist(confPath) { + if !filelock.IsExist(confPath) { return } @@ -305,7 +305,7 @@ func (box *Box) Stat(p string) (ret *FileInfo) { } func (box *Box) Exist(p string) bool { - return gulu.File.IsExist(filepath.Join(util.DataDir, box.ID, p)) + return filelock.IsExist(filepath.Join(util.DataDir, box.ID, p)) } func (box *Box) Mkdir(path string) error { diff --git a/kernel/model/conf.go b/kernel/model/conf.go index 99c7d0b6e..f6f613b87 100644 --- a/kernel/model/conf.go +++ b/kernel/model/conf.go @@ -812,7 +812,7 @@ func clearCorruptedNotebooks() { boxDirPath := filepath.Join(util.DataDir, dir.Name()) boxConfPath := filepath.Join(boxDirPath, ".siyuan", "conf.json") - if !gulu.File.IsExist(boxConfPath) { + if !filelock.IsExist(boxConfPath) { logging.LogWarnf("found a corrupted box [%s]", boxDirPath) continue } @@ -898,7 +898,7 @@ func upgradeUserGuide() { boxDirPath := filepath.Join(util.DataDir, boxID) boxConf := conf.NewBoxConf() boxConfPath := filepath.Join(boxDirPath, ".siyuan", "conf.json") - if !gulu.File.IsExist(boxConfPath) { + if !filelock.IsExist(boxConfPath) { logging.LogWarnf("found a corrupted box [%s]", boxDirPath) continue } diff --git a/kernel/model/export.go b/kernel/model/export.go index c104dab11..5f6a400fd 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -1347,7 +1347,7 @@ func exportSYZip(boxID, rootDirPath, baseFolderName string, docPaths []string) ( if !gulu.File.IsDir(srcPath) && strings.HasSuffix(strings.ToLower(srcPath), ".pdf") { sya := srcPath + ".sya" - if gulu.File.IsExist(sya) { + if filelock.IsExist(sya) { // Related PDF annotation information is not exported when exporting .sy.zip https://github.com/siyuan-note/siyuan/issues/7836 if syaErr := filelock.Copy(sya, destPath+".sya"); nil != syaErr { logging.LogErrorf("copy sya from [%s] to [%s] failed: %s", sya, destPath+".sya", syaErr) @@ -1373,7 +1373,7 @@ func exportSYZip(boxID, rootDirPath, baseFolderName string, docPaths []string) ( avID := n.AttributeViewID avJSONPath := av.GetAttributeViewDataPath(avID) - if !gulu.File.IsExist(avJSONPath) { + if !filelock.IsExist(avJSONPath) { return ast.WalkContinue } @@ -1410,7 +1410,7 @@ func exportSYZip(boxID, rootDirPath, baseFolderName string, docPaths []string) ( sortIDs := map[string]int{} var sortData []byte var sortErr error - if gulu.File.IsExist(sortPath) { + if filelock.IsExist(sortPath) { sortData, sortErr = filelock.ReadFile(sortPath) if nil != sortErr { logging.LogErrorf("read sort conf failed: %s", sortErr) @@ -1900,7 +1900,7 @@ func exportTree(tree *parse.Tree, wysiwyg, expandKaTexMacros, keepFold bool, } avID := n.AttributeViewID - if avJSONPath := av.GetAttributeViewDataPath(avID); !gulu.File.IsExist(avJSONPath) { + if avJSONPath := av.GetAttributeViewDataPath(avID); !filelock.IsExist(avJSONPath) { return ast.WalkContinue } diff --git a/kernel/model/file.go b/kernel/model/file.go index 59cc79ecf..092d30858 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1205,7 +1205,7 @@ func moveDoc(fromBox *Box, fromPath string, toBox *Box, toPath string, luteEngin } else { absFromPath := filepath.Join(util.DataDir, fromBox.ID, fromFolder) absToPath := filepath.Join(util.DataDir, toBox.ID, newFolder) - if gulu.File.IsExist(absToPath) { + if filelock.IsExist(absToPath) { filelock.Remove(absToPath) } if err = filelock.Rename(absFromPath, absToPath); nil != err { @@ -1445,7 +1445,7 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) { var dom string if "" != boxConf.DailyNoteTemplatePath { tplPath := filepath.Join(util.DataDir, "templates", boxConf.DailyNoteTemplatePath) - if !gulu.File.IsExist(tplPath) { + if !filelock.IsExist(tplPath) { logging.LogWarnf("not found daily note template [%s]", tplPath) } else { dom, err = renderTemplate(tplPath, id, false) @@ -1570,7 +1570,7 @@ func moveSorts(rootID, fromBox, toBox string) { ids := treenode.RootChildIDs(rootID) fromConfPath := filepath.Join(util.DataDir, fromBox, ".siyuan", "sort.json") fromFullSortIDs := map[string]int{} - if gulu.File.IsExist(fromConfPath) { + if filelock.IsExist(fromConfPath) { data, err := filelock.ReadFile(fromConfPath) if nil != err { logging.LogErrorf("read sort conf failed: %s", err) @@ -1587,7 +1587,7 @@ func moveSorts(rootID, fromBox, toBox string) { toConfPath := filepath.Join(util.DataDir, toBox, ".siyuan", "sort.json") toFullSortIDs := map[string]int{} - if gulu.File.IsExist(toConfPath) { + if filelock.IsExist(toConfPath) { data, err := filelock.ReadFile(toConfPath) if nil != err { logging.LogErrorf("read sort conf failed: %s", err) @@ -1663,7 +1663,7 @@ func ChangeFileTreeSort(boxID string, paths []string) { confPath := filepath.Join(confDir, "sort.json") fullSortIDs := map[string]int{} var data []byte - if gulu.File.IsExist(confPath) { + if filelock.IsExist(confPath) { data, err = filelock.ReadFile(confPath) if nil != err { logging.LogErrorf("read sort conf failed: %s", err) @@ -1694,7 +1694,7 @@ func ChangeFileTreeSort(boxID string, paths []string) { func (box *Box) fillSort(files *[]*File) { confPath := filepath.Join(util.DataDir, box.ID, ".siyuan", "sort.json") - if !gulu.File.IsExist(confPath) { + if !filelock.IsExist(confPath) { return } @@ -1718,7 +1718,7 @@ func (box *Box) fillSort(files *[]*File) { func (box *Box) removeSort(ids []string) { confPath := filepath.Join(util.DataDir, box.ID, ".siyuan", "sort.json") - if !gulu.File.IsExist(confPath) { + if !filelock.IsExist(confPath) { return } diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index cd1d42c1f..d3ad409dd 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -30,6 +30,7 @@ import ( "github.com/88250/lute/ast" "github.com/88250/lute/parse" "github.com/open-spaced-repetition/go-fsrs" + "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/riff" "github.com/siyuan-note/siyuan/kernel/cache" @@ -814,15 +815,15 @@ func RemoveDeck(deckID string) (err error) { riffSavePath := getRiffDir() deckPath := filepath.Join(riffSavePath, deckID+".deck") - if gulu.File.IsExist(deckPath) { - if err = os.Remove(deckPath); nil != err { + if filelock.IsExist(deckPath) { + if err = filelock.Remove(deckPath); nil != err { return } } cardsPath := filepath.Join(riffSavePath, deckID+".cards") - if gulu.File.IsExist(cardsPath) { - if err = os.Remove(cardsPath); nil != err { + if filelock.IsExist(cardsPath) { + if err = filelock.Remove(cardsPath); nil != err { return } } diff --git a/kernel/model/history.go b/kernel/model/history.go index 63b5a690c..cbc6e3416 100644 --- a/kernel/model/history.go +++ b/kernel/model/history.go @@ -142,6 +142,7 @@ func ClearWorkspaceHistory() (err error) { func GetDocHistoryContent(historyPath, keyword string) (id, rootID, content string, isLargeDoc bool, err error) { if !gulu.File.IsExist(historyPath) { + logging.LogWarnf("doc history [%s] not exist", historyPath) return } @@ -214,6 +215,7 @@ func GetDocHistoryContent(historyPath, keyword string) (id, rootID, content stri func RollbackDocHistory(boxID, historyPath string) (err error) { if !gulu.File.IsExist(historyPath) { + logging.LogWarnf("doc history [%s] not exist", historyPath) return } @@ -268,6 +270,7 @@ func getRollbackDockPath(boxID, historyPath string) (destPath string, err error) func RollbackAssetsHistory(historyPath string) (err error) { historyPath = filepath.Join(util.WorkspaceDir, historyPath) if !gulu.File.IsExist(historyPath) { + logging.LogWarnf("assets history [%s] not exist", historyPath) return } @@ -285,6 +288,7 @@ func RollbackAssetsHistory(historyPath string) (err error) { func RollbackNotebookHistory(historyPath string) (err error) { if !gulu.File.IsExist(historyPath) { + logging.LogWarnf("notebook history [%s] not exist", historyPath) return } @@ -482,6 +486,7 @@ func (box *Box) generateDocHistory0() { func clearOutdatedHistoryDir(historyDir string) { if !gulu.File.IsExist(historyDir) { + logging.LogWarnf("history dir [%s] not exist", historyDir) return } diff --git a/kernel/model/import.go b/kernel/model/import.go index 1ead8ce57..2ee565d64 100644 --- a/kernel/model/import.go +++ b/kernel/model/import.go @@ -349,7 +349,7 @@ func ImportSY(zipPath, boxID, toPath string) (err error) { var sortData []byte var sortErr error sortPath := filepath.Join(unzipRootPath, ".siyuan", "sort.json") - if gulu.File.IsExist(sortPath) { + if filelock.IsExist(sortPath) { sortData, sortErr = filelock.ReadFile(sortPath) if nil != sortErr { logging.LogErrorf("read import sort conf failed: %s", sortErr) @@ -360,7 +360,7 @@ func ImportSY(zipPath, boxID, toPath string) (err error) { } boxSortPath := filepath.Join(util.DataDir, boxID, ".siyuan", "sort.json") - if gulu.File.IsExist(boxSortPath) { + if filelock.IsExist(boxSortPath) { sortData, sortErr = filelock.ReadFile(boxSortPath) if nil != sortErr { logging.LogErrorf("read box sort conf failed: %s", sortErr) diff --git a/kernel/model/mount.go b/kernel/model/mount.go index 4d69a2780..37616a099 100644 --- a/kernel/model/mount.go +++ b/kernel/model/mount.go @@ -78,7 +78,7 @@ func RemoveBox(boxID string) (err error) { } localPath := filepath.Join(util.DataDir, boxID) - if !gulu.File.IsExist(localPath) { + if !filelock.IsExist(localPath) { return } if !gulu.File.IsDir(localPath) { diff --git a/kernel/model/ocr.go b/kernel/model/ocr.go index 89beec505..8acb61f8c 100644 --- a/kernel/model/ocr.go +++ b/kernel/model/ocr.go @@ -1,7 +1,6 @@ package model import ( - "io" "os" "path/filepath" "runtime/debug" @@ -10,6 +9,7 @@ import ( "github.com/88250/gulu" "github.com/dustin/go-humanize" + "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/cache" "github.com/siyuan-note/siyuan/kernel/task" @@ -57,7 +57,7 @@ func cleanNotExistAssetsTexts() { for asset, _ := range util.AssetsTexts { assetAbsPath := strings.TrimPrefix(asset, "assets") assetAbsPath = filepath.Join(assetsPath, assetAbsPath) - if !gulu.File.IsExist(assetAbsPath) { + if !filelock.IsExist(assetAbsPath) { toRemoves = append(toRemoves, asset) } } @@ -98,20 +98,12 @@ func FlushAssetsTextsJob() { func LoadAssetsTexts() { assetsPath := util.GetDataAssetsAbsPath() assetsTextsPath := filepath.Join(assetsPath, "ocr-texts.json") - if !gulu.File.IsExist(assetsTextsPath) { + if !filelock.IsExist(assetsTextsPath) { return } start := time.Now() - var err error - fh, err := os.OpenFile(assetsTextsPath, os.O_RDWR, 0644) - if nil != err { - logging.LogErrorf("open assets texts failed: %s", err) - return - } - defer fh.Close() - - data, err := io.ReadAll(fh) + data, err := filelock.ReadFile(assetsTextsPath) if nil != err { logging.LogErrorf("read assets texts failed: %s", err) return @@ -151,7 +143,7 @@ func SaveAssetsTexts() { assetsPath := util.GetDataAssetsAbsPath() assetsTextsPath := filepath.Join(assetsPath, "ocr-texts.json") - if err = gulu.File.WriteFileSafer(assetsTextsPath, data, 0644); nil != err { + if err = filelock.WriteFile(assetsTextsPath, data); nil != err { logging.LogErrorf("write assets texts failed: %s", err) return } diff --git a/kernel/model/plugin.go b/kernel/model/plugin.go index 1baac24de..bb4b0c2b1 100644 --- a/kernel/model/plugin.go +++ b/kernel/model/plugin.go @@ -101,7 +101,7 @@ func LoadPetals(frontend string) (ret []*Petal) { func loadCode(petal *Petal) { pluginDir := filepath.Join(util.DataDir, "plugins", petal.Name) jsPath := filepath.Join(pluginDir, "index.js") - if !gulu.File.IsExist(jsPath) { + if !filelock.IsExist(jsPath) { logging.LogErrorf("plugin [%s] js not found", petal.Name) return } @@ -114,7 +114,7 @@ func loadCode(petal *Petal) { petal.JS = string(data) cssPath := filepath.Join(pluginDir, "index.css") - if gulu.File.IsExist(cssPath) { + if filelock.IsExist(cssPath) { data, err = filelock.ReadFile(cssPath) if nil != err { logging.LogErrorf("read plugin [%s] css failed: %s", petal.Name, err) @@ -204,7 +204,7 @@ func getPetals() (ret []*Petal) { } confPath := filepath.Join(petalDir, "petals.json") - if !gulu.File.IsExist(confPath) { + if !filelock.IsExist(confPath) { data, err := gulu.JSON.MarshalIndentJSON(ret, "", "\t") if nil != err { logging.LogErrorf("marshal petals failed: %s", err) diff --git a/kernel/model/snippet.go b/kernel/model/snippet.go index 2e7c5a8dc..b5dc24421 100644 --- a/kernel/model/snippet.go +++ b/kernel/model/snippet.go @@ -68,7 +68,7 @@ func LoadSnippets() (ret []*conf.Snippet, err error) { func loadSnippets() (ret []*conf.Snippet, err error) { ret = []*conf.Snippet{} confPath := filepath.Join(util.SnippetsPath, "conf.json") - if !gulu.File.IsExist(confPath) { + if !filelock.IsExist(confPath) { return } diff --git a/kernel/model/storage.go b/kernel/model/storage.go index e0618d2e5..05e6cc5de 100644 --- a/kernel/model/storage.go +++ b/kernel/model/storage.go @@ -129,7 +129,7 @@ func setRecentDocs(recentDocs []*RecentDoc) (err error) { func getRecentDocs() (ret []*RecentDoc, err error) { tmp := []*RecentDoc{} dataPath := filepath.Join(util.DataDir, "storage/recent-doc.json") - if !gulu.File.IsExist(dataPath) { + if !filelock.IsExist(dataPath) { return } @@ -270,7 +270,7 @@ func setCriteria(criteria []*Criterion) (err error) { func getCriteria() (ret []*Criterion, err error) { ret = []*Criterion{} dataPath := filepath.Join(util.DataDir, "storage/criteria.json") - if !gulu.File.IsExist(dataPath) { + if !filelock.IsExist(dataPath) { return } @@ -351,7 +351,7 @@ func getLocalStorage() (ret map[string]interface{}) { // When local.json is corrupted, clear the file to avoid being unable to enter the main interface https://github.com/siyuan-note/siyuan/issues/7911 ret = map[string]interface{}{} lsPath := filepath.Join(util.DataDir, "storage/local.json") - if !gulu.File.IsExist(lsPath) { + if !filelock.IsExist(lsPath) { return } diff --git a/kernel/model/template.go b/kernel/model/template.go index fccfe3ac2..e3f9485dc 100644 --- a/kernel/model/template.go +++ b/kernel/model/template.go @@ -153,7 +153,7 @@ func DocSaveAsTemplate(id, name string, overwrite bool) (code int, err error) { name = util.FilterFileName(name) + ".md" name = util.TruncateLenFileName(name) savePath := filepath.Join(util.DataDir, "templates", name) - if gulu.File.IsExist(savePath) { + if filelock.IsExist(savePath) { if !overwrite { code = 1 return diff --git a/kernel/model/upload.go b/kernel/model/upload.go index 72d8b5546..405dd4170 100644 --- a/kernel/model/upload.go +++ b/kernel/model/upload.go @@ -278,9 +278,9 @@ func Upload(c *gin.Context) { func getAssetsDir(boxLocalPath, docDirLocalPath string) (assets string) { assets = filepath.Join(docDirLocalPath, "assets") - if !gulu.File.IsExist(assets) { + if !filelock.IsExist(assets) { assets = filepath.Join(boxLocalPath, "assets") - if !gulu.File.IsExist(assets) { + if !filelock.IsExist(assets) { assets = filepath.Join(util.DataDir, "assets") } } diff --git a/kernel/sql/asset.go b/kernel/sql/asset.go index 3aa68b0ad..3fb9c43e1 100644 --- a/kernel/sql/asset.go +++ b/kernel/sql/asset.go @@ -18,10 +18,10 @@ package sql import ( "database/sql" + "github.com/siyuan-note/filelock" "path/filepath" "strings" - "github.com/88250/gulu" "github.com/88250/lute/ast" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/treenode" @@ -139,17 +139,17 @@ func scanAssetRows(rows *sql.Rows) (ret *Asset) { func assetLocalPath(linkDest, boxLocalPath, docDirLocalPath string) (ret string) { ret = filepath.Join(docDirLocalPath, linkDest) - if gulu.File.IsExist(ret) { + if filelock.IsExist(ret) { return } ret = filepath.Join(boxLocalPath, linkDest) - if gulu.File.IsExist(ret) { + if filelock.IsExist(ret) { return } ret = filepath.Join(util.DataDir, linkDest) - if gulu.File.IsExist(ret) { + if filelock.IsExist(ret) { return } return ""