예제 #1
0
def GetCodeReviewDataForACulprit(culprit_urlsafe_key):
    """Gets code review related data and object of a culprit.

  Returns:
    (dict, CodeReview): code review related data and object.
  """
    culprit = entity_util.GetEntityFromUrlsafeKey(culprit_urlsafe_key)
    assert culprit, 'Could\'t get culprit object for key %s' % culprit_urlsafe_key
    revision = culprit.revision
    return git.GetCodeReviewInfoForACommit(revision)
예제 #2
0
파일: git_test.py 프로젝트: xinghun61/infra
 def testGetCodeReviewInfoForACommit(self, mock_change_log):
     revision = 'rev2'
     mock_change_log.return_value = self._MockGetChangeLog(revision)
     expected_info = {
         'commit_position': 123,
         'code_review_url': 'url',
         'review_server_host': 'host',
         'review_change_id': '123',
         'author': {
             'name': 'author',
             'email': '*****@*****.**',
             'time': '2018-05-17 00:49:48'
         },
         'committer': {
             'name': 'committer',
             'email': '*****@*****.**',
             'time': '2018-05-17 00:49:48'
         },
     }
     self.assertEqual(expected_info,
                      git.GetCodeReviewInfoForACommit(revision))
예제 #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
예제 #4
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)
예제 #5
0
파일: git_test.py 프로젝트: xinghun61/infra
 def testGetCodeReviewInfoForACommitFailedToGetChangeLog(self, _):
     revision = 'rev2'
     self.assertEqual({}, git.GetCodeReviewInfoForACommit(revision))