def publish_issues()

in bot/code_review_bot/backend.py [0:0]


    def publish_issues(self, issues, revision):
        """
        Publish all issues on the backend in bulk.
        """
        if not self.enabled:
            logger.warn("Skipping issues publication on backend")
            return

        published = 0
        assert (
            revision.issues_url is not None
        ), "Missing issues_url on the revision to publish issues in bulk."

        logger.info(f"Publishing issues in bulk of {settings.bulk_issue_chunks} items.")
        chunks = (
            issues[i : i + settings.bulk_issue_chunks]
            for i in range(0, len(issues), settings.bulk_issue_chunks)
        )
        for issues_chunk in chunks:
            # Store valid data as couples of (<issue>, <json_data>)
            valid_data = []
            # Build issues' payload for that given chunk
            for issue in issues_chunk:
                if (
                    isinstance(issue, MozLintIssue)
                    and issue.linter == "rust"
                    and issue.path == "."
                ):
                    # Silently ignore issues with path "." from rustfmt, as they cannot be published
                    # https://github.com/mozilla/code-review/issues/1577
                    continue
                if issue.hash is None:
                    logger.warning(
                        "Missing issue hash, cannot publish on backend",
                        issue=str(issue),
                    )
                    continue
                valid_data.append((issue, issue.as_dict()))

            if not valid_data:
                # May happen when a series of issues are missing a hash
                logger.warning(
                    "No issue is valid over an entire chunk",
                    head_repository=revision.head_repository,
                    head_changeset=revision.head_changeset,
                )
                continue

            response = self.create(
                revision.issues_url,
                {"issues": [json_data for _, json_data in valid_data]},
            )
            if response is None:
                # Backend rejected the payload, nothing more to do.
                continue
            created = response.get("issues")

            assert created and len(created) == len(valid_data)
            for (issue, _), return_value in zip(valid_data, created):
                # Set the returned value on each issue
                issue.on_backend = return_value

            published += len(valid_data)

        total = len(issues)
        if published < total:
            logger.warn(
                "Published a subset of issues", total=total, published=published
            )
        else:
            logger.info("Published all issues on backend", nb=published)

        return published