Skip to content

Commit a678273

Browse files
committed
Сравнение версий с учетом пререлизов
1 parent 10fc0a0 commit a678273

File tree

2 files changed

+44
-9
lines changed

2 files changed

+44
-9
lines changed

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

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,6 @@
9494
Возврат 0;
9595
КонецЕсли;
9696

97-
Если ПреРелиз.Количество() = 0
98-
И ВходящаяВерсия.ПреРелиз.Количество() = 0 Тогда
99-
Возврат 0;
100-
КонецЕсли;
101-
10297
Если ПреРелиз.Количество() = 0
10398
И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда
10499
Возврат 1;
@@ -109,7 +104,7 @@
109104
Возврат -1;
110105
КонецЕсли;
111106

112-
Возврат 0;
107+
Возврат СравнитьПререлизы(ВходящаяВерсия.ПреРелиз);
113108

114109
КонецФункции
115110

@@ -173,6 +168,38 @@
173168
Возврат Сравнить(ВходящаяВерсия) >= 0;
174169
КонецФункции
175170

171+
Функция СравнитьПреРелизы(Знач Сравниваемое)
172+
// Поэлементное сравнение
173+
Для Сч = 0 По Макс(ПреРелиз.ВГраница(), Сравниваемое.ВГраница()) Цикл
174+
// Больший набор предрелизных символов имеет больший приоритет,
175+
// чем меньший набор, если сравниваемые идентификаторы равны =>
176+
// если компоненты будут равны, побеждает тот, у кого компонентов больше
177+
178+
Если Сч > ПреРелиз.ВГраница() Тогда
179+
Возврат -1;
180+
ИначеЕсли Сч > Сравниваемое.ВГраница() Тогда
181+
Возврат 1;
182+
КонецЕсли;
183+
184+
Текущий = ПреРелиз[Сч];
185+
Входящий = Сравниваемое[Сч];
186+
187+
Если Текущий = Входящий Тогда
188+
Продолжить;
189+
КонецЕсли;
190+
191+
// Численные идентификаторы имеют низший приоритет
192+
Если ТипЗнч(Текущий) <> ТипЗнч(Входящий) Тогда
193+
Возврат ?(ТипЗнч(Текущий) = Тип("Строка"), 1, -1);
194+
КонецЕсли;
195+
196+
Возврат ?(Текущий > Входящий, 1, -1);
197+
198+
КонецЦикла;
199+
200+
Возврат 0;
201+
КонецФункции
202+
176203
Процедура Прочитать(Знач ВерсияСтрокой)
177204

178205
Если СтрДлина(ВерсияСтрокой) = 0 Тогда
@@ -283,7 +310,7 @@
283310
Токен = Парсер.Текущий();
284311
Если Токен.Тип = Парсер.ТипЧисло Тогда
285312
Парсер.Следующий();
286-
Возврат Токен.Значение;
313+
Возврат Число(Токен.Значение);
287314
ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда
288315
Текст = "";
289316
ТекТокен = Парсер.Текущий();

tests/preReleasesTests.os

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,11 @@
4444
Версия = Новый Версия("1.1.0-beta-experimental.4.2+git-sha.deadbeef");
4545

4646
Ожидаем.Что(Версия.ПреРелиз[0]).Равно("beta-experimental");
47-
Ожидаем.Что(Версия.ПреРелиз[1]).Равно("4");
48-
Ожидаем.Что(Версия.ПреРелиз[2]).Равно("2");
47+
Ожидаем.Что(Версия.ПреРелиз[1]).Равно(4);
48+
Ожидаем.Что(Версия.ПреРелиз[2]).Равно(2);
4949
Ожидаем.Что(Версия.МетаданныеСборки[0]).Равно("git-sha");
5050
Ожидаем.Что(Версия.МетаданныеСборки[1]).Равно("deadbeef");
51+
5152
КонецПроцедуры
5253

5354
&ПараметризованныйТест
@@ -73,4 +74,11 @@
7374
// А = A
7475
Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия1)).Равно(0);
7576

77+
КонецПроцедуры
78+
79+
&Тест
80+
Процедура ПроверитьЧтоМетаданныеСборкиНеУчаствуютВСравнении()
81+
Версия1 = Новый Версия("1.0.1+git.12345");
82+
Версия2 = Новый Версия("1.0.1+sha.00000");
83+
Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия2)).Равно(0);
7684
КонецПроцедуры

0 commit comments

Comments
 (0)