Упрощение git/превью: copyCodeBlock, parseBlocks на splitMdBlocks, кэш diff, пагинация
- MdParser.copyCodeBlock(id): один вызов вместо get+copy в 3 QML-местах - parseBlocks переписан на splitMdBlocks (убит regex только для ```, заодно чинит ~~~); renderInner без побочек, save/restore удалены - Кэш diff-блоков (хеши+пути, 8 шт, >1МБ не кэшируем); регистрация кодов всегда в главном потоке - История: пагинация limit+Показать ещё с сохранением выбора; willDelete; busy только на время async - GitManager: commitFile точечно (общий commitFromIndex), fileExistedAt, workdirContent через DocumentManager.readTextFile, fileGitStatus через relativePath; удалены fileDiffText/Html и 2-arg fileHistory - MarkdownView: дебаунс async-ветки 80мс + гашение протухших ответов
This commit is contained in:
+14
-14
@@ -49,7 +49,7 @@ int main(int argc, char *argv[])
|
||||
if(!git.hasCommits(vault)) return fail("hasCommits");
|
||||
|
||||
// История после v1: 1 элемент
|
||||
QVariantList hist = git.fileHistory(vault, file);
|
||||
QVariantList hist = git.fileHistory(vault, file, 500);
|
||||
if(hist.size()!=1) return fail("hist size 1", QString::number(hist.size()));
|
||||
QString hash1 = hist.first().toMap().value("hash").toString();
|
||||
QString short1 = hist.first().toMap().value("shortHash").toString();
|
||||
@@ -73,7 +73,7 @@ int main(int argc, char *argv[])
|
||||
QThread::msleep(1100); // чтобы время коммита отличалось
|
||||
QFile f2(file); f2.open(QIODevice::WriteOnly | QIODevice::Truncate); f2.write("Версия 2\nСтрока A\nСтрока B\n"); f2.close();
|
||||
if(!git.commitAll(vault, "v2 - добавили строку B")) return fail("commit v2", git.lastError());
|
||||
QVariantList hist2 = git.fileHistory(vault, file);
|
||||
QVariantList hist2 = git.fileHistory(vault, file, 500);
|
||||
if(hist2.size()!=2) return fail("hist size 2", QString::number(hist2.size()));
|
||||
// Новый сверху
|
||||
QString hash2 = hist2.first().toMap().value("hash").toString();
|
||||
@@ -94,7 +94,7 @@ int main(int argc, char *argv[])
|
||||
QString other = vault+"/other.md";
|
||||
QFile of(other); of.open(QIODevice::WriteOnly); of.write("other\n"); of.close();
|
||||
if(!git.commitAll(vault, "add other")) return fail("commit other");
|
||||
QVariantList histAfterOther = git.fileHistory(vault, file);
|
||||
QVariantList histAfterOther = git.fileHistory(vault, file, 500);
|
||||
if(histAfterOther.size()!=2) return fail("hist after other should still 2", QString::number(histAfterOther.size()));
|
||||
|
||||
// Восстановление назад к v1
|
||||
@@ -103,7 +103,7 @@ int main(int argc, char *argv[])
|
||||
QFile check(file); check.open(QIODevice::ReadOnly); QString cur = QString::fromUtf8(check.readAll());
|
||||
if(!cur.contains("Версия 1") || cur.contains("Строка B")) return fail("after restore v1 content", cur);
|
||||
// История после восстановления должна иметь 3 элемента (v1, v2, восстановление)
|
||||
QVariantList hist3 = git.fileHistory(vault, file);
|
||||
QVariantList hist3 = git.fileHistory(vault, file, 500);
|
||||
if(hist3.size()!=3) return fail("hist after restore size 3", QString::number(hist3.size()));
|
||||
if(!hist3.first().toMap().value("message").toString().contains("Восстановление")) return fail("restore commit message", hist3.first().toMap().value("message").toString());
|
||||
// lastModified должно быть сейчас (только что)
|
||||
@@ -117,14 +117,14 @@ int main(int argc, char *argv[])
|
||||
if(!err.isEmpty()) return fail("restore forward to v2", err);
|
||||
QFile check2(file); check2.open(QIODevice::ReadOnly); QString cur2 = QString::fromUtf8(check2.readAll());
|
||||
if(!cur2.contains("Версия 2")) return fail("after restore forward v2", cur2);
|
||||
QVariantList hist4 = git.fileHistory(vault, file);
|
||||
QVariantList hist4 = git.fileHistory(vault, file, 500);
|
||||
if(hist4.size()!=4) return fail("hist after forward restore 4", QString::number(hist4.size()));
|
||||
|
||||
// Ещё одно изменение вручную вперёд
|
||||
QThread::msleep(1100);
|
||||
QFile f3(file); f3.open(QIODevice::WriteOnly | QIODevice::Truncate); f3.write("Версия 3\nНовая строка\n"); f3.close();
|
||||
if(!git.commitAll(vault, "v3")) return fail("commit v3");
|
||||
QVariantList hist5 = git.fileHistory(vault, file);
|
||||
QVariantList hist5 = git.fileHistory(vault, file, 500);
|
||||
if(hist5.size()!=5) return fail("hist 5", QString::number(hist5.size()));
|
||||
if(hist5.first().toMap().value("message").toString()!="v3") return fail("top v3");
|
||||
|
||||
@@ -146,7 +146,7 @@ int main(int argc, char *argv[])
|
||||
QFile f4(file); f4.open(QIODevice::WriteOnly | QIODevice::Append); f4.write("\nauto\n"); f4.close();
|
||||
bool autoOk = git.autoCommit(vault, file);
|
||||
if(!autoOk) return fail("autoCommit", git.lastError());
|
||||
QVariantList histAuto = git.fileHistory(vault, file);
|
||||
QVariantList histAuto = git.fileHistory(vault, file, 500);
|
||||
if(histAuto.size()!=6) return fail("hist after auto 6", QString::number(histAuto.size()));
|
||||
if(!histAuto.first().toMap().value("message").toString().contains("Автосохранение")) return fail("auto message", histAuto.first().toMap().value("message").toString());
|
||||
|
||||
@@ -156,7 +156,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Пагинация: limit режет сверху, порядок новые сверху, кэш консистентен
|
||||
{
|
||||
QVariantList full = git.fileHistory(vault, file);
|
||||
QVariantList full = git.fileHistory(vault, file, 500);
|
||||
QVariantList part = git.fileHistory(vault, file, 2);
|
||||
if(part.size()!=2) return fail("paged size", QString::number(part.size()));
|
||||
if(part.first().toMap().value("hash") != full.first().toMap().value("hash"))
|
||||
@@ -180,7 +180,7 @@ int main(int argc, char *argv[])
|
||||
lf.write("late\n");
|
||||
lf.close();
|
||||
if(!git.commitAll(vault, "late file")) return fail("commit late", git.lastError());
|
||||
QString lateHash = git.fileHistory(vault, late).first().toMap().value("hash").toString();
|
||||
QString lateHash = git.fileHistory(vault, late, 500).first().toMap().value("hash").toString();
|
||||
if(!git.fileExistedAt(vault, late, lateHash)) return fail("late existed");
|
||||
if(git.fileExistedAt(vault, late, hash1)) return fail("late should not exist at v1");
|
||||
if(git.fileExistedAt(vault, late, "0000000000000000000000000000000000000000"))
|
||||
@@ -194,17 +194,17 @@ int main(int argc, char *argv[])
|
||||
re.write("v-final\n");
|
||||
re.close();
|
||||
if(!git.commitFile(vault, file, "final A")) return fail("commitFile A", git.lastError());
|
||||
const int histA = git.fileHistory(vault, file).size();
|
||||
const int histA = git.fileHistory(vault, file, 500).size();
|
||||
// правим оба файла
|
||||
QFile fa(file);
|
||||
fa.open(QIODevice::WriteOnly | QIODevice::Append); fa.write("more A\n"); fa.close();
|
||||
QFile fb(vault+"/other.md");
|
||||
fb.open(QIODevice::WriteOnly | QIODevice::Append); fb.write("more B\n"); fb.close();
|
||||
const int histBBefore = git.fileHistory(vault, vault+"/other.md").size();
|
||||
const int histBBefore = git.fileHistory(vault, vault+"/other.md", 500).size();
|
||||
if(!git.commitFile(vault, file, "final B")) return fail("commitFile B", git.lastError());
|
||||
if(git.fileHistory(vault, file).size() != histA + 1) return fail("commitFile history A");
|
||||
if(git.fileHistory(vault, vault+"/other.md").size() != histBBefore) return fail("commitFile затронул B");
|
||||
if(!git.fileHistory(vault, file).first().toMap().value("message").toString().contains("final B"))
|
||||
if(git.fileHistory(vault, file, 500).size() != histA + 1) return fail("commitFile history A");
|
||||
if(git.fileHistory(vault, vault+"/other.md", 500).size() != histBBefore) return fail("commitFile затронул B");
|
||||
if(!git.fileHistory(vault, file, 500).first().toMap().value("message").toString().contains("final B"))
|
||||
return fail("commitFile message");
|
||||
// commitFile без изменений — false с понятной ошибкой, как commitAll
|
||||
if(git.commitFile(vault, file, "noop")) return fail("commitFile noop should fail");
|
||||
|
||||
@@ -186,6 +186,15 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
// ~~~-заборы тоже разбираются на code-блоки (единая разбивка splitMdBlocks)
|
||||
{
|
||||
auto b = p.parseBlocks("~~~\ncode\n~~~\n", vault, fileDir);
|
||||
if (b.size() != 1 || b[0].toMap().value("type").toString() != "code")
|
||||
return fail("tilde fence");
|
||||
if (!b[0].toMap().value("codeText").toString().contains("code"))
|
||||
return fail("tilde code");
|
||||
}
|
||||
|
||||
// parseBlocksWithDiff: правка в обычном тексте — два отдельных tinted-блока
|
||||
// (del, затем add), как стандартный diff; словного уровня нет
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user