Conversation
Данные на диске -- UTF-8, движок держит текст в UTF-8, переводить при записи нечего. Последним местом, писавшим файл в KOI8-R, оставался craft.cpp: XML-декларация заявляла encoding="koi8-r", и байты уходили через native_text::write_file. Теперь и декларация, и байты -- UTF-8, как у мира, cfg, state и userdata. Следом уходят сами функции: to_disk (вместе с предохранителем внутри неё), перекодирующий write_file и мёртвая from_utf8 (ноль вызовов). write_file_native переименован обратно в write_file -- отдельное имя было нужно, только пока рядом жил перекодирующий двойник. Парольные вызовы переведены на явный to_koi8. Перекодировка там остаётся, но она про формат СОХРАНЁННЫХ хэшей, а не про кодировку диска: хэши посчитаны по кои-восьмым байтам, и сменить это можно только перехэшированием при успешном входе. Под именем to_disk это читалось как граница диска, которой больше нет, и напрашивалось на переиспользование. Заодно поправлены комментарии, ссылавшиеся на исчезнувшую функцию, и шапка native_text.h, где диск всё ещё числился кои-восьмым. Тесты границы записи заменены тестом границы чтения: она пока остаётся -- файл, написанный до миграции, ещё может попасться. Её снятие -- следующий шаг #3826.
|
Посмотрел ветку, пока она висит в draft. Слил её с нынешним master во временной ветке: конфликтов нет, собирается без предупреждений, 722 теста проходят (в master 723 — здесь два теста границы записи заменены одним тестом границы чтения). По сути правка верная. Два замечания. 1. Уходит предохранитель на записи. Вместе с 2. Мёртвая строка в Всё остальное чисто — из draft можно выводить. |
Вместе с to_disk уходил её предохранитель -- жалоба в лог, когда на диск идут не-UTF-8 байты. Граница чтения при этом остаётся, и в комментариях этой же ветки сказано, что файл, написанный до миграции, ещё может попасться. Значит состояние, от которого предохранитель защищал, всё ещё возможно, а сигнала о нём не было бы: кои-восьмые байты уехали бы в файл молча. Проверка переехала в write_file. glory_const писал в документ атрибут encoding="koi8-r", но у xml_document атрибутов нет: в готовом файле стоит просто <?xml version="1.0"?>. Строка мёртвая, а ветка как раз убирает последнее объявление koi8-r в записи. Заодно в ветку влит master: она отстала на две с лишним сотни коммитов. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Поправил по своему же разбору, раз добро получено:
Сборка чистая, 722 теста проходят. PR всё ещё в draft — снимать статус вам. |
Пункты 1 и 2 из #3826. Данные на диске — UTF-8, движок держит текст в UTF-8, переводить при
записи нечего.
Что убрано
Последняя запись в KOI8-R.
craft.cppзаявлял в XML-декларацииencoding="koi8-r"и гнал байты через
native_text::write_file. Теперь и декларация, и байты — UTF-8, каку мира, cfg, state и userdata.
Сами функции.
to_disk(вместе с предохранителем внутри неё), перекодирующийwrite_fileи мёртвая
from_utf8— ноль вызовов.write_file_native(3 вызова) переименован обратнов
write_file: отдельное имя было нужно, только пока рядом жил перекодирующий двойник.Пароли: перекодировка осталась, но названа честно
password.cppиaccounts.cppпереведены на явныйto_koi8. Перекодировка там нужна, но онапро формат сохранённых хэшей, а не про кодировку диска: хэши посчитаны по кои-восьмым байтам,
и сменить это можно только перехэшированием при успешном входе. Под именем
to_diskэто читалоськак граница диска, которой больше нет, — и напрашивалось на переиспользование.
Тест
HashIsTakenOverTheOnDiskFormпереименован и переписан под ту же мысль: свойство проверяетсято же самое (два разных набора байт с одной кои-восьмой формой дают один хэш), но перестало
называться «дисковой формой».
Что осталось
Граница чтения (
from_disk_line/from_disk_text/read_data_file) — на месте: файл,написанный до миграции, ещё может попасться. Её снятие вместе с исходящим предохранителем —
следующий шаг #3826, и вот он уже точка невозврата.
Тесты границы записи заменены тестом границы чтения — проверяет разделитель и его
идемпотентность. Заодно поправлены комментарии, ссылавшиеся на исчезнувшую функцию,
и шапка
native_text.h, где диск всё ещё числился кои-восьмым.Сборка без предупреждений, 691 тест проходит.