##// END OF EJS Templates
notification inbox show subject
notification inbox show subject

File last commit:

r3387:bd5420ea beta
r3431:f60a07db beta
Show More
compare.py
192 lines | 7.4 KiB | text/x-python | PythonLexer
Basic compare-view controller with ref parsing
r2241 # -*- coding: utf-8 -*-
"""
rhodecode.controllers.compare
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mads Kiilerich
compare and diff: remove unused "bundle" functionality...
r3304 compare controller for pylons showing differences between two
Basic compare-view controller with ref parsing
r2241 repos, branches, bookmarks or tips
:created_on: May 6, 2012
:author: marcink
:copyright: (C) 2010-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
import traceback
Created base for diffing two repositories inside rhodecode
r2337 from webob.exc import HTTPNotFound
Basic compare-view controller with ref parsing
r2241 from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect
Add check for existing revisions in compare view
r2593 from pylons.i18n.translation import _
Basic compare-view controller with ref parsing
r2241
Add check for existing revisions in compare view
r2593 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError, RepositoryError
Implemented basic compare view(for pull requests) for mercurial.
r2348 from rhodecode.lib import helpers as h
Basic compare-view controller with ref parsing
r2241 from rhodecode.lib.base import BaseRepoController, render
from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
Created base for diffing two repositories inside rhodecode
r2337 from rhodecode.lib import diffs
from rhodecode.model.db import Repository
small refactoring, moved shared for diff generation of code into pull-request model
r2442 from rhodecode.model.pull_request import PullRequestModel
swap the select values with revisions dynamically when switching the repos on pull request view...
r2847 from webob.exc import HTTPBadRequest
Optimized look of compare view of changesets....
r3011 from rhodecode.lib.diffs import LimitedDiffContainer
rev_start for compare should use parents only if there are present
r3386 from rhodecode.lib.vcs.backends.base import EmptyChangeset
Basic compare-view controller with ref parsing
r2241
log = logging.getLogger(__name__)
class CompareController(BaseRepoController):
@LoginRequired()
@HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
def __before__(self):
super(CompareController, self).__before__()
swap the select values with revisions dynamically when switching the repos on pull request view...
r2847 def __get_cs_or_redirect(self, rev, repo, redirect_after=True,
partial=False):
Add check for existing revisions in compare view
r2593 """
Safe way to get changeset if error occur it redirects to changeset with
swap the select values with revisions dynamically when switching the repos on pull request view...
r2847 proper message. If partial is set then don't do redirect raise Exception
instead
Add check for existing revisions in compare view
r2593
:param rev: revision to fetch
:param repo: repo instance
"""
try:
type_, rev = rev
return repo.scm_instance.get_changeset(rev)
except EmptyRepositoryError, e:
if not redirect_after:
return None
h.flash(h.literal(_('There are no changesets yet')),
category='warning')
redirect(url('summary_home', repo_name=repo.repo_name))
except RepositoryError, e:
Bumped mercurial version to 2.3...
r2684 log.error(traceback.format_exc())
Add check for existing revisions in compare view
r2593 h.flash(str(e), category='warning')
swap the select values with revisions dynamically when switching the repos on pull request view...
r2847 if not partial:
redirect(h.url('summary_home', repo_name=repo.repo_name))
raise HTTPBadRequest()
Add check for existing revisions in compare view
r2593
Rewrote url routes to make all validations and parsing for compare view + added compare fork button into forked repos
r2363 def index(self, org_ref_type, org_ref, other_ref_type, other_ref):
Improved cross repos diffs...
r2362
Rewrote url routes to make all validations and parsing for compare view + added compare fork button into forked repos
r2363 org_repo = c.rhodecode_db_repo.repo_name
org_ref = (org_ref_type, org_ref)
other_ref = (other_ref_type, other_ref)
Mads Kiilerich
compare: rename optional compare_url parameter repo to other_repo...
r3317 other_repo = request.GET.get('other_repo', org_repo)
Optimized look of compare view of changesets....
r3011 c.fulldiff = fulldiff = request.GET.get('fulldiff')
Basic implementation of cherry picking changesets...
r3023 rev_start = request.GET.get('rev_start')
rev_end = request.GET.get('rev_end')
Rewrote url routes to make all validations and parsing for compare view + added compare fork button into forked repos
r2363
Mads Kiilerich
compare: rename optional compare_url parameter repo to other_repo...
r3317 c.swap_url = h.url('compare_url', as_form=request.GET.get('as_form'),
repo_name=other_repo,
org_ref_type=other_ref[0], org_ref=other_ref[1],
fixed broken swap url, and added a test to detect it in feature
r3320 other_repo=org_repo,
Mads Kiilerich
compare: rename optional compare_url parameter repo to other_repo...
r3317 other_ref_type=org_ref[0], other_ref=org_ref[1])
Rewrote url routes to make all validations and parsing for compare view + added compare fork button into forked repos
r2363
fixed pull-requests with cherry picking changesets...
r3380 partial = request.environ.get('HTTP_X_PARTIAL_XHR')
org_repo = Repository.get_by_repo_name(org_repo)
other_repo = Repository.get_by_repo_name(other_repo)
Improved cross repos diffs...
r2362
fixed pull-requests with cherry picking changesets...
r3380 self.__get_cs_or_redirect(rev=org_ref, repo=org_repo, partial=partial)
self.__get_cs_or_redirect(rev=other_ref, repo=other_repo, partial=partial)
if org_repo is None:
Mads Kiilerich
compare: more helpful error messages when a repo wasn't found
r3143 log.error('Could not find org repo %s' % org_repo)
raise HTTPNotFound
fixed pull-requests with cherry picking changesets...
r3380 if other_repo is None:
Mads Kiilerich
compare: more helpful error messages when a repo wasn't found
r3143 log.error('Could not find other repo %s' % other_repo)
Improved cross repos diffs...
r2362 raise HTTPNotFound
fixed pull-requests with cherry picking changesets...
r3380 if org_repo != other_repo and h.is_git(org_repo):
Enabled compare engine for tags...
r3010 log.error('compare of two remote repos not available for GIT REPOS')
data checks
r2444 raise HTTPNotFound
Enabled compare engine for tags...
r3010
fixed pull-requests with cherry picking changesets...
r3380 if org_repo.scm_instance.alias != other_repo.scm_instance.alias:
Enabled compare engine for tags...
r3010 log.error('compare of two different kind of remote repos not available')
raise HTTPNotFound
fixed pull-requests with cherry picking changesets...
r3380 c.org_repo = org_repo
c.other_repo = other_repo
c.org_ref = org_ref[1]
c.other_ref = other_ref[1]
c.org_ref_type = org_ref[0]
c.other_ref_type = other_ref[0]
Add check for existing revisions in compare view
r2593
Basic implementation of cherry picking changesets...
r3023 if rev_start and rev_end:
fixed pull-requests with cherry picking changesets...
r3380 # swap revs with cherry picked ones, save them for display
#org_ref = ('rev', rev_start)
#other_ref = ('rev', rev_end)
c.org_ref = rev_start[:12]
c.other_ref = rev_end[:12]
# get parent of
# rev start to include it in the diff
_cs = other_repo.scm_instance.get_changeset(rev_start)
better handling of EmptyChangeset case in cherry pick pull request
r3387 rev_start = _cs.parents[0].raw_id if _cs.parents else EmptyChangeset().raw_id
Basic implementation of cherry picking changesets...
r3023 org_ref = ('rev', rev_start)
other_ref = ('rev', rev_end)
fixed pull-requests with cherry picking changesets...
r3380 #if we cherry pick it's not remote, make the other_repo org_repo
org_repo = other_repo
Basic implementation of cherry picking changesets...
r3023
Mads Kiilerich
compare: show aggregated diff of what will be merged to other repo, using merge ancestor...
r3323 c.cs_ranges, ancestor = PullRequestModel().get_compare_data(
org_repo, org_ref, other_repo, other_ref)
Created base for diffing two repositories inside rhodecode
r2337
added changeset review status into repo/branch compare view
r2393 c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in
c.cs_ranges])
Added basic models for saving open pull requests...
r2434 # defines that we need hidden inputs with changesets
c.as_form = request.GET.get('as_form', False)
swap the select values with revisions dynamically when switching the repos on pull request view...
r2847 if partial:
created pull-request overview
r2395 return render('compare/compare_cs.html')
added changeset review status into repo/branch compare view
r2393
fixed pull-requests with cherry picking changesets...
r3380 if ancestor and org_repo != other_repo:
Mads Kiilerich
compare: show aggregated diff of what will be merged to other repo, using merge ancestor...
r3323 # case we want a simple diff without incoming changesets,
# previewing what will be merged.
# Make the diff on the forked repo, with
#590 Add GET flag that controls the way the diff are generated, for pull requests we want to use non-bundle based diffs,...
r2892 # revision that is common ancestor
fixed pull-requests with cherry picking changesets...
r3380 log.debug('Using ancestor %s as org_ref instead of %s'
% (ancestor, org_ref))
Mads Kiilerich
compare: show aggregated diff of what will be merged to other repo, using merge ancestor...
r3323 org_ref = ('rev', ancestor)
Mads Kiilerich
compare: swap org and other when they refer to different repos, ie are pull request style...
r3322 org_repo = other_repo
#590 Add GET flag that controls the way the diff are generated, for pull requests we want to use non-bundle based diffs,...
r2892
Multiple changes for compare system...
r3015 diff_limit = self.cut_off_limit if not fulldiff else None
Basic implementation of cherry picking changesets...
r3023
Mads Kiilerich
compare and diff: remove unused "bundle" functionality...
r3304 _diff = diffs.differ(org_repo, org_ref, other_repo, other_ref)
#590 Add GET flag that controls the way the diff are generated, for pull requests we want to use non-bundle based diffs,...
r2892
Multiple changes for compare system...
r3015 diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff',
Optimized look of compare view of changesets....
r3011 diff_limit=diff_limit)
Implemented basic compare view(for pull requests) for mercurial.
r2348 _parsed = diff_processor.prepare()
Created base for diffing two repositories inside rhodecode
r2337
Optimized look of compare view of changesets....
r3011 c.limited_diff = False
if isinstance(_parsed, LimitedDiffContainer):
c.limited_diff = True
Implemented basic compare view(for pull requests) for mercurial.
r2348 c.files = []
c.changes = {}
Multiple changes for compare system...
r3015 c.lines_added = 0
c.lines_deleted = 0
added changeset review status into repo/branch compare view
r2393 for f in _parsed:
Multiple changes for compare system...
r3015 st = f['stats']
if st[0] != 'b':
c.lines_added += st[0]
c.lines_deleted += st[1]
Implemented basic compare view(for pull requests) for mercurial.
r2348 fid = h.FID('', f['filename'])
c.files.append([fid, f['operation'], f['filename'], f['stats']])
Implemented generation of changesets based...
r2995 diff = diff_processor.as_html(enable_comments=False, parsed_lines=[f])
Implemented basic compare view(for pull requests) for mercurial.
r2348 c.changes[fid] = [f['operation'], f['filename'], diff]
Created base for diffing two repositories inside rhodecode
r2337
return render('compare/compare_diff.html')