##// END OF EJS Templates
fixed fetch command for git repos, now it properly fetches from remotes
fixed fetch command for git repos, now it properly fetches from remotes

File last commit:

r3076:5deb16cd beta
r3157:a73aca20 beta
Show More
pull_request.py
285 lines | 10.2 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
Switch to waitress wsgi server by default in rhodecode....
r2597 from rhodecode.model.db import PullRequest, PullRequestReviewers, Notification
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)
return PullRequest.query().filter(PullRequest.other_repo == repo).all()
Added basic models for saving open pull requests...
r2434 def create(self, created_by, org_repo, org_ref, other_repo,
other_ref, revisions, reviewers, title, description=None):
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)
#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(
_('%(user)s wants you to review pull request #%(pr_id)s') % \
{'user': created_by_user.username,
'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)
Enabled compare engine for tags...
r3010 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 discovery_data):
"""
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
Bumped mercurial version to 2.3...
r2684 common, incoming, rheads = discovery_data
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_discovery(self, org_repo, org_ref, other_repo, other_ref):
"""
Get's mercurial discovery data used to calculate difference between
repos and refs
:param org_repo:
:type org_repo:
:param org_ref:
:type org_ref:
:param other_repo:
:type other_repo:
:param other_ref:
:type other_ref:
"""
Bumped mercurial version to 2.3...
r2684 _org_repo = org_repo._repo
org_rev_type, org_rev = org_ref
_other_repo = other_repo._repo
other_rev_type, other_rev = other_ref
small refactoring, moved shared for diff generation of code into pull-request model
r2442 log.debug('Doing discovery for %s@%s vs %s@%s' % (
org_repo, org_ref, other_repo, other_ref)
)
fixes #555 issues when comparing non-related repositories on pull requests or compare view
r2810
Bumped mercurial version to 2.3...
r2684 #log.debug('Filter heads are %s[%s]' % ('', org_ref[1]))
org_peer = localrepo.locallegacypeer(_org_repo.local())
small refactoring, moved shared for diff generation of code into pull-request model
r2442 tmp = discovery.findcommonincoming(
Bumped mercurial version to 2.3...
r2684 repo=_other_repo, # other_repo we check for incoming
remote=org_peer, # org_repo source for incoming
Basic implementation of cherry picking changesets...
r3023 # heads=[_other_repo[other_rev].node(),
# _org_repo[org_rev].node()],
fixes #555 issues when comparing non-related repositories on pull requests or compare view
r2810 force=True
small refactoring, moved shared for diff generation of code into pull-request model
r2442 )
return tmp
def get_compare_data(self, org_repo, org_ref, other_repo, other_ref):
"""
Enabled compare engine for tags...
r3010 Returns a tuple of incomming changesets, and discoverydata cache 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
discovery_data = [None, None, None]
if alias == 'hg':
discovery_data = self._get_discovery(org_repo_scm, org_ref,
other_repo_scm, other_ref)
cs_ranges = self._get_changesets(alias,
org_repo_scm, org_ref,
other_repo_scm, other_ref,
Bumped mercurial version to 2.3...
r2684 discovery_data)
small refactoring, moved shared for diff generation of code into pull-request model
r2442 return cs_ranges, discovery_data