##// END OF EJS Templates
Changed compare-view of remote repos to use incoming option instead of outgoing.
Changed compare-view of remote repos to use incoming option instead of outgoing.

File last commit:

r2350:d787da66 codereview
r2350:d787da66 codereview
Show More
compare.py
148 lines | 5.5 KiB | text/x-python | PythonLexer
Basic compare-view controller with ref parsing
r2241 # -*- coding: utf-8 -*-
"""
rhodecode.controllers.compare
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compare controller for pylons showoing differences between two
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
Implemented basic compare view(for pull requests) for mercurial.
r2348 import binascii
Basic compare-view controller with ref parsing
r2241
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
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
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__()
def _handle_ref(self, ref):
"""
Parse the org...other string
Created base for diffing two repositories inside rhodecode
r2337 Possible formats are
`(branch|book|tag):<name>...(branch|book|tag):<othername>`
Basic compare-view controller with ref parsing
r2241
Use webob exception as often as possible
r2242 :param ref: <orginal_reference>...<other_reference>
:type ref: str
Basic compare-view controller with ref parsing
r2241 """
org_repo = c.rhodecode_repo.name
def org_parser(org):
_repo = org_repo
name, val = org.split(':')
return _repo, (name, val)
def other_parser(other):
simplified compare url logic for outside repos
r2245 _other_repo = request.GET.get('repo')
Basic compare-view controller with ref parsing
r2241 _repo = org_repo
name, val = other.split(':')
simplified compare url logic for outside repos
r2245 if _other_repo:
Created base for diffing two repositories inside rhodecode
r2337 #TODO: do an actual repo loookup within rhodecode
_repo = _other_repo
Basic compare-view controller with ref parsing
r2241
return _repo, (name, val)
if '...' in ref:
try:
org, other = ref.split('...')
org_repo, org_ref = org_parser(org)
other_repo, other_ref = other_parser(other)
return org_repo, org_ref, other_repo, other_ref
except:
log.error(traceback.format_exc())
raise HTTPNotFound
Created base for diffing two repositories inside rhodecode
r2337 def _get_changesets(self, org_repo, org_ref, other_repo, other_ref):
changesets = []
#case two independent repos
if org_repo != other_repo:
from mercurial import discovery
Changed compare-view of remote repos to use incoming option instead of outgoing.
r2350 other = org_repo._repo
repo = other_repo._repo
onlyheads = None
tmp = discovery.findcommonincoming(repo=repo,
remote=other,
heads=onlyheads, force=False)
common, incoming, rheads = tmp
if not incoming:
revs = []
else:
revs = other.changelog.findmissing(common, rheads)
for cs in map(binascii.hexlify, revs):
Created base for diffing two repositories inside rhodecode
r2337 changesets.append(org_repo.get_changeset(cs))
else:
Implemented basic compare view(for pull requests) for mercurial.
r2348 revs = ['ancestors(%s) and not ancestors(%s)' % (org_ref[1],
other_ref[1])]
from mercurial import scmutil
out = scmutil.revrange(org_repo._repo, revs)
for cs in reversed(out):
Created base for diffing two repositories inside rhodecode
r2337 changesets.append(org_repo.get_changeset(cs))
return changesets
Basic compare-view controller with ref parsing
r2241 def index(self, ref):
org_repo, org_ref, other_repo, other_ref = self._handle_ref(ref)
Changed compare-view of remote repos to use incoming option instead of outgoing.
r2350 c.swap_url = h.url('compare_home', repo_name=c.repo_name,
ref='%s...%s' % (':'.join(other_ref),
':'.join(org_ref)))
Created base for diffing two repositories inside rhodecode
r2337 c.org_repo = org_repo = Repository.get_by_repo_name(org_repo)
c.other_repo = other_repo = Repository.get_by_repo_name(other_repo)
c.cs_ranges = self._get_changesets(org_repo.scm_instance,
org_ref,
other_repo.scm_instance,
other_ref)
c.org_ref = org_ref[1]
c.other_ref = other_ref[1]
Changed compare-view of remote repos to use incoming option instead of outgoing.
r2350 # diff needs to have swapped org with other to generate proper diff
_diff = diffs.differ(other_repo, other_ref, org_repo, org_ref)
Created base for diffing two repositories inside rhodecode
r2337 diff_processor = diffs.DiffProcessor(_diff, format='gitdiff')
Implemented basic compare view(for pull requests) for mercurial.
r2348 _parsed = diff_processor.prepare()
Created base for diffing two repositories inside rhodecode
r2337
Implemented basic compare view(for pull requests) for mercurial.
r2348 c.files = []
c.changes = {}
Changed compare-view of remote repos to use incoming option instead of outgoing.
r2350 # sort Added first then Modified last Deleted files
sorter = lambda info: {'A': 0, 'M': 1, 'D': 2}.get(info['operation'])
for f in sorted(_parsed, key=sorter):
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']])
diff = diff_processor.as_html(enable_comments=False, diff_lines=[f])
c.changes[fid] = [f['operation'], f['filename'], diff]
Created base for diffing two repositories inside rhodecode
r2337
return render('compare/compare_diff.html')