Skip to content

Commit d2bdbae

Browse files
authored
Merge pull request #42 from oscript-library/develop
1.6.0
2 parents 2d6d1e6 + 587f9ec commit d2bdbae

6 files changed

+163
-88
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

2+
.vscode/launch.json
23
oscript_modules/
34

45
src/cmd/oscript\.cfg

packagedef

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Описание.Имя("ovm")
2-
.Версия("1.5.0")
3-
.Автор("Nikita Gryzlov")
2+
.Версия("1.6.0")
3+
.Автор("Nikita Fedkin")
44
.АдресАвтора("[email protected]")
55
.Описание("OneScript Version Manager")
66
.ВерсияСреды("1.9.2")

src/core/Классы/ВерсииOneScript.os

Lines changed: 97 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,24 @@
2222

2323
ДопустимыеАлиасы = Новый КартаСоответствие;
2424

25-
ДопустимыеАлиасы.Вставить("lts", Версия("lts", Ложь));
26-
ДопустимыеАлиасы.Вставить("stable", Версия("latest", Ложь));
27-
ДопустимыеАлиасы.Вставить("dev", Версия("night-build", Истина));
25+
ДопустимыеАлиасы.Вставить("lts", Версия("lts"));
26+
ДопустимыеАлиасы.Вставить("stable", Версия("latest"));
27+
ДопустимыеАлиасы.Вставить("dev", Версия("night-build"));
2828

29-
ДопустимыеАлиасы.Вставить("preview", Версия("preview", Истина));
30-
ДопустимыеАлиасы.Вставить("lts-dev", Версия("latest-dev", Ложь));
29+
ДопустимыеАлиасы.Вставить("preview", Версия("preview"));
30+
ДопустимыеАлиасы.Вставить("lts-dev", Версия("latest-dev"));
3131

3232
КонецЕсли;
3333

3434
Возврат ДопустимыеАлиасы;
3535

3636
КонецФункции
3737

38-
Функция Версия(Метка, ЭтоВерсия2)
38+
Функция Версия(Метка)
3939

4040
Результат = Новый Структура;
4141

4242
Результат.Вставить("Метка", Метка);
43-
Результат.Вставить("ЭтоВерсия2", ЭтоВерсия2);
4443

4544
Возврат Результат;
4645

@@ -226,13 +225,93 @@
226225
Таймаут
227226
);
228227

229-
ДоступныеВерсии = ТаблицаДоступныхВерсий();
228+
Возврат ПолучитьВерсииПоAPI(Соединение);
230229

231-
Если Не ПолучитьВерсииПоAPI(Соединение, ДоступныеВерсии) Тогда
232-
ПолучитьВерсииРазборомHTML(Соединение, ДоступныеВерсии);
230+
КонецФункции
231+
232+
// Возвращает таблицу файлов конкретной версии
233+
//
234+
// Параметры:
235+
// НомерВерсии - Строка - версия для которой получаем файлы.
236+
//
237+
// Возвращаемое значение:
238+
// ТаблицаЗначений - Вид,ИмяФайла,Архитектура,Ссылка
239+
// Вид: vsix,exe,zip,fdd,scd-win,scd-lin,osx-x64,osx-arm64
240+
// ИмяФайла: имя файла
241+
// Архитектура: x64,x86
242+
// Ссылка: прямая ссылка на данный файл
243+
// См. также:
244+
// https://oscript.io/api/archive/ - список всех токенов
245+
// https://oscript.io/api/archive/<токен версии> - данная таблица
246+
//
247+
Функция ПолучитьДоступныеВидыДистрибутивовВерсии(Знач НомерВерсии) Экспорт
248+
Таймаут = 10;
249+
Соединение = Новый HTTPСоединение(
250+
ПараметрыOVM.АдресСайтаОСкрипт(),
251+
,
252+
,
253+
,
254+
,
255+
Таймаут
256+
);
257+
258+
Запрос = Новый HTTPЗапрос("api/archive?all=true");
259+
Ответ = Соединение.Получить(Запрос);
260+
HTTP_OK = 200;
261+
Если Ответ.КодСостояния <> HTTP_OK Тогда
262+
ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте: Статус: %2, Ответ: %3",
263+
НомерВерсии,
264+
Ответ.КодСостояния,
265+
Ответ.ПолучитьТелоКакСтроку()
266+
);
267+
КонецЕсли;
268+
269+
ЧтениеJSON = Новый ЧтениеJSON();
270+
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
271+
272+
МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь);
273+
ИскомыйТокенВерсии = Неопределено;
274+
Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
275+
Если НомерВерсии = ОписаниеВерсии.presentation Тогда
276+
ИскомыйТокенВерсии = ОписаниеВерсии.token;
277+
КонецЕсли;
278+
КонецЦикла;
279+
280+
Если ИскомыйТокенВерсии = Неопределено Тогда
281+
ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте.", НомерВерсии);
282+
КонецЕсли;
283+
284+
Запрос = Новый HTTPЗапрос("api/archive/" + ИскомыйТокенВерсии);
285+
Ответ = Соединение.Получить(Запрос);
286+
HTTP_OK = 200;
287+
Если Ответ.КодСостояния <> HTTP_OK Тогда
288+
ВызватьИсключение СтрШаблон("Не удалось найти файлы версии %1 на сайте: Статус: %2, Ответ: %3",
289+
НомерВерсии,
290+
Ответ.КодСостояния,
291+
Ответ.ПолучитьТелоКакСтроку()
292+
);
233293
КонецЕсли;
294+
295+
ТаблицаРезультата = Новый ТаблицаЗначений();
296+
ТаблицаРезультата.Колонки.Добавить("Вид");
297+
ТаблицаРезультата.Колонки.Добавить("ИмяФайла");
298+
ТаблицаРезультата.Колонки.Добавить("Архитектура");
299+
ТаблицаРезультата.Колонки.Добавить("Ссылка");
300+
301+
ЧтениеJSON = Новый ЧтениеJSON();
302+
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
234303

235-
Возврат ДоступныеВерсии;
304+
МассивФайлов = ПрочитатьJSON(ЧтениеJSON, Ложь);
305+
Для Каждого ОписаниеФайла Из МассивФайлов Цикл
306+
СтрокаТаблицы = ТаблицаРезультата.Добавить();
307+
СтрокаТаблицы.Вид = ОписаниеФайла.id;
308+
СтрокаТаблицы.ИмяФайла = ОписаниеФайла.filename;
309+
СтрокаТаблицы.Архитектура = ОписаниеФайла.arch;
310+
СтрокаТаблицы.Ссылка = ОписаниеФайла.link;
311+
КонецЦикла;
312+
313+
Возврат ТаблицаРезультата;
314+
236315
КонецФункции
237316

238317
// <Описание функции>
@@ -320,25 +399,21 @@
320399

321400
КонецФункции
322401

323-
Функция ТаблицаДоступныхВерсий()
324-
ДоступныеВерсии = Новый ТаблицаЗначений;
325-
ДоступныеВерсии.Колонки.Добавить("Алиас");
326-
ДоступныеВерсии.Колонки.Добавить("Путь");
327-
328-
Возврат ДоступныеВерсии;
329-
КонецФункции
330-
331-
Функция ПолучитьВерсииПоAPI(Знач Соединение, Знач ДоступныеВерсии)
402+
Функция ПолучитьВерсииПоAPI(Знач Соединение)
332403
Запрос = Новый HTTPЗапрос("api/archive");
333404
Ответ = Соединение.Получить(Запрос);
334405
HTTP_OK = 200;
335406
Если Ответ.КодСостояния <> HTTP_OK Тогда
336-
Возврат Ложь;
407+
ВызватьИсключение СтрШаблон("Не удалось получить список версий с сайта. Код ошибки: %1", Ответ.КодСостояния);
337408
КонецЕсли;
338409

339410
ЧтениеJSON = Новый ЧтениеJSON();
340411
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
341412

413+
ДоступныеВерсии = Новый ТаблицаЗначений;
414+
ДоступныеВерсии.Колонки.Добавить("Алиас");
415+
ДоступныеВерсии.Колонки.Добавить("Путь");
416+
342417
АдресСайтаОСкрипт = ПараметрыOVM.АдресСайтаОСкрипт();
343418
МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь);
344419
Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
@@ -353,49 +428,9 @@
353428
ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь");
354429
КонецЦикла;
355430

356-
Возврат Истина;
431+
Возврат ДоступныеВерсии;
357432
КонецФункции
358433

359-
Процедура ПолучитьВерсииРазборомHTML(Знач Соединение, Знач ДоступныеВерсии)
360-
Запрос = Новый HTTPЗапрос("downloads");
361-
362-
Ответ = Соединение.Получить(Запрос);
363-
HTTP_OK = 200;
364-
Если Ответ.КодСостояния <> HTTP_OK Тогда
365-
ВызватьИсключение Ответ.КодСостояния;
366-
КонецЕсли;
367-
368-
ТелоСтраницы = Ответ.ПолучитьТелоКакСтроку();
369-
370-
РегулярноеВыражение = Новый РегулярноеВыражение(
371-
"<a href=""(\/downloads\/[^""]+)"">(" + ПараметрыOVM.МаскаНомераВерсии() + ")<");
372-
ИндексГруппыАдрес = 1;
373-
ИндексГруппыВерсия = 2;
374-
375-
АдресСайтаОСкрипт = ПараметрыOVM.АдресСайтаОСкрипт();
376-
Совпадения = РегулярноеВыражение.НайтиСовпадения(ТелоСтраницы);
377-
Для Каждого СовпадениеРегулярногоВыражения Из Совпадения Цикл
378-
ГруппаАдрес = СовпадениеРегулярногоВыражения.Группы[ИндексГруппыАдрес];
379-
ГруппаВерсия = СовпадениеРегулярногоВыражения.Группы[ИндексГруппыВерсия];
380-
381-
// TODO: Убрать после решения https://github.com/EvilBeaver/OneScript/issues/667
382-
Если ГруппаВерсия.Значение = "1.0.9" Тогда
383-
Продолжить;
384-
КонецЕсли;
385-
386-
ДоступнаяВерсия = ДоступныеВерсии.Добавить();
387-
ДоступнаяВерсия.Алиас = ГруппаВерсия.Значение;
388-
ДоступнаяВерсия.Путь = АдресСайтаОСкрипт + ГруппаАдрес.Значение;
389-
КонецЦикла;
390-
391-
Итератор = ДопустимыеАлиасы().Ключи().Итератор();
392-
393-
Пока Итератор.ЕстьСледующий() Цикл
394-
ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь");
395-
КонецЦикла;
396-
397-
КонецПроцедуры
398-
399434
Процедура ОбеспечитьСтрокуВерсииПоАлиасу(ТаблицаВерсий, Алиас, ИмяРеквизитаПуть = "ПутьСервер")
400435

401436
СтрокаВерсии = ТаблицаВерсий.Найти(Алиас, "Алиас");

src/core/Классы/ПараметрыOVM.os

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,19 @@
5454
Возврат СистемнаяИнформация.Это64БитнаяОперационнаяСистема;
5555
КонецФункции
5656

57-
// Регулярное выражение точного номера версии.
57+
// Регулярное выражение версии по semver
5858
//
5959
// Возвращаемое значение:
6060
// Строка - Регулярное выражение
6161
//
62-
Функция МаскаНомераВерсии() Экспорт
63-
Возврат "\d+\.\d+\.\d+(\.rc\d+?)?";
62+
Функция МаскаНомераВерсииSemver() Экспорт
63+
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
64+
// https://regex101.com/r/vkijKf/1/
65+
66+
// BSLLS:LineLength-off
67+
Возврат "^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$";
68+
// BSLLS:LineLength-on
69+
6470
КонецФункции
6571

6672
СистемнаяИнформация = Новый СистемнаяИнформация;

src/core/Классы/ПараметрыПриложения.os

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212
КонецФункции
1313

1414
Функция ВерсияПриложения() Экспорт
15-
Возврат "1.5.0";
15+
Возврат "1.6.0";
1616
КонецФункции

src/core/Классы/УстановщикOneScript.os

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -304,15 +304,15 @@
304304

305305
КонецПроцедуры
306306

307-
Функция ЭтоТочныйНомерВерсии(ВерсияКУстановке)
308-
РВ = Новый РегулярноеВыражение("^" + ПараметрыOVM.МаскаНомераВерсии() + "$");
307+
Функция ЭтоДопустимыйНомерВерсии(ВерсияКУстановке)
308+
РВ = Новый РегулярноеВыражение(ПараметрыOVM.МаскаНомераВерсииSemver());
309309
РВ.ИгнорироватьРегистр = Ложь;
310310
РВ.МногоСтрочный = Ложь;
311311
Возврат РВ.Совпадает(ВерсияКУстановке);
312312
КонецФункции
313313

314314
Процедура ПроверитьКорректностьПереданнойВерсии(Знач ВерсияКУстановке)
315-
Если НЕ ЭтоТочныйНомерВерсии(ВерсияКУстановке)
315+
Если НЕ ЭтоДопустимыйНомерВерсии(ВерсияКУстановке)
316316
И Не ВерсииOneScript.ДопустимыеАлиасы().СодержитКлюч(ВерсияКУстановке) Тогда
317317

318318
Лог.Ошибка("Версия имеет некорректный формат");
@@ -323,9 +323,9 @@
323323

324324
Функция ПолучитьПутьКСкачиваниюФайла(Знач ВерсияКУстановке, Знач ИспользоватьХ64, Знач ИспользоватьFDD)
325325

326-
Если ЭтоТочныйНомерВерсии(ВерсияКУстановке) Тогда
326+
Если ЭтоДопустимыйНомерВерсии(ВерсияКУстановке) Тогда
327327

328-
КаталогВерсии = СтрЗаменить(ВерсияКУстановке, ".", "_");
328+
ИскомаяВерсия = ВерсияКУстановке;
329329
ЭтоВерсия2 = СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "2.0") >= 0;
330330

331331
Иначе
@@ -334,30 +334,63 @@
334334
.Получить(ВерсияКУстановке)
335335
.ИначеВызватьИсключение("Ошибка получения пути к файлу по версии");
336336

337-
КаталогВерсии = ДанныеВерсии.Метка;
338-
ЭтоВерсия2 = ДанныеВерсии.ЭтоВерсия2;
337+
ИскомаяВерсия = ДанныеВерсии.Метка;
338+
// Когда v2 выйдет из preview мы не будем знать к какой версии относится алиас stable.
339+
ЭтоВерсия2 = Неопределено;
339340

340341
КонецЕсли;
341342

342-
Если ЭтоВерсия2 И ИспользоватьFDD Тогда
343-
ИмяФайла = "fdd";
344-
ИначеЕсли ЭтоВерсия2 Тогда
345-
ИмяФайла = ТипДистрибутиваТекущейПлатформы();
343+
Если ЭтоВерсия2 = Истина Тогда
344+
ВидДистрибутива = ?(ИспользоватьFDD, "fdd", ТипДистрибутиваТекущейПлатформы());
345+
ИначеЕсли ЭтоВерсия2 = Ложь Тогда
346+
ВидДистрибутива = "zip";
347+
ИначеЕсли ИспользоватьFDD Тогда
348+
ЭтоВерсия2 = Истина;
349+
ВидДистрибутива = "fdd";
346350
Иначе
347-
ИмяФайла = "zip";
351+
// Это установка по алиасу и мы не знаем, версия 2 это или нет.
352+
// Определим это с двух попыток ниже.
353+
ВидДистрибутива = ТипДистрибутиваТекущейПлатформы();
348354
КонецЕсли;
349355

350-
ЧастиПути = Новый Массив;
351-
ЧастиПути.Добавить("downloads");
352-
ЧастиПути.Добавить(КаталогВерсии);
353-
Если ИспользоватьХ64 Тогда
354-
ЧастиПути.Добавить("x64");
356+
ПереченьФайлов = ВерсииOneScript.ПолучитьДоступныеВидыДистрибутивовВерсии(ИскомаяВерсия);
357+
358+
Возврат НайтиПодходящийДистрибутив(ПереченьФайлов, ВидДистрибутива, ИспользоватьХ64, ЭтоВерсия2 = Неопределено);
359+
360+
КонецФункции
361+
362+
Функция НайтиПодходящийДистрибутив(Знач ПереченьФайлов, Знач ВидДистрибутива, Знач ИспользоватьХ64, Знач РежимАлиаса)
363+
КритерийПоиска = Новый Структура;
364+
КритерийПоиска.Вставить("Вид", ВидДистрибутива);
365+
366+
Если ВидДистрибутива = "scd-win" или ВидДистрибутива = "fdd" или ВидДистрибутива = "zip" Тогда
367+
Если ИспользоватьХ64 Тогда
368+
КритерийПоиска.Вставить("Архитектура", "x64");
369+
Иначе
370+
КритерийПоиска.Вставить("Архитектура", "x86");
371+
КонецЕсли;
355372
КонецЕсли;
356-
ЧастиПути.Добавить(ИмяФайла);
357373

358-
Ресурс = СтрСоединить(ЧастиПути, "/");
359-
Возврат Ресурс;
374+
НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска);
375+
Если НайденныеСтроки.Количество() <> 1 Тогда
376+
// Это может быть установка по алиасу и тогда есть шанс у дистрибутива zip для версии 1
377+
Если РежимАлиаса Тогда
378+
КритерийПоиска.Вид = "zip";
379+
КонецЕсли;
380+
381+
НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска);
382+
Если НайденныеСтроки.Количество() <> 1 Тогда
383+
ТекстОшибки = СтрШаблон(
384+
"Не найден дистрибутив для критериев: Вид=%1, Архитектура=%2. Найдено файлов: %3",
385+
КритерийПоиска.Вид,
386+
?(КритерийПоиска.Свойство("Архитектура"), КритерийПоиска.Архитектура, "<любая>"),
387+
НайденныеСтроки.Количество()
388+
);
389+
ВызватьИсключение ТекстОшибки;
390+
КонецЕсли;
391+
КонецЕсли;
360392

393+
Возврат НайденныеСтроки[0].Ссылка;
361394
КонецФункции
362395

363396
Функция ТипДистрибутиваТекущейПлатформы()

0 commit comments

Comments
 (0)