Skip to content

Commit 727f44f

Browse files
committed
Bug 1891921 - part 2: Use mozilla-version to determine the category of a release
1 parent c8e3fd3 commit 727f44f

2 files changed

Lines changed: 30 additions & 82 deletions

File tree

api/src/shipit_api/admin/product_details.py

Lines changed: 16 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import logging
1414
import os
1515
import pathlib
16-
import re
1716
import shutil
1817
import typing
1918
import urllib.parse
@@ -32,7 +31,7 @@
3231
import shipit_api.common.config
3332
import shipit_api.common.models
3433
from shipit_api.admin.release import parse_version
35-
from shipit_api.common.product import Product, ProductCategory
34+
from shipit_api.common.product import Product, ProductCategory, get_product_category
3635

3736
logger = logging.getLogger(__name__)
3837

@@ -259,44 +258,6 @@ def get_releases_from_db(db_session: sqlalchemy.orm.Session, breakpoint_version:
259258
return query.all()
260259

261260

262-
def get_product_categories(product: Product, version: str) -> typing.List[ProductCategory]:
263-
# typically, these are dot releases that are considered major
264-
SPECIAL_FIREFOX_MAJORS = ["14.0.1", "125.0.1"]
265-
SPECIAL_THUNDERBIRD_MAJORS = ["14.0.1", "38.0.1"]
266-
267-
def patternize_versions(versions):
268-
if not versions:
269-
return ""
270-
return "|" + "|".join([v.replace(r".", r"\.") for v in versions])
271-
272-
categories = []
273-
categories_mapping: typing.List[typing.Tuple[ProductCategory, str]] = []
274-
275-
if product is Product.THUNDERBIRD:
276-
special_majors = patternize_versions(SPECIAL_THUNDERBIRD_MAJORS)
277-
else:
278-
special_majors = patternize_versions(SPECIAL_FIREFOX_MAJORS)
279-
280-
categories_mapping.append((ProductCategory.MAJOR, r"([0-9]+\.[0-9]+%s)$" % special_majors))
281-
categories_mapping.append((ProductCategory.MAJOR, r"([0-9]+\.[0-9]+(esr|)%s)$" % special_majors))
282-
categories_mapping.append((ProductCategory.STABILITY, r"([0-9]+\.[0-9]+\.[0-9]+$|[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$)"))
283-
categories_mapping.append((ProductCategory.STABILITY, r"([0-9]+\.[0-9]+\.[0-9]+(esr|)$|[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(esr|)$)"))
284-
# We had 38.0.5b2
285-
categories_mapping.append((ProductCategory.DEVELOPMENT, r"([0-9]+\.[0-9]|[0-9]+\.[0-9]+\.[0-9])(b|rc|build|plugin)[0-9]+$"))
286-
287-
# Ugly hack to manage the next ESR (when we have two overlapping esr)
288-
if shipit_api.common.config.ESR_NEXT:
289-
categories_mapping.append((ProductCategory.ESR, shipit_api.common.config.ESR_NEXT + r"(\.[0-9]+){1,2}esr$"))
290-
else:
291-
categories_mapping.append((ProductCategory.ESR, shipit_api.common.config.CURRENT_ESR + r"(\.[0-9]+){1,2}esr$"))
292-
293-
for product_category, version_pattern in categories_mapping:
294-
if re.match(version_pattern, version):
295-
categories.append(product_category)
296-
297-
return categories
298-
299-
300261
def get_releases(
301262
breakpoint_version: int, products: Products, releases: typing.List[shipit_api.common.models.Release], old_product_details: ProductDetails
302263
) -> Releases:
@@ -358,20 +319,22 @@ def get_releases(
358319
for release in releases:
359320
if release.product != product.value:
360321
continue
361-
categories = get_product_categories(Product(release.product), release.version)
322+
362323
release_version = release.version
363-
for category in categories:
364-
if release_version.endswith("esr"):
365-
release_version = release_version[: -len("esr")]
366-
details[f"{release.product}-{release.version}"] = dict(
367-
category=category.value,
368-
product=release.product,
369-
build_number=release.build_number,
370-
description=None,
371-
is_security_driven=False, # TODO: we don't have this field anymore
372-
version=release_version,
373-
date=with_default(release.completed, functools.partial(to_format, format="YYYY-MM-DD"), default=""),
374-
)
324+
version = parse_version(product, release_version)
325+
category = get_product_category(version)
326+
327+
if release_version.endswith("esr"):
328+
release_version = release_version[: -len("esr")]
329+
details[f"{release.product}-{release.version}"] = dict(
330+
category=category.value,
331+
product=release.product,
332+
build_number=release.build_number,
333+
description=None,
334+
is_security_driven=False, # TODO: we don't have this field anymore
335+
version=release_version,
336+
date=with_default(release.completed, functools.partial(to_format, format="YYYY-MM-DD"), default=""),
337+
)
375338

376339
return dict(releases=details)
377340

@@ -454,35 +417,6 @@ def get_release_history(
454417
if release_version is None or release_version.major_number < breakpoint_version:
455418
continue
456419

457-
# short term hack: 125.0.1 is a major release. we should replace this with
458-
# something that uses MozillaVersion to determine categories
459-
if (
460-
product_category is ProductCategory.MAJOR
461-
and release_version.major_number == 125
462-
and release_version.patch_number == 1
463-
and release_version.beta_number is None
464-
and not release_version.is_esr
465-
):
466-
# history_version is a copy of stuff further down - we need it now, before
467-
# this release gets skipped
468-
history_version = release.version
469-
if history_version.endswith("esr"):
470-
history_version = history_version[: -len("esr")]
471-
history[history_version] = with_default(release.completed, functools.partial(to_format, format="YYYY-MM-DD"), default="")
472-
continue
473-
474-
# skip all releases which don't fit into product category
475-
if product_category is ProductCategory.MAJOR and (
476-
release_version.patch_number is not None or release_version.beta_number is not None or release_version.is_esr
477-
):
478-
continue
479-
480-
elif product_category is ProductCategory.DEVELOPMENT and (release_version.beta_number is None or release_version.is_esr):
481-
continue
482-
483-
elif product_category is ProductCategory.STABILITY and (release_version.beta_number is not None or release_version.patch_number is None):
484-
continue
485-
486420
history_version = release.version
487421
if history_version.endswith("esr"):
488422
history_version = history_version[: -len("esr")]

api/src/shipit_api/common/product.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import enum
22

3+
from mozilla_version.gecko import GeckoVersion
4+
35
from backend_common import get_product_names
46

57

@@ -11,6 +13,18 @@ class ProductCategory(enum.Enum):
1113
ESR = "esr"
1214

1315

16+
def get_product_category(version: GeckoVersion):
17+
if version.is_major:
18+
return ProductCategory.MAJOR
19+
elif version.is_development:
20+
return ProductCategory.DEVELOPMENT
21+
elif version.is_stability:
22+
return ProductCategory.STABILITY
23+
elif version.is_esr:
24+
return ProductCategory.ESR
25+
raise ValueError(f"Unknown category for version: {version}")
26+
27+
1428
# Keys of Product will have underscores where the product name may have hyphens.
1529
# So all hyphens are translated to underscores as a rule.
1630
def get_key(name):

0 commit comments

Comments
 (0)