##// END OF EJS Templates
user menu: call 'notifications' for what it is in the rest of the system - not 'inbox'
user menu: call 'notifications' for what it is in the rest of the system - not 'inbox'

File last commit:

r3262:14e9a06c beta
r3280:c2dc089f beta
Show More
pull_request.py
255 lines | 9.1 KiB | text/x-python | PythonLexer
Added basic models for saving open pull requests...
r2434 # -*- coding: utf-8 -*-
"""
Added option to close pull requests, in future that will be close & merge
r2608 rhodecode.model.pull_request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Added basic models for saving open pull requests...
r2434
pull request model for RhodeCode
:created_on: Jun 6, 2012
:author: marcink
:copyright: (C) 2012-2012 Marcin Kuzminski <marcin@python-works.com>
:license: GPLv3, see COPYING for more details.
"""
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
small refactoring, moved shared for diff generation of code into pull-request model
r2442 import binascii
Added option to close pull requests, in future that will be close & merge
r2608 import datetime
Enabled compare engine for tags...
r3010 import re
Switch to waitress wsgi server by default in rhodecode....
r2597
Added basic models for saving open pull requests...
r2434 from pylons.i18n.translation import _
Switch to waitress wsgi server by default in rhodecode....
r2597 from rhodecode.model.meta import Session
Added basic models for saving open pull requests...
r2434 from rhodecode.lib import helpers as h
from rhodecode.model import BaseModel
set the status of changesets initially on pull request, and make sure we care of version collisions....
r3175 from rhodecode.model.db import PullRequest, PullRequestReviewers, Notification,\
ChangesetStatus
Added basic models for saving open pull requests...
r2434 from rhodecode.model.notification import NotificationModel
from rhodecode.lib.utils2 import safe_unicode
fixes #550 mercurial repositories comparision failed when origin repo had...
r2801 from rhodecode.lib.vcs.utils.hgcompat import discovery, localrepo, scmutil, \
findcommonoutgoing
small refactoring, moved shared for diff generation of code into pull-request model
r2442
Added basic models for saving open pull requests...
r2434 log = logging.getLogger(__name__)
class PullRequestModel(BaseModel):
Added associated classes into child models
r2522 cls = PullRequest
Added option to close pull requests, in future that will be close & merge
r2608 def __get_pull_request(self, pull_request):
return self._get_instance(PullRequest, pull_request)
- pull request generates overview based on it's params...
r2440 def get_all(self, repo):
repo = self._get_repo(repo)
fix order of pull-requests in show all page
r3262 return PullRequest.query()\
.filter(PullRequest.other_repo == repo)\
.order_by(PullRequest.created_on)\
.all()
- pull request generates overview based on it's params...
r2440
set the status of changesets initially on pull request, and make sure we care of version collisions....
r3175 def create(self, created_by, org_repo, org_ref, other_repo, other_ref,
revisions, reviewers, title, description=None):
from rhodecode.model.changeset_status import ChangesetStatusModel
Added dynamic data loading for other repo we open pull request against...
r2541
- pull request generates overview based on it's params...
r2440 created_by_user = self._get_user(created_by)
Added dynamic data loading for other repo we open pull request against...
r2541 org_repo = self._get_repo(org_repo)
other_repo = self._get_repo(other_repo)
Added basic models for saving open pull requests...
r2434
new = PullRequest()
Added dynamic data loading for other repo we open pull request against...
r2541 new.org_repo = org_repo
Added basic models for saving open pull requests...
r2434 new.org_ref = org_ref
Added dynamic data loading for other repo we open pull request against...
r2541 new.other_repo = other_repo
Added basic models for saving open pull requests...
r2434 new.other_ref = other_ref
new.revisions = revisions
new.title = title
new.description = description
- pull request generates overview based on it's params...
r2440 new.author = created_by_user
Added basic models for saving open pull requests...
r2434 self.sa.add(new)
Added dynamic data loading for other repo we open pull request against...
r2541 Session().flush()
Added basic models for saving open pull requests...
r2434 #members
for member in reviewers:
_usr = self._get_user(member)
reviewer = PullRequestReviewers(_usr, new)
self.sa.add(reviewer)
set the status of changesets initially on pull request, and make sure we care of version collisions....
r3175 #reset state to under-review
ChangesetStatusModel().set_status(
repo=org_repo,
status=ChangesetStatus.STATUS_UNDER_REVIEW,
user=created_by_user,
pull_request=new
)
Added basic models for saving open pull requests...
r2434 #notification to reviewers
notif = NotificationModel()
- pull request generates overview based on it's params...
r2440
Nicer email notifications about pull-request
r2799 pr_url = h.url('pullrequest_show', repo_name=other_repo.repo_name,
pull_request_id=new.pull_request_id,
qualified=True,
)
Added basic models for saving open pull requests...
r2434 subject = safe_unicode(
h.link_to(
Mads Kiilerich
pull request: mention title of pull request in notifications
r3251 _('%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s') % \
Added basic models for saving open pull requests...
r2434 {'user': created_by_user.username,
Mads Kiilerich
pull request: mention title of pull request in notifications
r3251 'pr_title': new.title,
Added basic models for saving open pull requests...
r2434 'pr_id': new.pull_request_id},
Nicer email notifications about pull-request
r2799 pr_url
Added basic models for saving open pull requests...
r2434 )
)
body = description
Nicer email notifications about pull-request
r2799 kwargs = {
'pr_title': title,
'pr_user_created': h.person(created_by_user.email),
'pr_repo_url': h.url('summary_home', repo_name=other_repo.repo_name,
qualified=True,),
'pr_url': pr_url,
'pr_revisions': revisions
}
Added dynamic data loading for other repo we open pull request against...
r2541 notif.create(created_by=created_by_user, subject=subject, body=body,
Added basic models for saving open pull requests...
r2434 recipients=reviewers,
Nicer email notifications about pull-request
r2799 type_=Notification.TYPE_PULL_REQUEST, email_kwargs=kwargs)
Added basic models for saving open pull requests...
r2434 return new
small refactoring, moved shared for diff generation of code into pull-request model
r2442
Added editing of pull-request reviewers.
r2614 def update_reviewers(self, pull_request, reviewers_ids):
reviewers_ids = set(reviewers_ids)
pull_request = self.__get_pull_request(pull_request)
current_reviewers = PullRequestReviewers.query()\
.filter(PullRequestReviewers.pull_request==
pull_request)\
.all()
current_reviewers_ids = set([x.user.user_id for x in current_reviewers])
to_add = reviewers_ids.difference(current_reviewers_ids)
to_remove = current_reviewers_ids.difference(reviewers_ids)
log.debug("Adding %s reviewers" % to_add)
log.debug("Removing %s reviewers" % to_remove)
for uid in to_add:
_usr = self._get_user(uid)
reviewer = PullRequestReviewers(_usr, pull_request)
self.sa.add(reviewer)
for uid in to_remove:
reviewer = PullRequestReviewers.query()\
.filter(PullRequestReviewers.user_id==uid,
PullRequestReviewers.pull_request==pull_request)\
.scalar()
if reviewer:
self.sa.delete(reviewer)
Authors of pull-requests can now delete them
r2746 def delete(self, pull_request):
pull_request = self.__get_pull_request(pull_request)
Session().delete(pull_request)
Added option to close pull requests, in future that will be close & merge
r2608 def close_pull_request(self, pull_request):
pull_request = self.__get_pull_request(pull_request)
pull_request.status = PullRequest.STATUS_CLOSED
pull_request.updated_on = datetime.datetime.now()
self.sa.add(pull_request)
Mads Kiilerich
refactoring: drop unused 'discovery data' in pull request and compare diffs
r3192 def _get_changesets(self, alias, org_repo, org_ref, other_repo, other_ref):
small refactoring, moved shared for diff generation of code into pull-request model
r2442 """
Returns a list of changesets that are incoming from org_repo@org_ref
to other_repo@other_ref
:param org_repo:
:param org_ref:
:param other_repo:
:param other_ref:
:param tmp:
"""
Basic implementation of cherry picking changesets...
r3023
small refactoring, moved shared for diff generation of code into pull-request model
r2442 changesets = []
#case two independent repos
Basic implementation of cherry picking changesets...
r3023 if org_repo != other_repo:
revs = [
org_repo._repo.lookup(org_ref[1]),
org_repo._repo.lookup(other_ref[1]),
]
fixes #550 mercurial repositories comparision failed when origin repo had...
r2801 obj = findcommonoutgoing(org_repo._repo,
fixes #555 issues when comparing non-related repositories on pull requests or compare view
r2810 localrepo.locallegacypeer(other_repo._repo.local()),
Basic implementation of cherry picking changesets...
r3023 revs,
fixes #555 issues when comparing non-related repositories on pull requests or compare view
r2810 force=True)
fixes #550 mercurial repositories comparision failed when origin repo had...
r2801 revs = obj.missing
small refactoring, moved shared for diff generation of code into pull-request model
r2442
Basic implementation of cherry picking changesets...
r3023 for cs in map(binascii.hexlify, revs):
_cs = org_repo.get_changeset(cs)
changesets.append(_cs)
fixes #668 cherry picking of changeset should also work now on picking single changesets, and the ones from top
r3076 # in case we have revisions filter out the ones not in given range
if org_ref[0] == 'rev' and other_ref[0] == 'rev':
revs = [x.raw_id for x in changesets]
start = org_ref[1]
stop = other_ref[1]
changesets = changesets[revs.index(start):revs.index(stop) + 1]
small refactoring, moved shared for diff generation of code into pull-request model
r2442 else:
Enabled compare engine for tags...
r3010 #no remote compare do it on the same repository
if alias == 'hg':
_revset_predicates = {
'branch': 'branch',
'book': 'bookmark',
'tag': 'tag',
'rev': 'id',
}
Merged pull request #56...
r2630
Enabled compare engine for tags...
r3010 revs = [
"ancestors(%s('%s')) and not ancestors(%s('%s'))" % (
Multiple changes for compare system...
r3015 _revset_predicates[other_ref[0]], other_ref[1],
Enabled compare engine for tags...
r3010 _revset_predicates[org_ref[0]], org_ref[1],
)
]
Merged pull request #56...
r2630
Enabled compare engine for tags...
r3010 out = scmutil.revrange(org_repo._repo, revs)
Multiple changes for compare system...
r3015 for cs in (out):
Enabled compare engine for tags...
r3010 changesets.append(org_repo.get_changeset(cs))
elif alias == 'git':
so, se = org_repo.run_git_command(
Multiple changes for compare system...
r3015 'log --reverse --pretty="format: %%H" -s -p %s..%s' % (org_ref[1],
Enabled compare engine for tags...
r3010 other_ref[1])
)
ids = re.findall(r'[0-9a-fA-F]{40}', so)
Multiple changes for compare system...
r3015 for cs in (ids):
Enabled compare engine for tags...
r3010 changesets.append(org_repo.get_changeset(cs))
small refactoring, moved shared for diff generation of code into pull-request model
r2442
return changesets
def get_compare_data(self, org_repo, org_ref, other_repo, other_ref):
"""
Mads Kiilerich
refactoring: drop unused 'discovery data' in pull request and compare diffs
r3192 Returns incomming changesets for mercurial repositories
small refactoring, moved shared for diff generation of code into pull-request model
r2442
:param org_repo:
:type org_repo:
:param org_ref:
:type org_ref:
:param other_repo:
:type other_repo:
:param other_ref:
:type other_ref:
"""
if len(org_ref) != 2 or not isinstance(org_ref, (list, tuple)):
raise Exception('org_ref must be a two element list/tuple')
if len(other_ref) != 2 or not isinstance(org_ref, (list, tuple)):
raise Exception('other_ref must be a two element list/tuple')
Enabled compare engine for tags...
r3010 org_repo_scm = org_repo.scm_instance
other_repo_scm = other_repo.scm_instance
alias = org_repo.scm_instance.alias
cs_ranges = self._get_changesets(alias,
org_repo_scm, org_ref,
Mads Kiilerich
refactoring: drop unused 'discovery data' in pull request and compare diffs
r3192 other_repo_scm, other_ref)
return cs_ranges