# HG changeset patch # User Daniel Dourvaris # Date 2016-07-28 20:10:47 # Node ID b4f9553fcda2bef1785a8f347d18aac9d396eb39 # Parent fb6b614cc31c0aa62e87a06a628a2473ef53144e events: change target to source repo for pull request events to make sure commits can be found - fixes #4135, also made _get_commits work on multiple repos diff --git a/rhodecode/events/pullrequest.py b/rhodecode/events/pullrequest.py --- a/rhodecode/events/pullrequest.py +++ b/rhodecode/events/pullrequest.py @@ -18,7 +18,8 @@ from rhodecode.translation import lazy_ugettext -from rhodecode.events.repo import RepoEvent +from rhodecode.events.repo import ( + RepoEvent, _commits_as_dict, _issues_as_dict) class PullRequestEvent(RepoEvent): @@ -36,8 +37,11 @@ class PullRequestEvent(RepoEvent): from rhodecode.model.pull_request import PullRequestModel data = super(PullRequestEvent, self).as_dict() - commits = self._commits_as_dict(self.pullrequest.revisions) - issues = self._issues_as_dict(commits) + commits = _commits_as_dict( + commit_ids=self.pullrequest.revisions, + repos=[self.pullrequest.source_repo] + ) + issues = _issues_as_dict(commits) data.update({ 'pullrequest': { @@ -46,6 +50,7 @@ class PullRequestEvent(RepoEvent): 'pull_request_id': self.pullrequest.pull_request_id, 'url': PullRequestModel().get_url(self.pullrequest), 'status': self.pullrequest.calculated_review_status(), + 'commits': commits, } }) return data diff --git a/rhodecode/events/repo.py b/rhodecode/events/repo.py --- a/rhodecode/events/repo.py +++ b/rhodecode/events/repo.py @@ -21,9 +21,85 @@ import logging from rhodecode.translation import lazy_ugettext from rhodecode.model.db import User, Repository, Session from rhodecode.events.base import RhodecodeEvent +from rhodecode.lib.vcs.exceptions import CommitDoesNotExistError log = logging.getLogger(__name__) +def _commits_as_dict(commit_ids, repos): + """ + Helper function to serialize commit_ids + + :param commit_ids: commits to get + :param repos: list of repos to check + """ + from rhodecode.lib.utils2 import extract_mentioned_users + from rhodecode.model.db import Repository + from rhodecode.lib import helpers as h + from rhodecode.lib.helpers import process_patterns + from rhodecode.lib.helpers import urlify_commit_message + + if not repos: + raise Exception('no repo defined') + + if not isinstance(repos, (tuple, list)): + repos = [repos] + + if not commit_ids: + return [] + + needed_commits = set(commit_ids) + + commits = [] + reviewers = [] + for repo in repos: + if not needed_commits: + return commits # return early if we have the commits we need + + vcs_repo = repo.scm_instance(cache=False) + try: + for commit_id in list(needed_commits): + try: + cs = vcs_repo.get_changeset(commit_id) + except CommitDoesNotExistError: + continue # maybe its in next repo + + cs_data = cs.__json__() + cs_data['mentions'] = extract_mentioned_users(cs_data['message']) + cs_data['reviewers'] = reviewers + cs_data['url'] = h.url('changeset_home', + repo_name=repo.repo_name, + revision=cs_data['raw_id'], + qualified=True + ) + urlified_message, issues_data = process_patterns( + cs_data['message'], repo.repo_name) + cs_data['issues'] = issues_data + cs_data['message_html'] = urlify_commit_message(cs_data['message'], + repo.repo_name) + commits.append(cs_data) + + needed_commits.discard(commit_id) + + except Exception as e: + log.exception(e) + # we don't send any commits when crash happens, only full list matters + # we short circuit then. + return [] + + missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits) + if missing_commits: + log.error('missing commits: %s' % ', '.join(missing_commits)) + + return commits + + +def _issues_as_dict(commits): + """ Helper function to serialize issues from commits """ + issues = {} + for commit in commits: + for issue in commit['issues']: + issues[issue['id']] = issue + return issues class RepoEvent(RhodecodeEvent): """ @@ -49,51 +125,6 @@ class RepoEvent(RhodecodeEvent): }) return data - def _commits_as_dict(self, commit_ids): - """ Helper function to serialize commit_ids """ - - from rhodecode.lib.utils2 import extract_mentioned_users - from rhodecode.model.db import Repository - from rhodecode.lib import helpers as h - from rhodecode.lib.helpers import process_patterns - from rhodecode.lib.helpers import urlify_commit_message - if not commit_ids: - return [] - commits = [] - reviewers = [] - vcs_repo = self.repo.scm_instance(cache=False) - try: - for commit_id in commit_ids: - cs = vcs_repo.get_changeset(commit_id) - cs_data = cs.__json__() - cs_data['mentions'] = extract_mentioned_users(cs_data['message']) - cs_data['reviewers'] = reviewers - cs_data['url'] = h.url('changeset_home', - repo_name=self.repo.repo_name, - revision=cs_data['raw_id'], - qualified=True - ) - urlified_message, issues_data = process_patterns( - cs_data['message'], self.repo.repo_name) - cs_data['issues'] = issues_data - cs_data['message_html'] = urlify_commit_message(cs_data['message'], - self.repo.repo_name) - commits.append(cs_data) - except Exception as e: - log.exception(e) - # we don't send any commits when crash happens, only full list matters - # we short circuit then. - return [] - return commits - - def _issues_as_dict(self, commits): - """ Helper function to serialize issues from commits """ - issues = {} - for commit in commits: - for issue in commit['issues']: - issues[issue['id']] = issue - return issues - class RepoPreCreateEvent(RepoEvent): """ @@ -198,8 +229,9 @@ class RepoPushEvent(RepoVCSEvent): data = super(RepoPushEvent, self).as_dict() branch_url = repo_url = data['repo']['url'] - commits = self._commits_as_dict(self.pushed_commit_ids) - issues = self._issues_as_dict(commits) + commits = _commits_as_dict( + commit_ids=self.pushed_commit_ids, repos=[self.repo]) + issues = _issues_as_dict(commits) branches = set( commit['branch'] for commit in commits if commit['branch'])