Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
 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
Esempio n. 5
0
    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