##// END OF EJS Templates
pull-requests: change the update commits logic to handle target changes better....
marcink -
r1601:a639657c default
parent child Browse files
Show More
@@ -442,13 +442,25 b' class PullrequestsController(BaseRepoCon'
442 resp = PullRequestModel().update_commits(pull_request)
442 resp = PullRequestModel().update_commits(pull_request)
443
443
444 if resp.executed:
444 if resp.executed:
445
446 if resp.target_changed and resp.source_changed:
447 changed = 'target and source repositories'
448 elif resp.target_changed and not resp.source_changed:
449 changed = 'target repository'
450 elif not resp.target_changed and resp.source_changed:
451 changed = 'source repository'
452 else:
453 changed = 'nothing'
454
445 msg = _(
455 msg = _(
446 u'Pull request updated to "{source_commit_id}" with '
456 u'Pull request updated to "{source_commit_id}" with '
447 u'{count_added} added, {count_removed} removed commits.')
457 u'{count_added} added, {count_removed} removed commits. '
458 u'Source of changes: {change_source}')
448 msg = msg.format(
459 msg = msg.format(
449 source_commit_id=pull_request.source_ref_parts.commit_id,
460 source_commit_id=pull_request.source_ref_parts.commit_id,
450 count_added=len(resp.changes.added),
461 count_added=len(resp.changes.added),
451 count_removed=len(resp.changes.removed))
462 count_removed=len(resp.changes.removed),
463 change_source=changed)
452 h.flash(msg, category='success')
464 h.flash(msg, category='success')
453
465
454 registry = get_current_registry()
466 registry = get_current_registry()
@@ -63,8 +63,9 b' log = logging.getLogger(__name__)'
63
63
64 # Data structure to hold the response data when updating commits during a pull
64 # Data structure to hold the response data when updating commits during a pull
65 # request update.
65 # request update.
66 UpdateResponse = namedtuple(
66 UpdateResponse = namedtuple('UpdateResponse', [
67 'UpdateResponse', 'executed, reason, new, old, changes')
67 'executed', 'reason', 'new', 'old', 'changes',
68 'source_changed', 'target_changed'])
68
69
69
70
70 class PullRequestModel(BaseModel):
71 class PullRequestModel(BaseModel):
@@ -116,8 +117,7 b' class PullRequestModel(BaseModel):'
116 UpdateFailureReason.UNKNOWN: lazy_ugettext(
117 UpdateFailureReason.UNKNOWN: lazy_ugettext(
117 'Pull request update failed because of an unknown error.'),
118 'Pull request update failed because of an unknown error.'),
118 UpdateFailureReason.NO_CHANGE: lazy_ugettext(
119 UpdateFailureReason.NO_CHANGE: lazy_ugettext(
119 'No update needed because the source reference is already '
120 'No update needed because the source and target have not changed.'),
120 'up to date.'),
121 UpdateFailureReason.WRONG_REF_TPYE: lazy_ugettext(
121 UpdateFailureReason.WRONG_REF_TPYE: lazy_ugettext(
122 'Pull request cannot be updated because the reference type is '
122 'Pull request cannot be updated because the reference type is '
123 'not supported for an update.'),
123 'not supported for an update.'),
@@ -595,7 +595,8 b' class PullRequestModel(BaseModel):'
595 return UpdateResponse(
595 return UpdateResponse(
596 executed=False,
596 executed=False,
597 reason=UpdateFailureReason.WRONG_REF_TPYE,
597 reason=UpdateFailureReason.WRONG_REF_TPYE,
598 old=pull_request, new=None, changes=None)
598 old=pull_request, new=None, changes=None,
599 source_changed=False, target_changed=False)
599
600
600 # source repo
601 # source repo
601 source_repo = pull_request.source_repo.scm_instance()
602 source_repo = pull_request.source_repo.scm_instance()
@@ -605,7 +606,8 b' class PullRequestModel(BaseModel):'
605 return UpdateResponse(
606 return UpdateResponse(
606 executed=False,
607 executed=False,
607 reason=UpdateFailureReason.MISSING_SOURCE_REF,
608 reason=UpdateFailureReason.MISSING_SOURCE_REF,
608 old=pull_request, new=None, changes=None)
609 old=pull_request, new=None, changes=None,
610 source_changed=False, target_changed=False)
609
611
610 source_changed = source_ref_id != source_commit.raw_id
612 source_changed = source_ref_id != source_commit.raw_id
611
613
@@ -617,7 +619,8 b' class PullRequestModel(BaseModel):'
617 return UpdateResponse(
619 return UpdateResponse(
618 executed=False,
620 executed=False,
619 reason=UpdateFailureReason.MISSING_TARGET_REF,
621 reason=UpdateFailureReason.MISSING_TARGET_REF,
620 old=pull_request, new=None, changes=None)
622 old=pull_request, new=None, changes=None,
623 source_changed=False, target_changed=False)
621 target_changed = target_ref_id != target_commit.raw_id
624 target_changed = target_ref_id != target_commit.raw_id
622
625
623 if not (source_changed or target_changed):
626 if not (source_changed or target_changed):
@@ -625,7 +628,8 b' class PullRequestModel(BaseModel):'
625 return UpdateResponse(
628 return UpdateResponse(
626 executed=False,
629 executed=False,
627 reason=UpdateFailureReason.NO_CHANGE,
630 reason=UpdateFailureReason.NO_CHANGE,
628 old=pull_request, new=None, changes=None)
631 old=pull_request, new=None, changes=None,
632 source_changed=target_changed, target_changed=source_changed)
629
633
630 change_in_found = 'target repo' if target_changed else 'source repo'
634 change_in_found = 'target repo' if target_changed else 'source repo'
631 log.debug('Updating pull request because of change in %s detected',
635 log.debug('Updating pull request because of change in %s detected',
@@ -655,7 +659,8 b' class PullRequestModel(BaseModel):'
655 return UpdateResponse(
659 return UpdateResponse(
656 executed=False,
660 executed=False,
657 reason=UpdateFailureReason.MISSING_TARGET_REF,
661 reason=UpdateFailureReason.MISSING_TARGET_REF,
658 old=pull_request, new=None, changes=None)
662 old=pull_request, new=None, changes=None,
663 source_changed=source_changed, target_changed=target_changed)
659
664
660 # re-compute commit ids
665 # re-compute commit ids
661 old_commit_ids = pull_request.revisions
666 old_commit_ids = pull_request.revisions
@@ -678,43 +683,52 b' class PullRequestModel(BaseModel):'
678 Session().add(pull_request)
683 Session().add(pull_request)
679 new_commit_ids = pull_request.revisions
684 new_commit_ids = pull_request.revisions
680
685
681 changes = self._calculate_commit_id_changes(
682 old_commit_ids, new_commit_ids)
683
684 old_diff_data, new_diff_data = self._generate_update_diffs(
686 old_diff_data, new_diff_data = self._generate_update_diffs(
685 pull_request, pull_request_version)
687 pull_request, pull_request_version)
686
688
689 # calculate commit and file changes
690 changes = self._calculate_commit_id_changes(
691 old_commit_ids, new_commit_ids)
692 file_changes = self._calculate_file_changes(
693 old_diff_data, new_diff_data)
694
695 # set comments as outdated if DIFFS changed
687 CommentsModel().outdate_comments(
696 CommentsModel().outdate_comments(
688 pull_request, old_diff_data=old_diff_data,
697 pull_request, old_diff_data=old_diff_data,
689 new_diff_data=new_diff_data)
698 new_diff_data=new_diff_data)
690
699
691 file_changes = self._calculate_file_changes(
700 commit_changes = (changes.added or changes.removed)
692 old_diff_data, new_diff_data)
701 file_node_changes = (
702 file_changes.added or file_changes.modified or file_changes.removed)
703 pr_has_changes = commit_changes or file_node_changes
693
704
694 # Add an automatic comment to the pull request
705 # Add an automatic comment to the pull request, in case
695 update_comment = CommentsModel().create(
706 # anything has changed
696 text=self._render_update_message(changes, file_changes),
707 if pr_has_changes:
697 repo=pull_request.target_repo,
708 update_comment = CommentsModel().create(
698 user=pull_request.author,
709 text=self._render_update_message(changes, file_changes),
699 pull_request=pull_request,
710 repo=pull_request.target_repo,
700 send_email=False, renderer=DEFAULT_COMMENTS_RENDERER)
701
702 # Update status to "Under Review" for added commits
703 for commit_id in changes.added:
704 ChangesetStatusModel().set_status(
705 repo=pull_request.source_repo,
706 status=ChangesetStatus.STATUS_UNDER_REVIEW,
707 comment=update_comment,
708 user=pull_request.author,
711 user=pull_request.author,
709 pull_request=pull_request,
712 pull_request=pull_request,
710 revision=commit_id)
713 send_email=False, renderer=DEFAULT_COMMENTS_RENDERER)
714
715 # Update status to "Under Review" for added commits
716 for commit_id in changes.added:
717 ChangesetStatusModel().set_status(
718 repo=pull_request.source_repo,
719 status=ChangesetStatus.STATUS_UNDER_REVIEW,
720 comment=update_comment,
721 user=pull_request.author,
722 pull_request=pull_request,
723 revision=commit_id)
711
724
712 log.debug(
725 log.debug(
713 'Updated pull request %s, added_ids: %s, common_ids: %s, '
726 'Updated pull request %s, added_ids: %s, common_ids: %s, '
714 'removed_ids: %s', pull_request.pull_request_id,
727 'removed_ids: %s', pull_request.pull_request_id,
715 changes.added, changes.common, changes.removed)
728 changes.added, changes.common, changes.removed)
716 log.debug('Updated pull request with the following file changes: %s',
729 log.debug(
717 file_changes)
730 'Updated pull request with the following file changes: %s',
731 file_changes)
718
732
719 log.info(
733 log.info(
720 "Updated pull request %s from commit %s to commit %s, "
734 "Updated pull request %s from commit %s to commit %s, "
@@ -723,12 +737,13 b' class PullRequestModel(BaseModel):'
723 pull_request.source_ref_parts.commit_id,
737 pull_request.source_ref_parts.commit_id,
724 pull_request_version.pull_request_version_id)
738 pull_request_version.pull_request_version_id)
725 Session().commit()
739 Session().commit()
726 self._trigger_pull_request_hook(pull_request, pull_request.author,
740 self._trigger_pull_request_hook(
727 'update')
741 pull_request, pull_request.author, 'update')
728
742
729 return UpdateResponse(
743 return UpdateResponse(
730 executed=True, reason=UpdateFailureReason.NONE,
744 executed=True, reason=UpdateFailureReason.NONE,
731 old=pull_request, new=pull_request_version, changes=changes)
745 old=pull_request, new=pull_request_version, changes=changes,
746 source_changed=source_changed, target_changed=target_changed)
732
747
733 def _create_version_from_snapshot(self, pull_request):
748 def _create_version_from_snapshot(self, pull_request):
734 version = PullRequestVersion()
749 version = PullRequestVersion()
General Comments 0
You need to be logged in to leave comments. Login now