|
8 | 8 | Перем Патч Экспорт; // число |
9 | 9 |
|
10 | 10 | Перем ПреРелиз Экспорт; // Массив |
11 | | -Перем НомерБилда Экспорт; // Массив; |
| 11 | +Перем МетаданныеСборки Экспорт; // Массив; |
12 | 12 | Перем ОшибкаЧтенияВерсии Экспорт; |
13 | 13 |
|
14 | 14 | Процедура ПриСозданииОбъекта(Знач ВерсияСтрокой) |
|
17 | 17 | Второстепенная = 0; |
18 | 18 | Патч = 0; |
19 | 19 | ПреРелиз = Новый Массив; |
| 20 | + МетаданныеСборки = Новый Массив; |
20 | 21 |
|
21 | 22 | Прочитать(ВерсияСтрокой); |
22 | 23 |
|
|
47 | 48 | Функция ВСтроку() Экспорт |
48 | 49 |
|
49 | 50 | СтрокаВерсии = СтрШаблон("%1.%2.%3", Строка(Основная), Строка(Второстепенная), Строка(Патч)); |
| 51 | + |
| 52 | + Если ПреРелиз.Количество() Тогда |
| 53 | + СтрокаВерсии = СтрокаВерсии + "-" + СтрСоединить(ПреРелиз, "."); |
| 54 | + КонецЕсли; |
| 55 | + |
| 56 | + Если МетаданныеСборки.Количество() Тогда |
| 57 | + СтрокаВерсии = СтрокаВерсии + "+" + СтрСоединить(МетаданныеСборки, "."); |
| 58 | + КонецЕсли; |
50 | 59 |
|
51 | 60 | Возврат СтрокаВерсии; |
52 | 61 |
|
|
64 | 73 |
|
65 | 74 | Если НЕ Основная = ВходящаяВерсия.Основная Тогда |
66 | 75 |
|
67 | | - Возврат ?(Основная > ВходящаяВерсия.Основная,1,-1); |
| 76 | + Возврат ?(Основная > ВходящаяВерсия.Основная, 1,-1); |
68 | 77 |
|
69 | 78 | КонецЕсли; |
70 | 79 |
|
|
86 | 95 | КонецЕсли; |
87 | 96 |
|
88 | 97 | Если ПреРелиз.Количество() = 0 |
89 | | - И ВходящаяВерсия.ПреРелиз.Количество() = 0 Тогда |
90 | | - Возврат 0; |
91 | | - КонецЕсли; |
92 | | - |
93 | | - Если ПреРелиз.Количество() = 0 |
94 | | - И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда |
| 98 | + И ВходящаяВерсия.ПреРелиз.Количество() > 0 Тогда |
95 | 99 | Возврат 1; |
96 | 100 | КонецЕсли; |
97 | 101 |
|
|
100 | 104 | Возврат -1; |
101 | 105 | КонецЕсли; |
102 | 106 |
|
103 | | - Возврат 0; |
| 107 | + Возврат СравнитьПререлизы(ВходящаяВерсия.ПреРелиз); |
104 | 108 |
|
105 | 109 | КонецФункции |
106 | 110 |
|
|
164 | 168 | Возврат Сравнить(ВходящаяВерсия) >= 0; |
165 | 169 | КонецФункции |
166 | 170 |
|
| 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 | + |
167 | 203 | Процедура Прочитать(Знач ВерсияСтрокой) |
168 | 204 |
|
169 | 205 | Если СтрДлина(ВерсияСтрокой) = 0 Тогда |
|
173 | 209 |
|
174 | 210 | ВерсияСтрокой = ПодготовитьКЧтению(ВерсияСтрокой); |
175 | 211 |
|
176 | | - МассивСтрокВерсии = СтрРазделить(ВерсияСтрокой, "."); |
177 | | - |
178 | | - Если МассивСтрокВерсии.Количество() < 3 Тогда |
179 | | - ОшибкаЧтенияВерсии = "Не найдены все составляющие версии"; |
180 | | - Возврат; |
181 | | - КонецЕсли; |
| 212 | + Парсер = Новый ПарсерВерсии(ВерсияСтрокой); |
| 213 | + Парсер.Следующий(); |
182 | 214 |
|
183 | | - СтрокаОсновнаяВерсия = МассивСтрокВерсии[0]; |
| 215 | + Попытка |
| 216 | + ПрочитатьЧислоДоРазделителя(Парсер, Основная, "Основная версия"); |
| 217 | + ПрочитатьРазделитель(Парсер, "."); |
| 218 | + ПрочитатьЧислоДоРазделителя(Парсер, Второстепенная, "Второстепенная версия"); |
| 219 | + ПрочитатьРазделитель(Парсер, "."); |
| 220 | + ПрочитатьЧислоДоРазделителя(Парсер, Патч, "Версия патча"); |
| 221 | + ПрочитатьХвостовыеМассивы(Парсер); |
| 222 | + Исключение |
| 223 | + ОшибкаЧтенияВерсии = ИнформацияОбОшибке().Описание; |
| 224 | + КонецПопытки; |
184 | 225 |
|
185 | | - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаОсновнаяВерсия) Тогда |
186 | | - |
187 | | - ОшибкаЧтенияВерсии = СтрШаблон("Основная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); |
188 | | - Возврат; |
| 226 | +КонецПроцедуры |
| 227 | + |
| 228 | +Процедура ПрочитатьРазделитель(Знач Парсер, Знач Разделитель) |
| 229 | + |
| 230 | + ТекущийТокен = Парсер.Текущий(); |
| 231 | + Если ТекущийТокен.Тип = Парсер.ТипКонецТекста Тогда |
| 232 | + Возврат; |
| 233 | + КонецЕсли; |
189 | 234 |
|
| 235 | + Если ТекущийТокен.Тип = Парсер.ТипРазделитель Тогда |
| 236 | + Если Разделитель = ТекущийТокен.Значение Тогда |
| 237 | + СледующийТокен = Парсер.Следующий(); |
| 238 | + Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда |
| 239 | + ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель); |
| 240 | + КонецЕсли; |
| 241 | + Возврат; |
| 242 | + КонецЕсли; |
190 | 243 | КонецЕсли; |
191 | 244 |
|
192 | | - Основная = Число(СтрокаОсновнаяВерсия); |
193 | | - |
194 | | - СтрокаВторостепеннаяВерсия = МассивСтрокВерсии[1]; |
| 245 | + ВызватьИсключение СтрШаблон("Ожидается разделитель <%1>, но получен <%2>", Разделитель, ТекущийТокен.Значение); |
195 | 246 |
|
| 247 | +КонецПроцедуры |
196 | 248 |
|
197 | | - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаВторостепеннаяВерсия) Тогда |
198 | | - |
199 | | - ОшибкаЧтенияВерсии = СтрШаблон("Второстепенная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); |
200 | | - Возврат; |
201 | | - |
| 249 | +Процедура ПрочитатьЧислоДоРазделителя(Знач Парсер, Результат, Знач УточнениеИсключения) |
| 250 | + Токен = Парсер.Текущий(); |
| 251 | + Если Токен.Тип = Парсер.ТипКонецТекста Тогда |
| 252 | + Возврат; |
202 | 253 | КонецЕсли; |
203 | 254 |
|
204 | | - Второстепенная = Число(СтрокаВторостепеннаяВерсия); |
| 255 | + Если Токен.Тип = Парсер.ТипЧисло Тогда |
| 256 | + Результат = Число(Токен.Значение); |
| 257 | + ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда |
| 258 | + ВызватьИсключение Токен.Значение; |
| 259 | + Иначе |
| 260 | + ВызватьИсключение СтрШаблон("%1 <%2> должна содержать только цифры", УточнениеИсключения, Токен.Значение); |
| 261 | + КонецЕсли; |
205 | 262 |
|
206 | | - СтрокаПатчаВерсии = МассивСтрокВерсии[2]; |
| 263 | + Парсер.Следующий(); |
| 264 | +КонецПроцедуры |
207 | 265 |
|
208 | | - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаПатчаВерсии) Тогда |
209 | | - |
210 | | - ОшибкаЧтенияВерсии = СтрШаблон("Версия патча <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); |
211 | | - Возврат; |
212 | | - |
| 266 | +Процедура ПрочитатьХвостовыеМассивы(Знач Парсер) |
| 267 | + Токен = Парсер.Текущий(); |
| 268 | + Если Токен.Тип = Парсер.ТипКонецТекста Тогда |
| 269 | + Возврат; |
| 270 | + КонецЕсли; |
| 271 | + |
| 272 | + Если Токен.Тип <> Парсер.ТипРазделитель или Токен.Значение = "." Тогда |
| 273 | + ВызватьИсключение "Ожидается разделитель пререлизной версии <-> или метаданных сборки <+>, получен <" + Токен.Значение + ">"; |
213 | 274 | КонецЕсли; |
214 | 275 |
|
215 | | - Патч = Число(СтрокаПатчаВерсии); |
| 276 | + ПрочитатьПреРелиз(Парсер); |
| 277 | + ПрочитатьМетаданныеСборки(Парсер); |
216 | 278 |
|
217 | 279 | КонецПроцедуры |
218 | 280 |
|
219 | | -Функция ПодготовитьКЧтению(Знач СтрокаВерсии) |
220 | | - |
221 | | - Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда |
222 | | - СтрокаВерсии = СтрЗаменить(СтрокаВерсии, "v", ""); |
| 281 | +Процедура ПрочитатьПреРелиз(Знач Парсер) |
| 282 | + Если Парсер.Текущий().Значение = "-" Тогда |
| 283 | + Парсер.Следующий(); |
| 284 | + СобратьМассивИзКомпонентов(Парсер, ПреРелиз, "+"); |
| 285 | + КонецЕсли; |
| 286 | +КонецПроцедуры |
| 287 | + |
| 288 | +Процедура ПрочитатьМетаданныеСборки(Знач Парсер) |
| 289 | + Если Парсер.Текущий().Значение = "+" Тогда |
| 290 | + Парсер.Следующий(); |
| 291 | + СобратьМассивИзКомпонентов(Парсер, МетаданныеСборки, ""); |
223 | 292 | КонецЕсли; |
| 293 | +КонецПроцедуры |
224 | 294 |
|
225 | | - МассивСтрокВерсии = СтрРазделить(СтрокаВерсии, "."); |
| 295 | +Процедура СобратьМассивИзКомпонентов(Знач Парсер, Знач МассивКомпонентов, Знач ПрерватьПо) |
| 296 | + |
| 297 | + Пока Истина Цикл |
| 298 | + МассивКомпонентов.Добавить(ПрочитатьКомпонент(Парсер)); |
| 299 | + Если Парсер.Текущий().Значение = ПрерватьПо или Парсер.Текущий().Тип = Парсер.ТипКонецТекста Тогда |
| 300 | + Прервать; |
| 301 | + КонецЕсли; |
226 | 302 |
|
227 | | - КоличествоДобавления = 3 - МассивСтрокВерсии.Количество(); |
| 303 | + ПрочитатьРазделитель(Парсер, "."); |
228 | 304 |
|
229 | | - Для ИИ = 1 ПО КоличествоДобавления Цикл |
230 | | - МассивСтрокВерсии.Добавить(0); |
231 | 305 | КонецЦикла; |
232 | 306 |
|
233 | | - Возврат СтрСоединить(МассивСтрокВерсии, "."); |
| 307 | +КонецПроцедуры |
| 308 | + |
| 309 | +Функция ПрочитатьКомпонент(Знач Парсер) |
| 310 | + Токен = Парсер.Текущий(); |
| 311 | + Если Токен.Тип = Парсер.ТипЧисло Тогда |
| 312 | + Парсер.Следующий(); |
| 313 | + Возврат Число(Токен.Значение); |
| 314 | + ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда |
| 315 | + Текст = ""; |
| 316 | + ТекТокен = Парсер.Текущий(); |
| 317 | + Пока ТекТокен.Тип = Парсер.ТипТекст или ТекТокен.Значение = "-" Цикл |
| 318 | + Текст = Текст + ТекТокен.Значение; |
| 319 | + ТекТокен = Парсер.Следующий(); |
| 320 | + КонецЦикла; |
| 321 | + Возврат Текст; |
| 322 | + Иначе |
| 323 | + ВызватьИсключение СтрШаблон("Ожидается компонент версии, но получен <%1>", ?(Токен.Значение = "", "EOF", Токен.Значение)); |
| 324 | + КонецЕсли; |
| 325 | +КонецФункции |
| 326 | + |
| 327 | +Функция ПодготовитьКЧтению(Знач СтрокаВерсии) |
| 328 | + |
| 329 | + Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда |
| 330 | + СтрокаВерсии = Сред(СтрокаВерсии, 2); |
| 331 | + КонецЕсли; |
| 332 | + |
| 333 | + Возврат СтрокаВерсии; |
234 | 334 |
|
235 | 335 | КонецФункции |
236 | 336 |
|
|
0 commit comments