oscript-library / oscript-library/opm
`opm config` перезаписывает `opm.cfg` урезанным JSON и теряет неизвестные ключи
Nobody has claimed this yet.
- Dominant language
- 1C Enterprise
- Stars
- 85
- Forks
- 35
- Avg merge
- 1m
- Merged PRs (30d)
- 1
Description
Команда opm config сохраняет настройки через ПараметрыПриложенияOpm.СохранитьТекущиеНастройки(), которая не делает read-modify-write исходного файла, а собирает новый JSON из in-memory модели НастройкиOpm.
В результате при любой записи из конфига пропадают корневые ключи и поля элементов СервераПакетов, которые модель не знает, но которые runtime уже использует или пользователь мог добавить вручную.
Где в коде
src/cmd/Классы/КомандаOpm_Config.os— вызовСохранитьТекущиеНастройки()src/cmd/Модули/ПараметрыПриложенияOpm.os:СохранитьТекущиеНастройки()→НормализоватьНастройкиДляЗаписи()- в записываемый документ попадают только три ключа:
СоздаватьShСкриптЗапуска,Прокси,СервераПакетов
src/core/Модули/НастройкиOpm.os— модель не содержитТокенПубликацииПакетови произвольных полей remotesrc/cmd/Классы/КомандаOpm_Push.os—ТокенПубликацииПакетовчитается напрямую из сырого JSON файла, минуя модель
Шаги воспроизведения
- Создать
opm.cfg(в каталоге, откуда будет запускатьсяopm config):
{
"ТокенПубликацииПакетов": "ghp_xxxxxxxx",
"СоздаватьShСкриптЗапуска": false,
"Прокси": {
"ИспользоватьПрокси": false
},
"СервераПакетов": [
{
"Имя": "myhub",
"Сервер": "https://hub.example",
"Порт": 443,
"ПутьНаСервере": "/download/",
"РесурсПубликацииПакетов": "/push",
"CustomField": "keep-me"
}
],
"FutureSetting": true
}
- Выполнить любую команду, которая сохраняет настройки, например:
opm config --winCreateBashLauncher true
- Открыть записанный
opm.cfg.
Фактический результат
- Ключ
ТокенПубликацииПакетовудалён →opm pushбез--tokenперестаёт находить токен в конфиге. - Ключ
FutureSettingудалён → любые будущие/пользовательские корневые поля не сохраняются. - В элементах
СервераПакетовпропадают неизвестные поля (например,CustomField). - При чтении конфига отсутствующие значения подменяются дефолтами и затем материализуются в файле как явные значения (
ПутьНаСервере→"/",РесурсПубликацииПакетов→"/",Порт→80,Приоритет→0и т.д.). - Запись сервера без
Имяпри чтении получает сгенерированноеДопСервер_N, которое после сохранения фиксируется в файле.
Ожидаемое поведение
Сохранение настроек должно быть lossless read-modify-write:
- прочитать существующий JSON целевого файла;
- обновить только те ключи/поля, которые команда реально меняет;
- сохранить
ТокенПубликацииПакетов, прочие неизвестные корневые ключи и неизвестные поля элементовСервераПакетов; - не подставлять дефолты в файл там, где пользователь их явно не задавал.
Влияние
- Push: потеря
ТокенПубликацииПакетовломает сценарий «токен только в конфиге». - Расширяемость конфига: нельзя безопасно хранить дополнительные поля в
opm.cfg. - Блокер для
opm remote: CRUD remote не должен использоватьСохранитьТекущиеНастройки(); нужен отдельный lossless RMW (см. план по управлению remote).
Предлагаемое направление исправления
- Вынести общий механизм адресной записи JSON (read → patch → atomic write).
- Перевести
opm configна обновление только затронутых секций (Прокси,СоздаватьShСкриптЗапуска), без пересборки всего документа изНастройкиOpm.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read src/cmd/Модули/ПараметрыПриложенияOpm.os, especially СохранитьТекущиеНастройки() and НормализоватьНастройкиДляЗаписи(), then inspect src/cmd/Классы/КомандаOpm_Config.os and КомандаOpm_Push.os. Run the reproduction against an opm.cfg containing unknown root and server fields. Done means config updates preserve untouched JSON data and avoid materializing defaults.
Written by the indexing model from the issue text.
Assessment
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100