fix(1c): Выбирать кодировку 1cestart.cfg по результату, а не по отсутствию ошибки - #45
Merged
Merged
Conversation
…ствию ошибки Перебор останавливался на первом кодеке, который не бросил исключение, а utf-16le не бросает почти никогда: любая последовательность чётной длины декодируется в иероглифы. Из-за этого корректно разбирался только utf-8, cp1251 проходил через раз — в зависимости от чётности размера файла, — а UTF-16 не разбирался вовсе. Каталоги шаблонов молча не попадали в выпадающий список, и пользователь не знал, что подсказка потерялась. Файл теперь читается один раз в bytes, кодировка берётся по BOM, а без BOM перебираются utf-8, cp1251, utf-16-le и utf-16-be. Критерий выбора прямой: в декодированном тексте должен найтись сам ключ. Разбор строк идёт после декодирования, поэтому частичный результат больше не накапливается между попытками — на файле из 251 строки возвращалось 174. Рядом в том же слое: - open_folder читает код возврата. xdg-open отвечает 3 или 4, когда нет ассоциации inode/directory, а пользователь видел «открыл». - Дочерней команде восстанавливается LD_LIBRARY_PATH из LD_LIBRARY_PATH_ORIG: в onefile-сборке gio и kioclient подхватывали Qt и libstdc++ из каталога распаковки вместо системных. - Путь передаётся абсолютным, а не через разделитель опций "--": xdg-open его не понимает и отвечает кодом 1. - GUI показывает отказ открытия папки через QMessageBox с путём в тексте. show_message тут не годится: он переводит окно в UIState.ERROR и прячет саму кнопку, а в состоянии SUCCESS комбобокс с путём уже скрыт. - SettingsService.get_output_path откатывается на default, если QSettings вернул не строку. Правленный извне конфиг даёт list, и os.path.normpath ронял запуск до window.show() — без окна и без сообщения. Тесты: 254 -> 274, сняты три xfail(strict=True). os_utils.py и settings_service.py покрыты полностью. Closes #18
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
os.sep выглядит платформенно-независимым, но форма абсолютного пути им не описывается: на Windows он начинается с буквы диска, а не с разделителя, поэтому startswith(os.sep) там всегда ложен.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #18.
Корень
Перебор кодировок останавливался на первом кодеке, который не бросил исключение.
utf-16leне бросает почти никогда: любая последовательность чётной длины декодируется в иероглифы. Отсюда четыре независимых симптома — и все они воспроизводятся на одном и том же содержимом.До (тот же прогон, что в issue):
После:
Файл читается один раз в
bytes, кодировка берётся по BOM, без BOM перебираютсяutf-8→cp1251→utf-16-le→utf-16-be.Критерий выбора — наличие самого ключа в декодированном тексте, а не отсутствие исключения и не эвристика по
\x00. Issue предлагал второе; проверка по ключу строже и попутно закрываетutf-16beбез BOM, который на\x00-эвристике прошёл бы как «валидный» (байты UTF-16BE, прочитанные как LE, дают иероглифы без нулей).Разбор строк идёт после декодирования, поэтому частичный результат больше не накапливается между попытками — на файле из 251 строки возвращалось 174.
Остальное в том же слое
open_folderчитает код возврата.xdg-openотвечает 3 или 4, когда нет ассоциацииinode/directory, а пользователь видел «открыл».LD_LIBRARY_PATHизLD_LIBRARY_PATH_ORIG. В onefile-сборкеgio/kioclient/gtk-launchподхватывали Qt и libstdc++ из каталога распаковки вместо системных. Замерено на поведении бутлоадера; на готовой Linux-сборке не проверялось — это остаётся непроверенным и здесь.--.xdg-openразделитель опций не понимает и отвечаетunexpected optionс кодом 1, то есть вариант из issue сломал бы открытие папки на всех Linux.QMessageBoxс путём в тексте.show_message(..., is_error=True)тут не годится: он переводит окно вUIState.ERRORи прячет саму кнопку «Открыть папку», а в состоянии SUCCESS комбобокс с путём уже скрыт — узнать каталог было бы негде.SettingsService.get_output_pathоткатывается на default, если QSettings вернул не строку. Правленный извне конфиг даётlist, иos.path.normpathронял запуск доwindow.show().,.join не использую: Qt при разборе срезает пробел после запятой, и склейка дала бы молча неверный каталог вместо честного отката.Тесты
254 → 274. Сняты три
xfail(strict=True)— они перевернулись вXPASS(strict)ровно в тот момент, когда код починился, и это был первый сигнал, что правка работает:Обе новые проверки красные на обратных мутациях:
2 failed— utf-16 без BOM и большой cp1251returncode1 failed— rc=4 больше не отличается от успехаОдно ожидание в тесте я написал неверно и поправил по факту: при откате на default метка в комбобоксе выходит
(last used), а не(default)— веткаlast_usedсрабатывает первой и занимает тот же путь. Это существующее поведение разметки, а не следствие отката; issue про него предупреждал, трогать здесь не стал.