Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2022-06-16 11:40:37 +08:00
commit d490305558
26 changed files with 134 additions and 443 deletions

View file

@ -17,13 +17,14 @@
package api
import (
"errors"
"fmt"
"net/http"
"github.com/88250/gulu"
"github.com/88250/lute/html"
"github.com/gin-gonic/gin"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/model"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/util"
@ -73,7 +74,7 @@ func checkBlockExist(c *gin.Context) {
id := arg["id"].(string)
b, err := model.GetBlock(id)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
ret.Code = 2
ret.Data = id
return
@ -221,7 +222,7 @@ func getBlockInfo(c *gin.Context) {
id := arg["id"].(string)
block, err := model.GetBlock(id)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
ret.Code = 2
ret.Data = id
return
@ -247,7 +248,7 @@ func getBlockInfo(c *gin.Context) {
}
root, err := model.GetBlock(block.RootID)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
ret.Code = 2
ret.Data = id
return

View file

@ -28,7 +28,7 @@ import (
"github.com/88250/gulu"
"github.com/gin-gonic/gin"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/model"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -92,7 +92,7 @@ func putFile(c *gin.Context) {
if err = os.MkdirAll(dir, 0755); nil != err {
util.LogErrorf("put a file [%s] make dir [%s] failed: %s", filePath, dir, err)
} else {
if filesys.IsLocked(filePath) {
if filelock.IsLocked(filePath) {
msg := fmt.Sprintf("file [%s] is locked", filePath)
util.LogErrorf(msg)
err = errors.New(msg)

View file

@ -17,6 +17,7 @@
package api
import (
"errors"
"fmt"
"net/http"
"path"
@ -26,7 +27,7 @@ import (
"github.com/88250/gulu"
"github.com/gin-gonic/gin"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/model"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -592,7 +593,7 @@ func getDoc(c *gin.Context) {
}
blockCount, content, parentID, parent2ID, rootID, typ, eof, boxID, docPath, err := model.GetDoc(id, index, keyword, mode, size)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
ret.Code = 2
ret.Data = id
return

View file

@ -17,13 +17,14 @@
package api
import (
"errors"
"fmt"
"net/http"
"time"
"github.com/88250/gulu"
"github.com/gin-gonic/gin"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/model"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/util"
@ -64,7 +65,7 @@ func performTransactions(c *gin.Context) {
err = model.PerformTransactions(&transactions)
}
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
ret.Code = 1
return
}

View file

@ -1,238 +0,0 @@
// SiYuan - Build Your Eternal Digital Garden
// Copyright (c) 2020-present, b3log.org
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//go:build !android && !ios
package filesys
import (
"errors"
"io"
"os"
"strings"
"sync"
"time"
"github.com/88250/flock"
"github.com/88250/gulu"
"github.com/siyuan-note/siyuan/kernel/util"
)
var ErrUnableLockFile = errors.New("unable to lock file")
var (
fileLocks = sync.Map{}
expiration = 5 * time.Minute
fileReadWriteLock = sync.Mutex{}
)
type LockItem struct {
fl *flock.Flock
expired int64
}
func init() {
go func() {
// 锁定超时自动解锁
for range time.Tick(10 * time.Second) {
fileReadWriteLock.Lock()
now := time.Now().UnixNano()
var expiredKeys []string
fileLocks.Range(func(k, v interface{}) bool {
lockItem := v.(*LockItem)
if now > lockItem.expired {
expiredKeys = append(expiredKeys, k.(string))
}
return true
})
for _, k := range expiredKeys {
if err := unlockFile0(k); nil != err {
util.LogErrorf("unlock file [%s] failed: %s", k, err)
continue
}
//util.LogInfof("released file lock [%s]", k)
}
fileReadWriteLock.Unlock()
}
}()
}
func ReleaseFileLocks(localAbsPath string) {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
fileLocks.Range(func(k, v interface{}) bool {
if strings.HasPrefix(k.(string), localAbsPath) {
if err := unlockFile0(k.(string)); nil != err {
util.LogErrorf("unlock file [%s] failed: %s", k, err)
}
}
return true
})
}
func ReleaseAllFileLocks() {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
fileLocks.Range(func(k, v interface{}) bool {
if err := unlockFile0(k.(string)); nil != err {
util.LogErrorf("unlock file [%s] failed: %s", k, err)
}
return true
})
}
func NoLockFileRead(filePath string) (data []byte, err error) {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
v, ok := fileLocks.Load(filePath)
if !ok {
return os.ReadFile(filePath)
}
lockItem := v.(*LockItem)
handle := lockItem.fl.Fh()
if _, err = handle.Seek(0, io.SeekStart); nil != err {
return
}
return io.ReadAll(handle)
}
func LockFileRead(filePath string) (data []byte, err error) {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
if !gulu.File.IsExist(filePath) {
err = os.ErrNotExist
return
}
lock, lockErr := lockFile0(filePath)
if nil != lockErr {
err = lockErr
return
}
handle := lock.Fh()
if _, err = handle.Seek(0, io.SeekStart); nil != err {
return
}
return io.ReadAll(handle)
}
func NoLockFileWrite(filePath string, data []byte) (err error) {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
v, ok := fileLocks.Load(filePath)
if !ok {
return os.WriteFile(filePath, data, 0644)
}
lockItem := v.(*LockItem)
handle := lockItem.fl.Fh()
err = gulu.File.WriteFileSaferByHandle(handle, data)
return
}
func LockFileWrite(filePath string, data []byte) (err error) {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
lock, lockErr := lockFile0(filePath)
if nil != lockErr {
err = lockErr
return
}
handle := lock.Fh()
err = gulu.File.WriteFileSaferByHandle(handle, data)
return
}
func IsLocked(filePath string) bool {
v, _ := fileLocks.Load(filePath)
if nil == v {
return false
}
return true
}
func UnlockFile(filePath string) (err error) {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
return unlockFile0(filePath)
}
func unlockFile0(filePath string) (err error) {
v, _ := fileLocks.Load(filePath)
if nil == v {
return
}
lockItem := v.(*LockItem)
err = lockItem.fl.Unlock()
fileLocks.Delete(filePath)
return
}
func LockFile(filePath string) (err error) {
fileReadWriteLock.Lock()
defer fileReadWriteLock.Unlock()
_, err = lockFile0(filePath)
return
}
func lockFile0(filePath string) (lock *flock.Flock, err error) {
lockItemVal, _ := fileLocks.Load(filePath)
var lockItem *LockItem
if nil == lockItemVal {
lock = flock.New(filePath)
var locked bool
var lockErr error
for i := 0; i < 7; i++ {
locked, lockErr = lock.TryLock()
if nil != lockErr || !locked {
time.Sleep(100 * time.Millisecond)
continue
}
break
}
if nil != lockErr {
util.LogErrorf("lock file [%s] failed: %s", filePath, lockErr)
err = ErrUnableLockFile
return
}
if !locked {
util.LogErrorf("unable to lock file [%s]", filePath)
err = ErrUnableLockFile
return
}
lockItem = &LockItem{fl: lock}
} else {
lockItem = lockItemVal.(*LockItem)
lock = lockItem.fl
}
lockItem.expired = time.Now().Add(expiration).UnixNano()
fileLocks.Store(filePath, lockItem)
return
}

View file

@ -1,70 +0,0 @@
// SiYuan - Build Your Eternal Digital Garden
// Copyright (c) 2020-present, b3log.org
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//go:build android || ios
// +build android ios
package filesys
import (
"errors"
"os"
"sync"
"github.com/88250/gulu"
)
var ErrUnableLockFile = errors.New("unable to lock file")
func ReleaseFileLocks(boxLocalPath string) {}
func ReleaseAllFileLocks() {}
func NoLockFileRead(filePath string) (data []byte, err error) {
return os.ReadFile(filePath)
}
func LockFileRead(filePath string) (data []byte, err error) {
return os.ReadFile(filePath)
}
func NoLockFileWrite(filePath string, data []byte) (err error) {
return gulu.File.WriteFileSafer(filePath, data, 0644)
}
func LockFileWrite(filePath string, data []byte) (err error) {
return gulu.File.WriteFileSafer(filePath, data, 0644)
}
func LockFile(filePath string) (err error) {
return
}
func UnlockFile(filePath string) (err error) {
return
}
var fileLocks = sync.Map{}
func IsLocked(filePath string) bool {
return false
}
func LockFileReadWrite() {
}
func UnlockFileReadWriteLock() {
}

View file

@ -29,6 +29,7 @@ import (
"github.com/88250/lute"
"github.com/88250/lute/parse"
"github.com/88250/protyle"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/cache"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
@ -36,7 +37,7 @@ import (
func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err error) {
filePath := filepath.Join(util.DataDir, boxID, p)
data, err := LockFileRead(filePath)
data, err := filelock.LockFileRead(filePath)
if nil != err {
return
}
@ -70,7 +71,7 @@ func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err erro
}
parentPath += ".sy"
parentPath = filepath.Join(util.DataDir, boxID, parentPath)
data, err := LockFileRead(parentPath)
data, err := filelock.LockFileRead(parentPath)
if nil != err {
hPathBuilder.WriteString("Untitled/")
continue
@ -113,7 +114,7 @@ func WriteTree(tree *parse.Tree) (err error) {
if err = os.MkdirAll(filepath.Dir(filePath), 0755); nil != err {
return
}
if err = LockFileWrite(filePath, output); nil != err {
if err = filelock.LockFileWrite(filePath, output); nil != err {
msg := fmt.Sprintf("write data [%s] failed: %s", filePath, err)
util.LogErrorf(msg)
return errors.New(msg)
@ -144,12 +145,12 @@ func recoverParseJSON2Tree(boxID, p, filePath string, luteEngine *lute.Lute) (re
return
}
data, err := NoLockFileRead(tmp)
data, err := filelock.NoLockFileRead(tmp)
if nil != err {
util.LogErrorf("recover tree read from tmp [%s] failed: %s", tmp, err)
return
}
if err = NoLockFileWrite(filePath, data); nil != err {
if err = filelock.NoLockFileWrite(filePath, data); nil != err {
util.LogErrorf("recover tree write [%s] from tmp [%s] failed: %s", filePath, tmp, err)
return
}
@ -191,7 +192,7 @@ func parseJSON2Tree(boxID, p string, jsonData []byte, luteEngine *lute.Lute) (re
if err = os.MkdirAll(filepath.Dir(filePath), 0755); nil != err {
return
}
if err = LockFileWrite(filePath, output); nil != err {
if err = filelock.LockFileWrite(filePath, output); nil != err {
msg := fmt.Sprintf("write data [%s] failed: %s", filePath, err)
util.LogErrorf(msg)
}

View file

@ -22,6 +22,7 @@ import (
"sync"
"github.com/88250/gulu"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -47,7 +48,7 @@ func IncWorkspaceDataVer(inc bool, systemID string) {
conf := &DataConf{Updated: now, Device: systemID}
if !gulu.File.IsExist(confPath) {
data, _ = gulu.JSON.MarshalIndentJSON(conf, "", " ")
if err = LockFileWrite(confPath, data); nil != err {
if err = filelock.LockFileWrite(confPath, data); nil != err {
util.LogErrorf("save data conf [%s] failed: %s", confPath, err)
}
@ -58,7 +59,7 @@ func IncWorkspaceDataVer(inc bool, systemID string) {
return
}
data, err = LockFileRead(confPath)
data, err = filelock.LockFileRead(confPath)
if nil != err {
data, err = recoverFrom(confPath)
if nil != err {
@ -83,7 +84,7 @@ func IncWorkspaceDataVer(inc bool, systemID string) {
}
data, _ = gulu.JSON.MarshalIndentJSON(conf, "", " ")
if err = LockFileWrite(confPath, data); nil != err {
if err = filelock.LockFileWrite(confPath, data); nil != err {
util.LogErrorf("save data conf [%s] failed: %s", confPath, err)
return
}
@ -96,7 +97,7 @@ func recoverFrom(confPath string) (data []byte, err error) {
return
}
data, err = NoLockFileRead(tmp)
data, err = filelock.NoLockFileRead(tmp)
if nil != err {
util.LogErrorf("read temp data conf [%s] failed: %s", tmp, err)
return

View file

@ -40,8 +40,9 @@ require (
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/qiniu/go-sdk/v7 v7.13.0
github.com/radovskyb/watcher v1.0.7
github.com/siyuan-note/dejavu v0.0.0-20220615074544-177b5b3df8bb
github.com/siyuan-note/dejavu v0.0.0-20220615164826-201b6516adf3
github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676
github.com/siyuan-note/filelock v0.0.0-20220615164210-064676f342aa
github.com/vmihailenco/msgpack/v5 v5.3.5
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673
golang.org/x/image v0.0.0-20220601225756-64ec528b34cd
@ -93,11 +94,13 @@ require (
github.com/spf13/cast v1.5.0 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.8.0 // indirect
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
golang.org/x/mod v0.5.1 // indirect
golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d // indirect
golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 // indirect
golang.org/x/tools v0.1.8 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/protobuf v1.28.0 // indirect

View file

@ -419,10 +419,12 @@ github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJ
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/siyuan-note/dejavu v0.0.0-20220615074544-177b5b3df8bb h1:GZyX6WxQzW4LCPmJ1jcAZDPpIEAjFFwucbwCgR60kfU=
github.com/siyuan-note/dejavu v0.0.0-20220615074544-177b5b3df8bb/go.mod h1:Oa/Y6fvTUCg8h9/t6GNWXiu8T7aQri/ZvyDRygnlikI=
github.com/siyuan-note/dejavu v0.0.0-20220615164826-201b6516adf3 h1:pWPKLb4bpv5Cj8jErsuVKAvXqmudz+0XVfVWZjVxGJc=
github.com/siyuan-note/dejavu v0.0.0-20220615164826-201b6516adf3/go.mod h1:0XMLF+6gtwqr3ZJTk3nZmNbmQ4xNdaoP9RXKDR2ggkw=
github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676 h1:QB9TjJQFhXhZ6dAtPpY02DlzHAQm1C+WqZq6OadG8mI=
github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676/go.mod h1:H8fyqqAbp9XreANjeSbc72zEdFfKTXYN34tc1TjZwtw=
github.com/siyuan-note/filelock v0.0.0-20220615164210-064676f342aa h1:6bXZdsdA5EU1NUChdFV4EwH8nvYUis0H1TxwgadLM38=
github.com/siyuan-note/filelock v0.0.0-20220615164210-064676f342aa/go.mod h1:c4vwvWRrnfa75OXiO21K/76BFRJ4cFITKNoVs5lFdwc=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
@ -472,7 +474,11 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@ -649,8 +655,8 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d h1:Zu/JngovGLVi6t2J3nmAf3AoTDwuzw85YZ3b9o4yU7s=
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 h1:PgOr27OhUx2IRqGJ2RxAWI4dJQ7bi9cSrB82uzFzfUA=
golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.0.0-20180302201248-b7ef84aaf62a/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

View file

@ -35,7 +35,7 @@ import (
"github.com/88250/lute/ast"
"github.com/88250/lute/parse"
"github.com/gabriel-vasile/mimetype"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/search"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
@ -671,7 +671,7 @@ func copyDocAssetsToDataAssets(boxID, parentDocPath string) {
}
func copyAssetsToDataAssets(rootPath string) {
filesys.ReleaseFileLocks(rootPath)
filelock.ReleaseFileLocks(rootPath)
var assetsDirPaths []string
filepath.Walk(rootPath, func(path string, info fs.FileInfo, err error) error {

View file

@ -33,7 +33,7 @@ import (
"github.com/88250/gulu"
"github.com/dustin/go-humanize"
"github.com/siyuan-note/encryption"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -145,7 +145,10 @@ func RecoverLocalBackup() (err error) {
writingDataLock.Lock()
defer writingDataLock.Unlock()
filesys.ReleaseAllFileLocks()
err = filelock.ReleaseAllFileLocks()
if nil != err {
return
}
sql.WaitForWritingDatabase()
CloseWatchAssets()
@ -256,7 +259,10 @@ func CreateLocalBackup() (err error) {
defer writingDataLock.Unlock()
WaitForWritingFiles()
sql.WaitForWritingDatabase()
filesys.ReleaseAllFileLocks()
err = filelock.ReleaseAllFileLocks()
if nil != err {
return
}
util.LogInfof("creating backup...")
start := time.Now()
@ -294,7 +300,7 @@ func CreateLocalBackup() (err error) {
util.LogErrorf("marshal backup conf.json failed: %s", err)
} else {
confPath := filepath.Join(newBackupDir, "conf.json")
if err = os.WriteFile(confPath, data, 0644); nil != err {
if err = gulu.File.WriteFileSafer(confPath, data, 0644); nil != err {
util.LogErrorf("write backup conf.json [%s] failed: %s", confPath, err)
}
}
@ -432,13 +438,7 @@ func encryptDataDir(passwd string) (encryptedDataDir string, err error) {
return io.EOF
}
f, err0 := os.Create(p)
if nil != err0 {
util.LogErrorf("create file [%s] failed: %s", p, err0)
err = err0
return io.EOF
}
data, err0 := os.ReadFile(path)
data, err0 := filelock.NoLockFileRead(path)
if nil != err0 {
util.LogErrorf("read file [%s] failed: %s", path, err0)
err = err0
@ -450,16 +450,12 @@ func encryptDataDir(passwd string) (encryptedDataDir string, err error) {
err = errors.New("encrypt file failed")
return io.EOF
}
if _, err0 = f.Write(data); nil != err0 {
if err0 = gulu.File.WriteFileSafer(p, data, 0644); nil != err0 {
util.LogErrorf("write file [%s] failed: %s", p, err0)
err = err0
return io.EOF
}
if err0 = f.Close(); nil != err0 {
util.LogErrorf("close file [%s] failed: %s", p, err0)
err = err0
return io.EOF
}
fi, err0 := os.Stat(path)
if nil != err0 {
@ -584,7 +580,7 @@ func decryptDataDir(passwd string) (decryptedDataDir string, err error) {
err = errors.New(Conf.Language(40))
return io.EOF
}
if err0 = os.WriteFile(plainP, data, 0644); nil != err0 {
if err0 = gulu.File.WriteFileSafer(plainP, data, 0644); nil != err0 {
util.LogErrorf("write file [%s] failed: %s", plainP, err0)
err = err0
return io.EOF

View file

@ -32,8 +32,8 @@ import (
"github.com/88250/lute/ast"
"github.com/88250/lute/parse"
"github.com/facette/natsort"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/conf"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
@ -85,14 +85,14 @@ func ListNotebooks() (ret []*Box, err error) {
boxConfPath := filepath.Join(util.DataDir, dir.Name(), ".siyuan", "conf.json")
if !gulu.File.IsExist(boxConfPath) {
if isUserGuide(dir.Name()) {
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
os.RemoveAll(filepath.Join(util.DataDir, dir.Name()))
util.LogWarnf("not found user guid box conf [%s], removed it", boxConfPath)
continue
}
util.LogWarnf("not found box conf [%s], recreate it", boxConfPath)
} else {
data, readErr := filesys.NoLockFileRead(boxConfPath)
data, readErr := filelock.NoLockFileRead(boxConfPath)
if nil != readErr {
util.LogErrorf("read box conf [%s] failed: %s", boxConfPath, readErr)
continue
@ -152,7 +152,7 @@ func (box *Box) GetConf() (ret *conf.BoxConf) {
return
}
data, err := filesys.LockFileRead(confPath)
data, err := filelock.LockFileRead(confPath)
if nil != err {
util.LogErrorf("read box conf [%s] failed: %s", confPath, err)
return
@ -173,7 +173,7 @@ func (box *Box) SaveConf(conf *conf.BoxConf) {
return
}
oldData, err := filesys.NoLockFileRead(confPath)
oldData, err := filelock.NoLockFileRead(confPath)
if nil != err {
box.saveConf0(newData)
return
@ -191,7 +191,7 @@ func (box *Box) saveConf0(data []byte) {
if err := os.MkdirAll(filepath.Join(util.DataDir, box.ID, ".siyuan"), 0755); nil != err {
util.LogErrorf("save box conf [%s] failed: %s", confPath, err)
}
if err := filesys.LockFileWrite(confPath, data); nil != err {
if err := filelock.LockFileWrite(confPath, data); nil != err {
util.LogErrorf("save box conf [%s] failed: %s", confPath, err)
}
}
@ -279,7 +279,7 @@ func (box *Box) Move(oldPath, newPath string) error {
boxLocalPath := filepath.Join(util.DataDir, box.ID)
fromPath := filepath.Join(boxLocalPath, oldPath)
toPath := filepath.Join(boxLocalPath, newPath)
filesys.ReleaseFileLocks(fromPath)
filelock.ReleaseFileLocks(fromPath)
if err := os.Rename(fromPath, toPath); nil != err {
msg := fmt.Sprintf(Conf.Language(5), box.Name, fromPath, err)
util.LogErrorf("move [path=%s] in box [%s] failed: %s", fromPath, box.Name, err)
@ -299,7 +299,7 @@ func (box *Box) Move(oldPath, newPath string) error {
func (box *Box) Remove(path string) error {
boxLocalPath := filepath.Join(util.DataDir, box.ID)
filePath := filepath.Join(boxLocalPath, path)
filesys.ReleaseFileLocks(filePath)
filelock.ReleaseFileLocks(filePath)
if err := os.RemoveAll(filePath); nil != err {
msg := fmt.Sprintf(Conf.Language(7), box.Name, path, err)
util.LogErrorf("remove [path=%s] in box [%s] failed: %s", path, box.ID, err)
@ -317,7 +317,7 @@ func (box *Box) Unindex() {
sql.RemoveBoxHash(tx, box.ID)
sql.DeleteByBoxTx(tx, box.ID)
sql.CommitTx(tx)
filesys.ReleaseFileLocks(filepath.Join(util.DataDir, box.ID))
filelock.ReleaseFileLocks(filepath.Join(util.DataDir, box.ID))
treenode.RemoveBlockTreesByBoxID(box.ID)
}
@ -528,5 +528,5 @@ func LockFileByBlockID(id string) (locked bool, filePath string) {
if !gulu.File.IsExist(p) {
return true, ""
}
return nil == filesys.LockFile(p), p
return nil == filelock.LockFile(p), p
}

View file

@ -34,8 +34,8 @@ import (
"github.com/88250/lute"
humanize "github.com/dustin/go-humanize"
"github.com/getsentry/sentry-go"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/conf"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
@ -386,7 +386,7 @@ func (conf *AppConf) Save() {
newData, _ := gulu.JSON.MarshalIndentJSON(Conf, "", " ")
confPath := filepath.Join(util.ConfDir, "conf.json")
oldData, err := filesys.NoLockFileRead(confPath)
oldData, err := filelock.NoLockFileRead(confPath)
if nil != err {
conf.save0(newData)
return
@ -401,7 +401,7 @@ func (conf *AppConf) Save() {
func (conf *AppConf) save0(data []byte) {
confPath := filepath.Join(util.ConfDir, "conf.json")
if err := filesys.LockFileWrite(confPath, data); nil != err {
if err := filelock.LockFileWrite(confPath, data); nil != err {
util.LogFatalf("write conf [%s] failed: %s", confPath, err)
}
}

View file

@ -40,7 +40,7 @@ import (
"github.com/88250/pdfcpu/pkg/pdfcpu"
"github.com/emirpasic/gods/sets/hashset"
"github.com/emirpasic/gods/stacks/linkedliststack"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
@ -112,7 +112,10 @@ func exportData(exportFolder string) (err error) {
return
}
filesys.ReleaseAllFileLocks()
err = filelock.ReleaseAllFileLocks()
if nil != err {
return
}
data := filepath.Join(util.WorkspaceDir, "data")
if err = stableCopy(data, exportFolder); nil != err {
@ -659,7 +662,7 @@ func exportSYZip(boxID, rootDirPath, baseFolderName string, docPaths []string) (
// 按文件夹结构复制选择的树
for _, tree := range trees {
readPath := filepath.Join(util.DataDir, tree.Box, tree.Path)
data, readErr := filesys.NoLockFileRead(readPath)
data, readErr := filelock.NoLockFileRead(readPath)
if nil != readErr {
util.LogErrorf("read file [%s] failed: %s", readPath, readErr)
continue
@ -681,7 +684,7 @@ func exportSYZip(boxID, rootDirPath, baseFolderName string, docPaths []string) (
// 引用树放在导出文件夹根路径下
for treeID, tree := range refTrees {
readPath := filepath.Join(util.DataDir, tree.Box, tree.Path)
data, readErr := filesys.NoLockFileRead(readPath)
data, readErr := filelock.NoLockFileRead(readPath)
if nil != readErr {
util.LogErrorf("read file [%s] failed: %s", readPath, readErr)
continue

View file

@ -39,6 +39,7 @@ import (
"github.com/dustin/go-humanize"
"github.com/facette/natsort"
"github.com/gin-gonic/gin"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/cache"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/search"
@ -133,9 +134,9 @@ func (box *Box) docIAL(p string) (ret map[string]string) {
filePath := filepath.Join(util.DataDir, box.ID, p)
data, err := filesys.NoLockFileRead(filePath)
data, err := filelock.NoLockFileRead(filePath)
if util.IsCorruptedSYData(data) {
filesys.UnlockFile(filePath)
filelock.UnlockFile(filePath)
if removeErr := os.RemoveAll(filePath); nil == removeErr {
util.LogInfof("removed corrupted data file [path=%s, length=%d]", filePath, len(data))
} else {
@ -1043,9 +1044,9 @@ func MoveDoc(fromBoxID, fromPath, toBoxID, toPath string) (newPath string, err e
} else {
absFromPath := filepath.Join(util.DataDir, fromBoxID, fromFolder)
absToPath := filepath.Join(util.DataDir, toBoxID, newFolder)
filesys.ReleaseFileLocks(absFromPath)
filelock.ReleaseFileLocks(absFromPath)
if gulu.File.IsExist(absToPath) {
filesys.ReleaseFileLocks(absToPath)
filelock.ReleaseFileLocks(absToPath)
os.RemoveAll(absToPath)
}
if err = os.Rename(absFromPath, absToPath); nil != err {
@ -1073,7 +1074,7 @@ func MoveDoc(fromBoxID, fromPath, toBoxID, toPath string) (newPath string, err e
} else {
absFromPath := filepath.Join(util.DataDir, fromBoxID, fromPath)
absToPath := filepath.Join(util.DataDir, toBoxID, newPath)
filesys.ReleaseFileLocks(absFromPath)
filelock.ReleaseFileLocks(absFromPath)
if err = os.Rename(absFromPath, absToPath); nil != err {
msg := fmt.Sprintf(Conf.Language(5), fromBox.Name, fromPath, err)
util.LogErrorf("move [path=%s] in box [%s] failed: %s", fromPath, fromBoxID, err)
@ -1118,7 +1119,7 @@ func RemoveDoc(boxID, p string) (err error) {
historyPath := filepath.Join(historyDir, boxID, p)
absPath := filepath.Join(util.DataDir, boxID, p)
filesys.ReleaseFileLocks(absPath)
filelock.ReleaseFileLocks(absPath)
if err = gulu.File.Copy(absPath, historyPath); nil != err {
return errors.New(fmt.Sprintf(Conf.Language(70), box.Name, absPath, err))
}
@ -1375,7 +1376,7 @@ func moveSorts(rootID, fromBox, toBox string) {
fromConfPath := filepath.Join(util.DataDir, fromBox, ".siyuan", "sort.json")
fromFullSortIDs := map[string]int{}
if gulu.File.IsExist(fromConfPath) {
data, err := filesys.LockFileRead(fromConfPath)
data, err := filelock.LockFileRead(fromConfPath)
if nil != err {
util.LogErrorf("read sort conf failed: %s", err)
return
@ -1392,7 +1393,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) {
data, err := filesys.LockFileRead(toConfPath)
data, err := filelock.LockFileRead(toConfPath)
if nil != err {
util.LogErrorf("read sort conf failed: %s", err)
return
@ -1413,7 +1414,7 @@ func moveSorts(rootID, fromBox, toBox string) {
util.LogErrorf("marshal sort conf failed: %s", err)
return
}
if err = filesys.LockFileWrite(toConfPath, data); nil != err {
if err = filelock.LockFileWrite(toConfPath, data); nil != err {
util.LogErrorf("write sort conf failed: %s", err)
return
}
@ -1490,7 +1491,7 @@ func ChangeFileTreeSort(boxID string, paths []string) {
fullSortIDs := map[string]int{}
var data []byte
if gulu.File.IsExist(confPath) {
data, err = filesys.LockFileRead(confPath)
data, err = filelock.LockFileRead(confPath)
if nil != err {
util.LogErrorf("read sort conf failed: %s", err)
return
@ -1510,7 +1511,7 @@ func ChangeFileTreeSort(boxID string, paths []string) {
util.LogErrorf("marshal sort conf failed: %s", err)
return
}
if err = filesys.LockFileWrite(confPath, data); nil != err {
if err = filelock.LockFileWrite(confPath, data); nil != err {
util.LogErrorf("write sort conf failed: %s", err)
return
}
@ -1524,7 +1525,7 @@ func (box *Box) fillSort(files *[]*File) {
return
}
data, err := filesys.LockFileRead(confPath)
data, err := filelock.LockFileRead(confPath)
if nil != err {
util.LogErrorf("read sort conf failed: %s", err)
return
@ -1571,7 +1572,7 @@ func (box *Box) removeSort(rootID, path string) {
return
}
data, err := filesys.LockFileRead(confPath)
data, err := filelock.LockFileRead(confPath)
if nil != err {
util.LogErrorf("read sort conf failed: %s", err)
return
@ -1592,7 +1593,7 @@ func (box *Box) removeSort(rootID, path string) {
util.LogErrorf("marshal sort conf failed: %s", err)
return
}
if err = filesys.LockFileWrite(confPath, data); nil != err {
if err = filelock.LockFileWrite(confPath, data); nil != err {
util.LogErrorf("write sort conf failed: %s", err)
return
}
@ -1601,8 +1602,8 @@ func (box *Box) removeSort(rootID, path string) {
func ServeFile(c *gin.Context, filePath string) (err error) {
WaitForWritingFiles()
if filesys.IsLocked(filePath) {
if err = filesys.UnlockFile(filePath); nil == err {
if filelock.IsLocked(filePath) {
if err = filelock.UnlockFile(filePath); nil == err {
util.LogInfof("unlocked file [%s]", filePath)
} else {
msg := fmt.Sprintf("unlock file [%s] failed: %s", filePath, err)

View file

@ -25,7 +25,7 @@ import (
"github.com/88250/lute/ast"
"github.com/88250/lute/parse"
"github.com/88250/lute/render"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -102,7 +102,7 @@ func generateFormatHistory(tree *parse.Tree) {
}
var data []byte
if data, err = filesys.NoLockFileRead(filepath.Join(util.DataDir, tree.Box, tree.Path)); err != nil {
if data, err = filelock.NoLockFileRead(filepath.Join(util.DataDir, tree.Box, tree.Path)); err != nil {
util.LogErrorf("generate history failed: %s", err)
return
}

View file

@ -28,8 +28,8 @@ import (
"github.com/88250/gulu"
"github.com/88250/protyle"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/conf"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -133,7 +133,7 @@ func GetDocHistoryContent(historyPath string) (content string, err error) {
return
}
data, err := filesys.NoLockFileRead(historyPath)
data, err := filelock.NoLockFileRead(historyPath)
if nil != err {
util.LogErrorf("read file [%s] failed: %s", historyPath, err)
return
@ -162,7 +162,7 @@ func RollbackDocHistory(boxID, historyPath string) (err error) {
baseName := filepath.Base(historyPath)
id := strings.TrimSuffix(baseName, ".sy")
filesys.ReleaseFileLocks(filepath.Join(util.DataDir, boxID))
filelock.ReleaseFileLocks(filepath.Join(util.DataDir, boxID))
workingDoc := treenode.GetBlockTree(id)
if nil != workingDoc {
if err = os.RemoveAll(filepath.Join(util.DataDir, boxID, workingDoc.Path)); nil != err {
@ -285,7 +285,7 @@ func GetDocHistory(boxID string) (ret []*History, err error) {
return nil
}
data, err := filesys.NoLockFileRead(path)
data, err := filelock.NoLockFileRead(path)
if nil != err {
util.LogErrorf("read file [%s] failed: %s", path, err)
return nil
@ -489,7 +489,7 @@ func (box *Box) generateDocHistory0() {
}
var data []byte
if data, err = filesys.NoLockFileRead(file); err != nil {
if data, err = filelock.NoLockFileRead(file); err != nil {
util.LogErrorf("generate history failed: %s", err)
return
}

View file

@ -39,6 +39,7 @@ import (
"github.com/88250/lute/parse"
"github.com/88250/protyle"
"github.com/mattn/go-zglob"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
@ -253,7 +254,7 @@ func ImportSY(zipPath, boxID, toPath string) (err error) {
writingDataLock.Lock()
defer writingDataLock.Unlock()
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
var baseTargetPath string
if "/" == toPath {
@ -330,7 +331,7 @@ func ImportData(zipPath string) (err error) {
writingDataLock.Lock()
defer writingDataLock.Unlock()
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
tmpDataPath := filepath.Dir(filepath.Dir(confPath))
if err = stableCopy(tmpDataPath, util.DataDir); nil != err {
util.LogErrorf("copy data dir from [%s] to [%s] failed: %s", tmpDataPath, util.DataDir, err)

View file

@ -31,6 +31,7 @@ import (
"github.com/88250/lute/parse"
"github.com/dustin/go-humanize"
"github.com/emirpasic/gods/sets/hashset"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/cache"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
@ -69,7 +70,7 @@ func (box *Box) BootIndex() {
// 缓存块树
treenode.IndexBlockTree(tree)
if 1 < i && 0 == i%64 {
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
}
i++
}
@ -130,7 +131,7 @@ func (box *Box) Index(fullRebuildIndex bool) (treeCount int, treeSize int64) {
idHashMap[tree.ID] = tree.Hash
if 1 < i && 0 == i%64 {
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(88), i, len(files)-i))
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
}
i++
}
@ -210,7 +211,7 @@ func (box *Box) Index(fullRebuildIndex bool) (treeCount int, treeSize int64) {
}
if 1 < i && 0 == i%64 {
util.PushEndlessProgress(fmt.Sprintf("["+box.Name+"] "+Conf.Language(53), i, treeCount-i))
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
}
i++
}
@ -348,7 +349,7 @@ func IndexRefs() {
}
if 1 < i && 0 == i%64 {
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(55), i))
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
}
i++
}

View file

@ -27,7 +27,7 @@ import (
"github.com/88250/gulu"
"github.com/88250/lute/ast"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -87,7 +87,7 @@ func RemoveBox(boxID string) (err error) {
return errors.New(fmt.Sprintf("can not remove [%s] caused by it is not a dir", boxID))
}
filesys.ReleaseFileLocks(localPath)
filelock.ReleaseFileLocks(localPath)
if !isUserGuide(boxID) {
var historyDir string
historyDir, err = util.GetHistoryDir("delete")

View file

@ -27,7 +27,7 @@ import (
"github.com/siyuan-note/dejavu"
"github.com/siyuan-note/dejavu/entity"
"github.com/siyuan-note/encryption"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/util"
)
@ -136,7 +136,7 @@ func CheckoutRepo(id string) (err error) {
defer writingDataLock.Unlock()
WaitForWritingFiles()
sql.WaitForWritingDatabase()
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
CloseWatchAssets()
defer WatchAssets()
@ -196,8 +196,7 @@ func IndexRepo(memo string) (err error) {
defer writingDataLock.Unlock()
WaitForWritingFiles()
sql.WaitForWritingDatabase()
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
_, err = repo.Index(memo, util.PushEndlessProgress, indexCallbacks)
util.PushClearProgress()
return

View file

@ -37,6 +37,7 @@ import (
"github.com/emirpasic/gods/sets/hashset"
"github.com/mattn/go-zglob"
"github.com/siyuan-note/encryption"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/cache"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
@ -584,7 +585,7 @@ func syncDir2WorkspaceData(boot bool) (upsertFiles, removeFiles []string, err er
// 2. 将 data 中新增/修改的文件加密后拷贝到 sync 中
func workspaceData2SyncDir() (removeList, upsertList map[string]bool, err error) {
start := time.Now()
filesys.ReleaseAllFileLocks()
filelock.ReleaseAllFileLocks()
passwd := Conf.E2EEPasswd
unchangedDataList, removeList, err := calcUnchangedDataList(passwd)
@ -653,7 +654,7 @@ func genCloudIndex(localDirPath string, excludes map[string]bool, calcHash bool)
util.LogErrorf("marshal sync cloud index failed: %s", err)
return
}
if err = os.WriteFile(filepath.Join(localDirPath, "index.json"), data, 0644); nil != err {
if err = gulu.File.WriteFileSafer(filepath.Join(localDirPath, "index.json"), data, 0644); nil != err {
util.LogErrorf("write sync cloud index failed: %s", err)
return
}
@ -747,7 +748,7 @@ func recoverSyncData(metaPath, indexPath string, modified map[string]bool) (decr
}
}
if err0 = os.WriteFile(plainP, data, 0644); nil != err0 {
if err0 = gulu.File.WriteFileSafer(plainP, data, 0644); nil != err0 {
util.LogErrorf("write file [%s] failed: %s", plainP, err0)
err = err0
return io.EOF
@ -820,7 +821,7 @@ func prepareSyncData(passwd string, unchangedDataList map[string]bool) (encrypte
return io.EOF
}
data, err0 := filesys.NoLockFileRead(path)
data, err0 := filelock.NoLockFileRead(path)
if nil != err0 {
util.LogErrorf("read file [%s] failed: %s", path, err0)
err = err0
@ -835,7 +836,7 @@ func prepareSyncData(passwd string, unchangedDataList map[string]bool) (encrypte
}
}
err0 = os.WriteFile(p, data, 0644)
err0 = gulu.File.WriteFileSafer(p, data, 0644)
if nil != err0 {
util.LogErrorf("write file [%s] failed: %s", p, err0)
err = err0
@ -894,7 +895,7 @@ func prepareSyncData(passwd string, unchangedDataList map[string]bool) (encrypte
util.LogErrorf("encrypt file failed: %s", err)
return
}
if err = os.WriteFile(filepath.Join(encryptedDataDir, pathJSON), data, 0644); nil != err {
if err = gulu.File.WriteFileSafer(filepath.Join(encryptedDataDir, pathJSON), data, 0644); nil != err {
return
}
return
@ -1077,13 +1078,13 @@ func getWorkspaceDataConf() (conf *filesys.DataConf, err error) {
if !gulu.File.IsExist(confPath) {
os.MkdirAll(filepath.Dir(confPath), 0755)
data, _ := gulu.JSON.MarshalIndentJSON(conf, "", " ")
if err = os.WriteFile(confPath, data, 0644); nil != err {
if err = filelock.NoLockFileWrite(confPath, data); nil != err {
util.LogErrorf("save sync conf [%s] failed: %s", confPath, err)
}
return
}
data, err := os.ReadFile(confPath)
data, err := filelock.NoLockFileRead(confPath)
if nil != err {
util.LogErrorf("read sync conf [%s] failed: %s", confPath, err)
return
@ -1106,7 +1107,7 @@ func incLocalSyncVer() {
conf.SyncVer++
data, _ := gulu.JSON.MarshalIndentJSON(conf, "", " ")
confPath := filepath.Join(Conf.Sync.GetSaveDir(), ".siyuan", "conf.json")
if err = os.WriteFile(confPath, data, 0644); nil != err {
if err = gulu.File.WriteFileSafer(confPath, data, 0644); nil != err {
util.LogErrorf("save sync conf [%s] failed: %s", confPath, err)
}
return
@ -1204,7 +1205,7 @@ func genSyncHistory(now, p string) {
relativePath := strings.TrimPrefix(p, util.DataDir)
historyPath := filepath.Join(historyDir, relativePath)
filesys.ReleaseFileLocks(p)
filelock.ReleaseFileLocks(p)
if err = gulu.File.Copy(p, historyPath); nil != err {
util.LogErrorf("gen sync history failed: %s", err)
return
@ -1258,7 +1259,7 @@ func getSyncIgnoreList() (ret *hashset.Set) {
ignore := filepath.Join(util.DataDir, ".siyuan", "syncignore")
os.MkdirAll(filepath.Dir(ignore), 0755)
if !gulu.File.IsExist(ignore) {
if err := os.WriteFile(ignore, nil, 0644); nil != err {
if err := gulu.File.WriteFileSafer(ignore, nil, 0644); nil != err {
util.LogErrorf("create syncignore [%s] failed: %s", ignore, err)
return
}

View file

@ -32,8 +32,8 @@ import (
"github.com/88250/lute/parse"
util2 "github.com/88250/lute/util"
"github.com/emirpasic/gods/sets/hashset"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/cache"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
@ -434,7 +434,7 @@ func (tx *Transaction) doPrependInsert(operation *Operation) (ret *TxErr) {
return &TxErr{code: TxErrCodeBlockNotFound, id: operation.ParentID}
}
tree, err := tx.loadTree(block.ID)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
return &TxErr{code: TxErrCodeUnableLockFile, msg: err.Error(), id: block.ID}
}
if nil != err {
@ -522,7 +522,7 @@ func (tx *Transaction) doAppendInsert(operation *Operation) (ret *TxErr) {
return &TxErr{code: TxErrCodeBlockNotFound, id: operation.ParentID}
}
tree, err := tx.loadTree(block.ID)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
return &TxErr{code: TxErrCodeUnableLockFile, msg: err.Error(), id: block.ID}
}
if nil != err {
@ -723,7 +723,7 @@ func (tx *Transaction) doLargeInsert() (ret *TxErr) {
}
id := parentBlock.ID
tree, err := tx.loadTree(id)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
return &TxErr{code: TxErrCodeUnableLockFile, msg: err.Error(), id: id}
}
if nil != err {
@ -784,7 +784,7 @@ func (tx *Transaction) doDelete(operation *Operation) (ret *TxErr) {
var err error
id := operation.ID
tree, err := tx.loadTree(id)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
return &TxErr{code: TxErrCodeUnableLockFile, msg: err.Error(), id: id}
}
if ErrBlockNotFound == err {
@ -835,7 +835,7 @@ func (tx *Transaction) doInsert(operation *Operation) (ret *TxErr) {
}
}
tree, err := tx.loadTree(block.ID)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
return &TxErr{code: TxErrCodeUnableLockFile, msg: err.Error(), id: block.ID}
}
if nil != err {
@ -969,7 +969,7 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) {
id := operation.ID
tree, err := tx.loadTree(id)
if filesys.ErrUnableLockFile == err {
if errors.Is(err, filelock.ErrUnableLockFile) {
return &TxErr{code: TxErrCodeUnableLockFile, msg: err.Error(), id: id}
}
if nil != err {

View file

@ -24,6 +24,7 @@ import (
"github.com/88250/lute/parse"
"github.com/88250/protyle"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
@ -40,7 +41,7 @@ func loadTrees(localPath string) (ret []*parse.Tree) {
return nil
}
data, err := filesys.NoLockFileRead(path)
data, err := filelock.NoLockFileRead(path)
if nil != err {
util.LogErrorf("get data [path=%s] failed: %s", path, err)
return nil

View file

@ -38,24 +38,6 @@ func IsEmptyDir(p string) bool {
return 1 > len(files)
}
func IsValidJSON(p string) bool {
if !gulu.File.IsExist(p) {
return false
}
data, err := os.ReadFile(p)
if nil != err {
LogErrorf("read json file [%s] failed: %s", p, err)
return false
}
json := map[string]interface{}{}
if err = gulu.JSON.UnmarshalJSON(data, &json); nil != err {
LogErrorf("parse json file [%s] failed: %s", p, err)
return false
}
return true
}
func RemoveID(name string) string {
ext := path.Ext(name)
name = strings.TrimSuffix(name, ext)