Exemplo n.º 1
0
def _GetCodeReview(code_review_data):
    """Get codereview object based on review_server_host in code_review_data."""
    if (not code_review_data or not code_review_data.get('review_server_host')
            or not codereview_util.IsCodeReviewGerrit(
                code_review_data['review_server_host'])):
        return None
    return Gerrit(code_review_data['review_server_host'])
Exemplo n.º 2
0
def CommitRevert(parameters, codereview_info):
  """Commits a revert.

  Args:
    parameters(SubmitRevertCLParameters): parameters needed to commit a revert.
    codereview_info(dict_: Code review information for the change that will be
      reverted.
  """
  # Note that we don't know which was the final action taken by the pipeline
  # before this point. That is why this is where we increment the appropriate
  # metrics.
  culprit = entity_util.GetEntityFromUrlsafeKey(parameters.cl_key)
  assert culprit

  revision = culprit.revision

  codereview = _GetCodeReview(codereview_info)
  if not codereview:
    logging.error('Failed to get codereview object for change %s/%s.',
                  culprit.repo_name, revision)
    return services_constants.ERROR

  if not codereview_util.IsCodeReviewGerrit(
      codereview_info['review_server_host']):
    return services_constants.SKIPPED

  revert_change_id = codereview.GetChangeIdFromReviewUrl(culprit.revert_cl_url)

  committed = codereview.SubmitRevert(revert_change_id)

  if committed:
    _AddReviewers(revision, culprit, codereview, revert_change_id, True)
  else:
    _AddReviewers(revision, culprit, codereview, revert_change_id, False)
  return services_constants.COMMITTED if committed else services_constants.ERROR
Exemplo n.º 3
0
def NotifyCulprit(culprit, bug_id):
    """Sends a notification to a code review page.

  Args:
    culprit (FlakeCulprit): The culprit identified to have introduced flakiness.
    bud_id (int): An optional bug id to include in the notification. Pass None
        if not specified.

  Returns:
    Bool indicating whether a notification was sent.
  """
    assert culprit

    revision = culprit.revision
    culprit_info = git.GetCodeReviewInfoForACommit(revision)

    review_server_host = culprit_info.get('review_server_host')
    review_change_id = culprit_info.get('review_change_id')

    code_review_settings = waterfall_config.GetCodeReviewSettings()
    codereview = Gerrit(
        review_server_host
    ) if review_server_host and codereview_util.IsCodeReviewGerrit(
        review_server_host, code_review_settings) else None
    sent = False

    if codereview and review_change_id:
        message = _GenerateMessageText(culprit, bug_id)
        sent = codereview.PostMessage(review_change_id, message)
    else:
        # Occasionally, a commit was not uploaded for code-review.
        logging.error('No code-review url for %s/%s', culprit.repo_name,
                      culprit.revision)

    status = analysis_status.COMPLETED if sent else analysis_status.ERROR
    suspected_cl_util.UpdateCulpritNotificationStatus(culprit.key.urlsafe(),
                                                      status)
    return sent
Exemplo n.º 4
0
 def testIsCodeReviewGerrit(self, review_host, is_codereivew_gerrit):
   self.assertEqual(is_codereivew_gerrit,
                    codereview_util.IsCodeReviewGerrit(review_host))
Exemplo n.º 5
0
def _CheckRevertStatusOfSuspectedCL(suspected_cl):
    """Updates suspected_cl with findings about what happened to its revert CL.

  Args:
    suspected_cl (wf_suspected_cl): A WfSuspectedCL entity.

  Returns:
    processed (bool): True if the suspected cl's revert outcome was determined,
      False if reverting was not relevant. None if the cl needed reverting but
      an outcome could not be determined.
    url (str): The code review url for manual investigation.
    status (str): The eventual outcome of the revert cl.
  """
    revert_cl = suspected_cl.revert_cl

    if not revert_cl and not suspected_cl.should_be_reverted:
        # Findit did not deem this suspected cl as needing revert. No action needed.
        return False, None, None

    revision = suspected_cl.revision
    culprit_info = git.GetCodeReviewInfoForACommit(revision)
    review_server_host = culprit_info.get('review_server_host')
    change_id = culprit_info.get('review_change_id')

    if not review_server_host or not change_id:  # pragma: no cover
        # TODO(lijeffrey): Handle cases a patch was committed without review.
        return None, None, None

    code_review_settings = FinditConfig().Get().code_review_settings
    codereview = Gerrit(
        review_server_host
    ) if review_server_host and codereview_util.IsCodeReviewGerrit(
        review_server_host, code_review_settings) else None
    if not codereview:
        logging.error('Could not get codereview for %s/q/%s',
                      review_server_host, change_id)
        return None, None, None

    cl_info = codereview.GetClDetails(change_id)
    code_review_url = codereview.GetCodeReviewUrl(change_id)

    if not cl_info:
        logging.error('Could not get CL details for %s/q/%s',
                      review_server_host, change_id)
        return None, code_review_url, None
    reverts_to_check = cl_info.GetRevertCLsByRevision(revision)

    if not reverts_to_check:
        logging.error('Could not get revert info for %s/q/%s',
                      review_server_host, change_id)
        return None, code_review_url, None

    reverts_to_check.sort(key=lambda x: x.timestamp)

    if revert_cl:  # Findit attempted to create a revert cl.
        any_revert_committed = False
        # Check whose revert CL was first commited.
        for revert in reverts_to_check:  # pragma: no branch
            reverting_user = revert.reverting_user_email
            revert_commits = revert.reverting_cl.commits

            if revert_commits:  # pragma: no branch
                any_revert_committed = True
                revert_commit = revert_commits[0]

                if reverting_user == constants.DEFAULT_SERVICE_ACCOUNT:
                    # The sheriff used Findit's reverting CL.
                    cq_attempt = revert.reverting_cl.commit_attempts[
                        revert_commit.patchset_id]
                    _UpdateSuspectedCL(
                        suspected_cl,
                        sheriff_action_time=cq_attempt.last_cq_timestamp,
                        revert_commit_timestamp=revert_commit.timestamp,
                        revert_status=revert_cl_status.COMMITTED)
                    break
                else:
                    # Sheriff used own revert CL.
                    _UpdateSuspectedCL(
                        suspected_cl,
                        sheriff_action_time=revert_commit.timestamp,
                        revert_status=revert_cl_status.DUPLICATE)
                    break

        # No revert was ever committed. False positive.
        if not any_revert_committed:
            # TODO(crbug.com/702056): Close the revert CLs that were not used.
            _UpdateSuspectedCL(suspected_cl,
                               revert_status=revert_cl_status.FALSE_POSITIVE)

    elif suspected_cl.should_be_reverted:  # pragma: no branch
        # Findit could have created a revert CL, but the sheriff was too fast.
        # Find the first revert that was successfully landed.
        for revert in reverts_to_check:  # pragma: no branch
            revert_commits = revert.reverting_cl.commits
            if revert_commits:  # pragma: no branch
                _UpdateSuspectedCL(suspected_cl,
                                   sheriff_action_time=revert.timestamp)
                break

    return True, code_review_url, (revert_cl.status if revert_cl else
                                   revert_cl_status.DUPLICATE)