Реестр пакетов
Реестр flang — это список имён, а не склад кода. Список — строчный файл: в каждой строке пять полей через знак «|», и больше в ней ничего нет. На вопрос «какая версия пакета годится» реестр отвечает адресом, по которому лежит пакет, а не самим пакетом; имя получает версию только здесь, в списке; ни одного нового слова в языке реестр не заводит. Ни сервера, ни базы, ни учётных записей для этого не нужно — и по решению их нет. Довод целиком: ADR-0059.
Список лежит файлом по постоянному адресу
https://digitable-lol.github.io/flang/registry.list
Это обычный файл, раздаваемый по HTTP. Программа на flang берёт его тем поручением, которое у языка уже есть, — «Запросить»:
вариант «Запросить» с способ равным "GET"
и адрес равным "https://digitable-lol.github.io/flang/registry.list"
и тело равным ""
На сайте лежит копия того же файла из дерева scripts/registry-example/registry.list — знак в знак, и кладёт её туда та же сборка, что печатает эту страницу.
Пять полей
| поле | что в нём |
|---|---|
| имя | имя пакета — то, что стоит в использует |
| версия | три числа через точку: старшая, средняя, младшая |
| отпечаток | sha256 файла пакета |
| адрес | где лежит файл пакета |
| нужды | чего пакет требует от других имён; пусто — ничего |
Нужда пишется как имя: диапазон, нужды разделяются точкой с запятой. Диапазонов четыре: любая, ровно 1.2.3, не ниже 1.2.3, в пределах 1.x. Разбор списка и выбор версии написаны и доказаны в flang/stdlib/registry.flang; сдаётся выбор прогоном плана, а не командой двоичного — нового слова реестр не заводит нигде.
Нынешние записи
Таблица ниже напечатана из этого файла прогоном flang run-script registry:page; руками её не правят — правка затрётся следующей печатью.
| имя | версия | отпечаток | адрес | нужды |
|---|---|---|---|---|
| Логика | 1.0.0 | 1dc6da94a777a731150d896e28d9b20ce0afd6ca876b0cafe1c0d0d3d0b4c864 | registry-example/logic-1.0.0.flang-package | |
| Логика | 1.2.0 | b2bda19546f5cbb2b7642a80f54458197bca3dfde517983356080a11c62870d2 | registry-example/logic-1.2.0.flang-package | |
| Логика | 2.0.0 | 5374735fb59ebaf5e374ffa1e4a985a8b66616f35a45f4cd35244697ed91c965 | registry-example/logic-2.0.0.flang-package | |
| Списки | 1.4.2 | 802d716b62ea8918ded9cdda7ed2fd04c16aa97da4d519381e3c98e4e3f5ccc9 | registry-example/lists-1.4.2.flang-package | Логика: не ниже 1.0.0 |
| Множество строк | 1.0.0 | cf3a1697ccc1e7c2fa4fd72b3210ad5372590c0844f13e07119fa290a1f69931 | registry-example/sets-1.0.0.flang-package | Логика: не ниже 1.0.0 |
| Множество строк | 1.1.0 | a9a776e153d9789c7e29f8c66ad92df36a834f21630c6388b41ebd4f8d2effc2 | registry-example/sets-1.1.0.flang-package | Списки: в пределах 1.x; Логика: в пределах 1.x |
| Опциональное значение | 0.9.0 | 17eac86ce77be366094d22be0f537d4bab5bb00958fb41df3bd7353060957c7d | registry-example/optional-0.9.0.flang-package | Логика: ровно 2.0.0 |
Записей в списке: 7.
Отпечаток сверен с файлом при печати
Отпечаток — единственное, на чём держится доверие к чужому пакету, и портится он молча. Поэтому тот же прогон, который печатает таблицу, пересчитывает sha256 каждого адреса и сличает с полем «отпечаток». Разошёлся хоть один знак — страница не печатается вовсе: прогон отвечает числом выхода 1 и FLANG_REESTR_OTPECHATOK, называет запись, оба отпечатка и адрес, а сборка сайта краснеет на нём и до читателя не доезжает.
Проверка заведена не впрок: отпечатки в примере однажды разошлись с файлами, и увидеть это было некому — реестр не звала ни одна работа сборки (задача 4909, сделана: сторож scripts/guards/registry-resolution-guard.fscript и работа CI registry-resolution).