diff --git a/rhodecode/controllers/compare.py b/rhodecode/controllers/compare.py --- a/rhodecode/controllers/compare.py +++ b/rhodecode/controllers/compare.py @@ -88,14 +88,14 @@ class CompareController(BaseRepoControll org_ref = (org_ref_type, org_ref) other_ref = (other_ref_type, other_ref) other_repo = request.GET.get('repo', org_repo) - bundle_compare = str2bool(request.GET.get('bundle', True)) + remote_compare = str2bool(request.GET.get('bundle', True)) c.fulldiff = fulldiff = request.GET.get('fulldiff') c.swap_url = h.url('compare_url', repo_name=other_repo, org_ref_type=other_ref[0], org_ref=other_ref[1], other_ref_type=org_ref[0], other_ref=org_ref[1], repo=org_repo, as_form=request.GET.get('as_form'), - bundle=bundle_compare) + bundle=remote_compare) c.org_repo = org_repo = Repository.get_by_repo_name(org_repo) c.other_repo = other_repo = Repository.get_by_repo_name(other_repo) @@ -128,20 +128,21 @@ class CompareController(BaseRepoControll if partial: return render('compare/compare_cs.html') - if not bundle_compare and c.cs_ranges: + c.org_ref = org_ref[1] + c.other_ref = other_ref[1] + + if not remote_compare and c.cs_ranges: # case we want a simple diff without incoming changesets, just # for review purposes. Make the diff on the forked repo, with # revision that is common ancestor other_ref = ('rev', c.cs_ranges[-1].parents[0].raw_id) other_repo = org_repo - c.org_ref = org_ref[1] - c.other_ref = other_ref[1] + diff_limit = self.cut_off_limit if not fulldiff else None + _diff = diffs.differ(org_repo, org_ref, other_repo, other_ref, + discovery_data, remote_compare=remote_compare) - _diff = diffs.differ(other_repo, other_ref, org_repo, org_ref, - discovery_data, bundle_compare=bundle_compare) - diff_limit = self.cut_off_limit if not fulldiff else None - diff_processor = diffs.DiffProcessor(_diff, format='gitdiff', + diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff', diff_limit=diff_limit) _parsed = diff_processor.prepare() @@ -151,8 +152,13 @@ class CompareController(BaseRepoControll c.files = [] c.changes = {} - + c.lines_added = 0 + c.lines_deleted = 0 for f in _parsed: + st = f['stats'] + if st[0] != 'b': + c.lines_added += st[0] + c.lines_deleted += st[1] fid = h.FID('', f['filename']) c.files.append([fid, f['operation'], f['filename'], f['stats']]) diff = diff_processor.as_html(enable_comments=False, parsed_lines=[f]) diff --git a/rhodecode/controllers/pullrequests.py b/rhodecode/controllers/pullrequests.py --- a/rhodecode/controllers/pullrequests.py +++ b/rhodecode/controllers/pullrequests.py @@ -51,6 +51,7 @@ from rhodecode.model.comment import Chan from rhodecode.model.changeset_status import ChangesetStatusModel from rhodecode.model.forms import PullRequestForm from rhodecode.lib.vcs.exceptions import EmptyRepositoryError +from rhodecode.lib.vcs.backends.base import EmptyChangeset log = logging.getLogger(__name__) @@ -277,7 +278,9 @@ class PullrequestsController(BaseRepoCon # case we want a simple diff without incoming changesets, just # for review purposes. Make the diff on the forked repo, with # revision that is common ancestor - other_ref = ('rev', c.cs_ranges[-1].parents[0].raw_id) + other_ref = ('rev', getattr(c.cs_ranges[-1].parents[0] + if c.cs_ranges[-1].parents + else EmptyChangeset(), 'raw_id')) other_repo = org_repo c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges]) @@ -286,9 +289,9 @@ class PullrequestsController(BaseRepoCon c.org_ref = org_ref[1] c.other_ref = other_ref[1] - # diff needs to have swapped org with other to generate proper diff - _diff = diffs.differ(other_repo, other_ref, org_repo, org_ref, + _diff = diffs.differ(org_repo, org_ref, other_repo, other_ref, discovery_data) + diff_processor = diffs.DiffProcessor(_diff, format='gitdiff') _parsed = diff_processor.prepare() diff --git a/rhodecode/lib/diffs.py b/rhodecode/lib/diffs.py --- a/rhodecode/lib/diffs.py +++ b/rhodecode/lib/diffs.py @@ -702,52 +702,48 @@ class InMemoryBundleRepo(bundlerepositor def differ(org_repo, org_ref, other_repo, other_ref, discovery_data=None, - bundle_compare=False, context=3, ignore_whitespace=False): + remote_compare=False, context=3, ignore_whitespace=False): """ - General differ between branches, bookmarks, revisions of two remote related - repositories + General differ between branches, bookmarks, revisions of two remote or + local but related repositories :param org_repo: - :type org_repo: :param org_ref: - :type org_ref: :param other_repo: :type other_repo: - :param other_ref: :type other_ref: """ - bundlerepo = None - ignore_whitespace = ignore_whitespace - context = context org_repo_scm = org_repo.scm_instance + other_repo_scm = other_repo.scm_instance + org_repo = org_repo_scm._repo - other_repo = other_repo.scm_instance._repo - opts = diffopts(git=True, ignorews=ignore_whitespace, context=context) + other_repo = other_repo_scm._repo + org_ref = org_ref[1] other_ref = other_ref[1] if org_repo == other_repo: log.debug('running diff between %s@%s and %s@%s' % (org_repo, org_ref, other_repo, other_ref)) - _diff = org_repo_scm.get_diff(rev1=other_ref, rev2=org_ref, + _diff = org_repo_scm.get_diff(rev1=org_ref, rev2=other_ref, ignore_whitespace=ignore_whitespace, context=context) return _diff - elif bundle_compare: - + elif remote_compare: + opts = diffopts(git=True, ignorews=ignore_whitespace, context=context) common, incoming, rheads = discovery_data - other_repo_peer = localrepo.locallegacypeer(other_repo.local()) + org_repo_peer = localrepo.locallegacypeer(org_repo.local()) # create a bundle (uncompressed if other repo is not local) - if other_repo_peer.capable('getbundle') and incoming: + if org_repo_peer.capable('getbundle'): # disable repo hooks here since it's just bundle ! # patch and reset hooks section of UI config to not run any # hooks on fetching archives with subrepos - for k, _ in other_repo.ui.configitems('hooks'): - other_repo.ui.setconfig('hooks', k, None) + for k, _ in org_repo.ui.configitems('hooks'): + org_repo.ui.setconfig('hooks', k, None) - unbundle = other_repo.getbundle('incoming', common=common, - heads=None) + unbundle = org_repo.getbundle('incoming', common=common, + heads=None) buf = BytesIO() while True: @@ -764,8 +760,9 @@ def differ(org_repo, org_ref, other_repo bundlerepo = InMemoryBundleRepo(ui, path=org_repo.root, bundlestream=unbundle) - return ''.join(patch.diff(bundlerepo or org_repo, - node1=org_repo[org_ref].node(), - node2=other_repo[other_ref].node(), - opts=opts)) + return ''.join(patch.diff(bundlerepo, + node1=other_repo[other_ref].node(), + node2=org_repo[org_ref].node(), + opts=opts)) + return '' \ No newline at end of file diff --git a/rhodecode/model/pull_request.py b/rhodecode/model/pull_request.py --- a/rhodecode/model/pull_request.py +++ b/rhodecode/model/pull_request.py @@ -185,21 +185,21 @@ class PullRequestModel(BaseModel): revs = [ "ancestors(%s('%s')) and not ancestors(%s('%s'))" % ( + _revset_predicates[other_ref[0]], other_ref[1], _revset_predicates[org_ref[0]], org_ref[1], - _revset_predicates[other_ref[0]], other_ref[1] ) ] out = scmutil.revrange(org_repo._repo, revs) - for cs in reversed(out): + for cs in (out): changesets.append(org_repo.get_changeset(cs)) elif alias == 'git': so, se = org_repo.run_git_command( - 'log --pretty="format: %%H" -s -p %s..%s' % (org_ref[1], + 'log --reverse --pretty="format: %%H" -s -p %s..%s' % (org_ref[1], other_ref[1]) ) ids = re.findall(r'[0-9a-fA-F]{40}', so) - for cs in reversed(ids): + for cs in (ids): changesets.append(org_repo.get_changeset(cs)) return changesets diff --git a/rhodecode/templates/changeset/changeset_range.html b/rhodecode/templates/changeset/changeset_range.html --- a/rhodecode/templates/changeset/changeset_range.html +++ b/rhodecode/templates/changeset/changeset_range.html @@ -26,7 +26,7 @@
| ${_('No changesets')} |
| No changesets |