Git: кэш+пагинация истории, diff в потоке, точечный коммит, честное удаление

- История: кэш по vault|rel|headOid, fileHistory(vault,file,limit), в диалоге Показать ещё по 60 с сохранением выбора
- Diff считается в QtConcurrent-пуле (parseBlocksWithDiffAsync+blocksReady, stale-guard), спиннер busy; MarkdownView.diffApplied
- commitFile точечно вместо всего хранилища (общий commitFromIndex), autoCommit честный; fileExistedAt + willDelete в подтверждении
- DocumentManager.readTextFile общий (GitManager.workdirContent через него); fileGitStatus через relativePath
- Тесты: пагинация/кэш, existed, commitFile не трогает B, async==sync
This commit is contained in:
2026-09-06 21:17:25 +03:00
parent f6074df0fc
commit 0846605c2b
12 changed files with 474 additions and 138 deletions
+22 -4
View File
@@ -10,19 +10,24 @@ Item {
property string fileDir: ""
property string emptyText: qsTr("Пустой файл — начните писать в режиме редактирования")
// Если задан — markdown считается старой версией и подсвечиваются отличия от него
// (блоки del — только в markdown, add — только в compareMarkdown)
// (блоки del — только в markdown, add — только в compareMarkdown).
// Сравнение считается в рабочем потоке, чтобы UI не висел на больших файлах.
property string compareMarkdown: ""
property int _diffReq: -1
implicitHeight: column.implicitHeight + 24
signal linkActivated(string href)
signal diffApplied()
// Для обновления
function update() {
if (compareMarkdown.length > 0) {
_diffReq = mdParser.parseBlocksWithDiffAsync(markdown, compareMarkdown, vaultRoot, fileDir)
return
}
// Триггерим пересборку блоков
blocksModel.clear()
const blocks = compareMarkdown.length > 0
? mdParser.parseBlocksWithDiff(markdown, compareMarkdown, vaultRoot, fileDir)
: mdParser.parseBlocks(markdown, vaultRoot, fileDir)
const blocks = mdParser.parseBlocks(markdown, vaultRoot, fileDir)
for (let i = 0; i < blocks.length; i++) {
blocksModel.append(blocks[i])
}
@@ -30,6 +35,19 @@ Item {
// contentItem.contentY = 0
}
Connections {
target: mdParser
function onBlocksReady(reqId, blocks) {
if (reqId !== root._diffReq)
return // устарел — уже запрошен более свежий
blocksModel.clear()
for (let i = 0; i < blocks.length; i++) {
blocksModel.append(blocks[i])
}
root.diffApplied()
}
}
onMarkdownChanged: update()
onCompareMarkdownChanged: update()
onVaultRootChanged: update()