mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-07 01:08:49 +01:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
4d8b5e6f68
5 changed files with 65 additions and 14 deletions
12
app/changelogs/v2.10.6/v2.10.6.md
Normal file
12
app/changelogs/v2.10.6/v2.10.6.md
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
## Overview
|
||||
|
||||
This version fixes some defects, it is recommended to upgrade.
|
||||
|
||||
Advertisement: Currently, `PRO Features` are in the early bird price stage, welcome to [learn more](https://b3log.org/siyuan/pricing.html).
|
||||
|
||||
Note: The annual `Subscription` includes `Pro features`. If you are an annual subscriber, you do not need to buy PRO Features separately.
|
||||
|
||||
## Changelogs
|
||||
|
||||
Below are the detailed changes in this version.
|
||||
|
||||
11
app/changelogs/v2.10.6/v2.10.6_zh_CHT.md
Normal file
11
app/changelogs/v2.10.6/v2.10.6_zh_CHT.md
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
## 概述
|
||||
|
||||
該版本修復了一些缺陷,建議升級。
|
||||
|
||||
廣告: 目前 `功能特性` 正處於早鳥價階段,歡迎[了解](https://b3log.org/siyuan/pricing.html)。
|
||||
|
||||
注:`年付訂閱` 包含 `功能特性`,如果你是訂閱會員,則無需單獨購買功能特性。
|
||||
|
||||
## 變更記錄
|
||||
|
||||
以下是此版本中的詳細變更。
|
||||
13
app/changelogs/v2.10.6/v2.10.6_zh_CN.md
Normal file
13
app/changelogs/v2.10.6/v2.10.6_zh_CN.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
## 概述
|
||||
|
||||
该版本修复了一些缺陷,建议升级。
|
||||
|
||||
广告: 目前 `功能特性` 正处于早鸟价阶段,欢迎[了解](https://b3log.org/siyuan/pricing.html)。
|
||||
|
||||
注:`年付订阅` 包含 `功能特性`,如果你是订阅会员,则无需单独购买功能特性。
|
||||
|
||||
## 变更记录
|
||||
|
||||
以下是此版本中的详细变更。
|
||||
|
||||
|
||||
|
|
@ -53,12 +53,16 @@ func performTransactions(c *gin.Context) {
|
|||
return
|
||||
}
|
||||
|
||||
timestamp := int64(arg["reqId"].(float64))
|
||||
var transactions []*model.Transaction
|
||||
if err = gulu.JSON.UnmarshalJSON(data, &transactions); nil != err {
|
||||
ret.Code = -1
|
||||
ret.Msg = "parses request failed"
|
||||
return
|
||||
}
|
||||
for _, transaction := range transactions {
|
||||
transaction.Timestamp = timestamp
|
||||
}
|
||||
|
||||
model.PerformTransactions(&transactions)
|
||||
|
||||
|
|
|
|||
|
|
@ -18,8 +18,10 @@ package model
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
|
@ -152,6 +154,9 @@ func mergeTx() (ret *Transaction) {
|
|||
func PerformTransactions(transactions *[]*Transaction) {
|
||||
txQueueLock.Lock()
|
||||
txQueue = append(txQueue, *transactions...)
|
||||
sort.Slice(txQueue, func(i, j int) bool {
|
||||
return txQueue[i].Timestamp < txQueue[j].Timestamp
|
||||
})
|
||||
txQueueLock.Unlock()
|
||||
return
|
||||
}
|
||||
|
|
@ -449,9 +454,9 @@ func (tx *Transaction) doPrependInsert(operation *Operation) (ret *TxErr) {
|
|||
var err error
|
||||
block := treenode.GetBlockTree(operation.ParentID)
|
||||
if nil == block {
|
||||
msg := fmt.Sprintf("not found parent block [%s]", operation.ParentID)
|
||||
logging.LogErrorf(msg)
|
||||
return &TxErr{code: TxErrCodeBlockNotFound, id: operation.ParentID}
|
||||
logging.LogWarnf("not found block [%s]", operation.ParentID)
|
||||
util.ReloadUI() // 比如分屏后编辑器状态不一致,这里强制重新载入界面
|
||||
return
|
||||
}
|
||||
tree, err := tx.loadTree(block.ID)
|
||||
if nil != err {
|
||||
|
|
@ -533,9 +538,9 @@ func (tx *Transaction) doAppendInsert(operation *Operation) (ret *TxErr) {
|
|||
var err error
|
||||
block := treenode.GetBlockTree(operation.ParentID)
|
||||
if nil == block {
|
||||
msg := fmt.Sprintf("not found parent block [%s]", operation.ParentID)
|
||||
logging.LogErrorf(msg)
|
||||
return &TxErr{code: TxErrCodeBlockNotFound, id: operation.ParentID}
|
||||
logging.LogWarnf("not found block [%s]", operation.ParentID)
|
||||
util.ReloadUI() // 比如分屏后编辑器状态不一致,这里强制重新载入界面
|
||||
return
|
||||
}
|
||||
tree, err := tx.loadTree(block.ID)
|
||||
if nil != err {
|
||||
|
|
@ -692,11 +697,12 @@ func (tx *Transaction) doDelete(operation *Operation) (ret *TxErr) {
|
|||
var err error
|
||||
id := operation.ID
|
||||
tree, err := tx.loadTree(id)
|
||||
if ErrBlockNotFound == err {
|
||||
return nil // move 以后这里会空,算作正常情况
|
||||
}
|
||||
|
||||
if nil != err {
|
||||
if errors.Is(err, ErrBlockNotFound) {
|
||||
// move 以后这里会空,算作正常情况
|
||||
return
|
||||
}
|
||||
|
||||
msg := fmt.Sprintf("load tree [%s] failed: %s", id, err)
|
||||
logging.LogErrorf(msg)
|
||||
return &TxErr{code: TxErrCodeBlockNotFound, id: id}
|
||||
|
|
@ -773,9 +779,9 @@ func (tx *Transaction) doInsert(operation *Operation) (ret *TxErr) {
|
|||
}
|
||||
}
|
||||
if nil == block {
|
||||
msg := fmt.Sprintf("not found next block [%s]", operation.NextID)
|
||||
logging.LogErrorf(msg)
|
||||
return &TxErr{code: TxErrCodeBlockNotFound, id: operation.NextID}
|
||||
logging.LogWarnf("not found block [%s, %s, %s]", operation.ParentID, operation.PreviousID, operation.NextID)
|
||||
util.ReloadUI() // 比如分屏后编辑器状态不一致,这里强制重新载入界面
|
||||
return
|
||||
}
|
||||
|
||||
tree, err := tx.loadTree(block.ID)
|
||||
|
|
@ -919,9 +925,13 @@ func (tx *Transaction) doInsert(operation *Operation) (ret *TxErr) {
|
|||
|
||||
func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) {
|
||||
id := operation.ID
|
||||
|
||||
tree, err := tx.loadTree(id)
|
||||
if nil != err {
|
||||
if errors.Is(err, ErrBlockNotFound) {
|
||||
logging.LogWarnf("not found block [%s]", id)
|
||||
return
|
||||
}
|
||||
|
||||
logging.LogErrorf("load tree [%s] failed: %s", id, err)
|
||||
return &TxErr{code: TxErrCodeBlockNotFound, id: id}
|
||||
}
|
||||
|
|
@ -1101,6 +1111,7 @@ type Operation struct {
|
|||
}
|
||||
|
||||
type Transaction struct {
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
DoOperations []*Operation `json:"doOperations"`
|
||||
UndoOperations []*Operation `json:"undoOperations"`
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue