def filter_by_semver_build( self, organization_id: int, operator: str, build: str, project_ids: Optional[Sequence[int]] = None, negated: bool = False, ) -> models.QuerySet: """ Filters released by build. If the passed `build` is a numeric string, we'll filter on `build_number` and make use of the passed operator. If it is a non-numeric string, then we'll filter on `build_code` instead. We support a wildcard only at the end of this string, so that we can filter efficiently via the index. """ qs = self.filter(organization_id=organization_id) query_func = "exclude" if negated else "filter" if project_ids: qs = qs.filter(id__in=ReleaseProject.objects.filter( project_id__in=project_ids).values_list("release_id", flat=True)) if build.isnumeric() and validate_bigint(int(build)): qs = getattr(qs, query_func)(**{ f"build_number__{operator}": int(build) }) else: if not build or build.endswith("*"): qs = getattr(qs, query_func)(build_code__startswith=build[:-1]) else: qs = getattr(qs, query_func)(build_code=build) return qs
def massage_semver_cols_into_release_object_data(kwargs): """ Helper function that takes kwargs as an argument and massages into it the release semver columns (if possible) Inputs: * kwargs: data of the release that is about to be created """ if "version" in kwargs: try: version_info = parse_release(kwargs["version"]) package = version_info.get("package") version_parsed = version_info.get("version_parsed") if version_parsed is not None and all( validate_bigint(version_parsed[field]) for field in ("major", "minor", "patch", "revision")): build_code = version_parsed.get("build_code") build_number = ReleaseQuerySet._convert_build_code_to_build_number( build_code) kwargs.update({ "major": version_parsed.get("major"), "minor": version_parsed.get("minor"), "patch": version_parsed.get("patch"), "revision": version_parsed.get("revision"), "prerelease": version_parsed.get("pre") or "", "build_code": build_code, "build_number": build_number, "package": package, }) except RelayError: # This can happen on invalid legacy releases pass
def is_semver_version(version): """ Method that checks if a version follows semantic versioning """ # If version is not a valid release version, or it has no package then we return False if not Release.is_valid_version(version) or "@" not in version: return False try: version_info = parse_release(version) version_parsed = version_info.get("version_parsed") return version_parsed is not None and all( validate_bigint(version_parsed[field]) for field in ("major", "minor", "patch", "revision")) except RelayError: # This can happen on invalid legacy releases return False
def _convert_build_code_to_build_number(build_code): """ Helper function that takes the build_code and checks if that build code can be parsed into a 64 bit integer Inputs: * build_code: str Returns: * build_number """ build_number = None if build_code is not None: try: build_code_as_int = int(build_code) if validate_bigint(build_code_as_int): build_number = build_code_as_int except ValueError: pass return build_number
def is_semver_version(version): """ Method that checks if a version follows semantic versioning """ if not Release.is_valid_version(version): return False # Release name has to contain package_name to be parsed correctly by parse_release version = version if "@" in version else f"{SEMVER_FAKE_PACKAGE}@{version}" try: version_info = parse_release(version) version_parsed = version_info.get("version_parsed") return version_parsed is not None and all( validate_bigint(version_parsed[field]) for field in ("major", "minor", "patch", "revision")) except RelayError: # This can happen on invalid legacy releases return False