# HG changeset patch # User Marcin Kuzminski # Date 1353713378 -3600 # Node ID c2a206162062e410dd3b57d27b3f5f45300d89d1 # Parent 0ed42ca7ff9ece26467a312d42ce0eff35e7b3c2 Basic implementation of cherry picking changesets for pull request, ref #575 diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/controllers/changeset.py --- a/rhodecode/controllers/changeset.py Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/controllers/changeset.py Sat Nov 24 00:29:38 2012 +0100 @@ -194,7 +194,7 @@ rev_start = rev_range[0] rev_end = rev_range[1] rev_ranges = c.rhodecode_repo.get_changesets(start=rev_start, - end=rev_end) + end=rev_end) else: rev_ranges = [c.rhodecode_repo.get_changeset(revision)] diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/controllers/compare.py --- a/rhodecode/controllers/compare.py Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/controllers/compare.py Sat Nov 24 00:29:38 2012 +0100 @@ -42,6 +42,7 @@ from webob.exc import HTTPBadRequest from rhodecode.lib.utils2 import str2bool from rhodecode.lib.diffs import LimitedDiffContainer +from rhodecode.lib.vcs.backends.base import EmptyChangeset log = logging.getLogger(__name__) @@ -88,14 +89,16 @@ org_ref = (org_ref_type, org_ref) other_ref = (other_ref_type, other_ref) other_repo = request.GET.get('repo', org_repo) - remote_compare = str2bool(request.GET.get('bundle', True)) + incoming_changesets = str2bool(request.GET.get('bundle', False)) c.fulldiff = fulldiff = request.GET.get('fulldiff') + rev_start = request.GET.get('rev_start') + rev_end = request.GET.get('rev_end') 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=remote_compare) + bundle=incoming_changesets) c.org_repo = org_repo = Repository.get_by_repo_name(org_repo) c.other_repo = other_repo = Repository.get_by_repo_name(other_repo) @@ -116,8 +119,13 @@ 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 rev_start and rev_end: + #replace our org_ref with given CS + org_ref = ('rev', rev_start) + other_ref = ('rev', rev_end) + c.cs_ranges, discovery_data = PullRequestModel().get_compare_data( - org_repo, org_ref, other_repo, other_ref + org_repo, org_ref, other_repo, other_ref, ) c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in @@ -131,16 +139,22 @@ c.org_ref = org_ref[1] c.other_ref = other_ref[1] - if not remote_compare and c.cs_ranges: + if not incoming_changesets and c.cs_ranges and c.org_repo != c.other_repo: # 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) + _org_ref = org_ref + org_ref = ('rev', getattr(c.cs_ranges[0].parents[0] + if c.cs_ranges[0].parents + else EmptyChangeset(), 'raw_id')) + log.debug('Changed org_ref from %s to %s' % (_org_ref, org_ref)) other_repo = org_repo 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) + discovery_data, + remote_compare=incoming_changesets) diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff', diff_limit=diff_limit) diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/controllers/pullrequests.py --- a/rhodecode/controllers/pullrequests.py Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/controllers/pullrequests.py Sat Nov 24 00:29:38 2012 +0100 @@ -52,6 +52,8 @@ from rhodecode.model.forms import PullRequestForm from rhodecode.lib.vcs.exceptions import EmptyRepositoryError from rhodecode.lib.vcs.backends.base import EmptyChangeset +from rhodecode.lib.diffs import LimitedDiffContainer +from rhodecode.lib.utils2 import str2bool log = logging.getLogger(__name__) @@ -195,6 +197,17 @@ revisions = _form['revisions'] reviewers = _form['review_members'] + # if we have cherry picked pull request we don't care what is in + # org_ref/other_ref + rev_start = request.POST.get('rev_start') + rev_end = request.POST.get('rev_end') + + if rev_start and rev_end: + # this is swapped to simulate that rev_end is a revision from + # parent of the fork + org_ref = 'rev:%s:%s' % (rev_end, rev_end) + other_ref = 'rev:%s:%s' % (rev_start, rev_start) + title = _form['pullrequest_title'] description = _form['pullrequest_desc'] @@ -228,7 +241,7 @@ request.POST.get('reviewers_ids', '').split(','))) PullRequestModel().update_reviewers(pull_request_id, reviewers_ids) - Session.commit() + Session().commit() return True raise HTTPForbidden() @@ -242,7 +255,7 @@ Session().commit() h.flash(_('Successfully deleted pull request'), category='success') - return redirect(url('admin_settings_my_account')) + return redirect(url('admin_settings_my_account', anchor='pullrequests')) raise HTTPForbidden() def _load_compare_data(self, pull_request, enable_comments=True): @@ -252,13 +265,15 @@ :param pull_request: :type pull_request: """ + rev_start = request.GET.get('rev_start') + rev_end = request.GET.get('rev_end') org_repo = pull_request.org_repo (org_ref_type, org_ref_name, org_ref_rev) = pull_request.org_ref.split(':') - other_repo = pull_request.other_repo + other_repo = org_repo (other_ref_type, other_ref_name, other_ref_rev) = pull_request.other_ref.split(':') @@ -271,34 +286,44 @@ c.org_repo = org_repo c.other_repo = other_repo - c.cs_ranges, discovery_data = PullRequestModel().get_compare_data( - org_repo, org_ref, other_repo, other_ref - ) - if 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', getattr(c.cs_ranges[-1].parents[0] - if c.cs_ranges[-1].parents - else EmptyChangeset(), 'raw_id')) - other_repo = org_repo + c.fulldiff = fulldiff = request.GET.get('fulldiff') + + c.cs_ranges = [org_repo.get_changeset(x) for x in pull_request.revisions] + + other_ref = ('rev', getattr(c.cs_ranges[0].parents[0] + if c.cs_ranges[0].parents + else EmptyChangeset(), 'raw_id')) c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges]) + c.target_repo = c.repo_name # defines that we need hidden inputs with changesets c.as_form = request.GET.get('as_form', False) c.org_ref = org_ref[1] c.other_ref = other_ref[1] - _diff = diffs.differ(org_repo, org_ref, other_repo, other_ref, - discovery_data) + + diff_limit = self.cut_off_limit if not fulldiff else None + + #we swap org/other ref since we run a simple diff on one repo + _diff = diffs.differ(org_repo, other_ref, other_repo, org_ref) - diff_processor = diffs.DiffProcessor(_diff, format='gitdiff') + diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff', + diff_limit=diff_limit) _parsed = diff_processor.prepare() + c.limited_diff = False + if isinstance(_parsed, LimitedDiffContainer): + c.limited_diff = True + 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=enable_comments, diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/lib/diffs.py --- a/rhodecode/lib/diffs.py Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/lib/diffs.py Sat Nov 24 00:29:38 2012 +0100 @@ -726,7 +726,7 @@ if org_repo == other_repo: log.debug('running diff between %s@%s and %s@%s' - % (org_repo, org_ref, other_repo, other_ref)) + % (org_repo.path, org_ref, other_repo.path, other_ref)) _diff = org_repo_scm.get_diff(rev1=org_ref, rev2=other_ref, ignore_whitespace=ignore_whitespace, context=context) return _diff @@ -742,8 +742,7 @@ # hooks on fetching archives with subrepos for k, _ in org_repo.ui.configitems('hooks'): org_repo.ui.setconfig('hooks', k, None) - - unbundle = org_repo.getbundle('incoming', common=common, + unbundle = org_repo.getbundle('incoming', common=None, heads=None) buf = BytesIO() diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/model/pull_request.py --- a/rhodecode/model/pull_request.py Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/model/pull_request.py Sat Nov 24 00:29:38 2012 +0100 @@ -152,27 +152,30 @@ to other_repo@other_ref :param org_repo: - :type org_repo: :param org_ref: - :type org_ref: :param other_repo: - :type other_repo: :param other_ref: - :type other_ref: :param tmp: - :type tmp: """ + changesets = [] #case two independent repos common, incoming, rheads = discovery_data - if org_repo != other_repo and incoming: + if org_repo != other_repo: + revs = [ + org_repo._repo.lookup(org_ref[1]), + org_repo._repo.lookup(other_ref[1]), + ] + obj = findcommonoutgoing(org_repo._repo, localrepo.locallegacypeer(other_repo._repo.local()), + revs, force=True) revs = obj.missing - for cs in reversed(map(binascii.hexlify, revs)): - changesets.append(org_repo.get_changeset(cs)) + for cs in map(binascii.hexlify, revs): + _cs = org_repo.get_changeset(cs) + changesets.append(_cs) else: #no remote compare do it on the same repository if alias == 'hg': @@ -234,8 +237,8 @@ tmp = discovery.findcommonincoming( repo=_other_repo, # other_repo we check for incoming remote=org_peer, # org_repo source for incoming - heads=[_other_repo[other_rev].node(), - _org_repo[org_rev].node()], +# heads=[_other_repo[other_rev].node(), +# _org_repo[org_rev].node()], force=True ) return tmp diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/templates/changelog/changelog.html --- a/rhodecode/templates/changelog/changelog.html Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/templates/changelog/changelog.html Sat Nov 24 00:29:38 2012 +0100 @@ -203,6 +203,8 @@ YUD.setStyle('rev_range_container','display',''); YUD.setStyle('rev_range_clear','display',''); + YUD.get('open_new_pr').href += '?rev_start={0}&rev_end={1}'.format(rev_start,rev_end); + } else{ YUD.setStyle('rev_range_container','display','none'); diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/templates/pullrequests/pullrequest.html --- a/rhodecode/templates/pullrequests/pullrequest.html Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/templates/pullrequests/pullrequest.html Sat Nov 24 00:29:38 2012 +0100 @@ -21,7 +21,9 @@ ${h.form(url('pullrequest', repo_name=c.repo_name), method='post', id='pull_request_form')}
- + + + ##ORG
@@ -141,7 +143,9 @@ org_ref_type='org_ref_type', org_ref='org_ref', other_ref_type='other_ref_type', other_ref='other_ref', repo='other_repo', - as_form=True, bundle=False)}"; + as_form=True, bundle=False, + rev_start=request.GET.get('rev_start',''), + rev_end=request.GET.get('rev_end',''))}"; var select_refs = YUQ('#pull_request_form select.refs') var rev_data = {}; // gather the org/other ref and repo here diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/templates/pullrequests/pullrequest_show.html --- a/rhodecode/templates/pullrequests/pullrequest_show.html Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/templates/pullrequests/pullrequest_show.html Sat Nov 24 00:29:38 2012 +0100 @@ -58,7 +58,7 @@
${_('Created on')}: ${h.fmt_date(c.pull_request.created_on)}
-
+
##DIFF
@@ -66,33 +66,41 @@
##CS -
${_('Incoming changesets')}
+
${ungettext('Showing %s commit','Showing %s commits', len(c.cs_ranges)) % len(c.cs_ranges)}
<%include file="/compare/compare_cs.html" /> - + ## FILES -
- % if c.files: -
${_('Files affected')}
-
+
+ + % if c.limited_diff: + ${ungettext('%s file changed', '%s files changed', len(c.files)) % len(c.files)} + % else: + ${ungettext('%s file changed with %s insertions and %s deletions','%s files changed with %s insertions and %s deletions', len(c.files)) % (len(c.files),c.lines_added,c.lines_deleted)}: + %endif + +
+
+ %if not c.files: + ${_('No files')} + %endif %for fid, change, f, stat in c.files:
${h.link_to(h.safe_unicode(f),h.url.current(anchor=fid))}
${h.fancy_file_stats(stat)}
%endfor -
- %else: -
${_('Click to load diff details')}
- %endif
+ % if c.limited_diff: +
${_('Changeset was too big and was cut off...')}
+ % endif
## REVIEWERS

${_('Pull request reviewers')}

-
+
## members goes here ! -
+
    %for member,status in c.pull_request_reviewers:
  • @@ -137,12 +145,14 @@ ## diff block -
    <%namespace name="diff_block" file="/changeset/diff_block.html"/> %for fid, change, f, stat in c.files: ${diff_block.diff_block_simple([c.changes[fid]])} %endfor -
    + % if c.limited_diff: +

    ${_('Changeset was too big and was cut off...')}

    + % endif + ## template for inline comment form <%namespace name="comment" file="/changeset/changeset_file_comment.html"/> diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/tests/functional/test_compare.py --- a/rhodecode/tests/functional/test_compare.py Fri Nov 23 23:01:27 2012 +0100 +++ b/rhodecode/tests/functional/test_compare.py Sat Nov 24 00:29:38 2012 +0100 @@ -6,251 +6,175 @@ from rhodecode.lib.vcs.backends.base import EmptyChangeset +def _fork_repo(fork_name, vcs_type, parent=None): + if vcs_type =='hg': + _REPO = HG_REPO + elif vcs_type == 'git': + _REPO = GIT_REPO + + if parent: + _REPO = parent + + form_data = dict( + repo_name=fork_name, + repo_name_full=fork_name, + repo_group=None, + repo_type=vcs_type, + description='', + private=False, + copy_permissions=False, + landing_rev='tip', + update_after_clone=False, + fork_parent_id=Repository.get_by_repo_name(_REPO), + ) + repo = RepoModel().create_fork(form_data, cur_user=TEST_USER_ADMIN_LOGIN) + + Session().commit() + return Repository.get_by_repo_name(fork_name) + + +def _commit_change(repo, filename, content, message, vcs_type, parent=None, newfile=False): + repo = Repository.get_by_repo_name(repo) + _cs = parent + if not parent: + _cs = EmptyChangeset(alias=vcs_type) + + if newfile: + cs = ScmModel().create_node( + repo=repo.scm_instance, repo_name=repo.repo_name, + cs=_cs, user=TEST_USER_ADMIN_LOGIN, + author=TEST_USER_ADMIN_LOGIN, + message=message, + content=content, + f_path=filename + ) + else: + cs = ScmModel().commit_change( + repo=repo.scm_instance, repo_name=repo.repo_name, + cs=parent, user=TEST_USER_ADMIN_LOGIN, + author=TEST_USER_ADMIN_LOGIN, + message=message, + content=content, + f_path=filename + ) + return cs + + class TestCompareController(TestController): - def test_compare_tag_hg(self): - self.log_user() - tag1 = '0.1.2' - tag2 = '0.1.3' - response = self.app.get(url(controller='compare', action='index', - repo_name=HG_REPO, - org_ref_type="tag", - org_ref=tag1, - other_ref_type="tag", - other_ref=tag2, - )) - response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, tag1, HG_REPO, tag2)) - ## outgoing changesets between tags - response.mustcontain('''r112:c5ddebc06eaa''' % HG_REPO) - response.mustcontain('''r115:70d4cef8a376''' % HG_REPO) - response.mustcontain('''r116:9749bfbfc0d2''' % HG_REPO) - response.mustcontain('''r117:41fda979f02f''' % HG_REPO) - response.mustcontain('''r118:bb1a3ab98cc4''' % HG_REPO) - response.mustcontain('''r119:36e0fc9d2808''' % HG_REPO) - response.mustcontain('''r120:17544fbfcd33''' % HG_REPO) - - ## files diff - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - response.mustcontain('''''' % (HG_REPO, tag1, tag2)) - - def test_compare_tag_git(self): - self.log_user() - tag1 = 'v0.1.2' - tag2 = 'v0.1.3' - response = self.app.get(url(controller='compare', action='index', - repo_name=GIT_REPO, - org_ref_type="tag", - org_ref=tag1, - other_ref_type="tag", - other_ref=tag2, - bundle=False - )) - response.mustcontain('%s@%s -> %s@%s' % (GIT_REPO, tag1, GIT_REPO, tag2)) - - ## outgoing changesets between tags - response.mustcontain('''r113:794bbdd31545''' % GIT_REPO) - response.mustcontain('''r115:e36d8c502532''' % GIT_REPO) - response.mustcontain('''r116:5c9ff4f6d750''' % GIT_REPO) - response.mustcontain('''r117:b7187fa2b8c1''' % GIT_REPO) - response.mustcontain('''r118:5f3b74262014''' % GIT_REPO) - response.mustcontain('''r119:17438a11f72b''' % GIT_REPO) - response.mustcontain('''r120:5a3a8fb00555''' % GIT_REPO) - - #files - response.mustcontain('''docs/api/utils/index.rst''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''test_and_report.sh''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''.hgignore''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''.hgtags''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''docs/api/index.rst''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''vcs/__init__.py''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''vcs/backends/hg.py''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''vcs/utils/__init__.py''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''vcs/utils/annotate.py''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''vcs/utils/diffs.py''' % (GIT_REPO, tag1, tag2)) - response.mustcontain('''vcs/utils/lazy.py''' % (GIT_REPO, tag1, tag2)) - - def test_index_branch_hg(self): - self.log_user() - response = self.app.get(url(controller='compare', action='index', - repo_name=HG_REPO, - org_ref_type="branch", - org_ref='default', - other_ref_type="branch", - other_ref='default', - )) - - response.mustcontain('%s@default -> %s@default' % (HG_REPO, HG_REPO)) - # branch are equal - response.mustcontain('No files') - response.mustcontain('No changesets') - - def test_index_branch_git(self): - self.log_user() - response = self.app.get(url(controller='compare', action='index', - repo_name=GIT_REPO, - org_ref_type="branch", - org_ref='master', - other_ref_type="branch", - other_ref='master', - )) - - response.mustcontain('%s@master -> %s@master' % (GIT_REPO, GIT_REPO)) - # branch are equal - response.mustcontain('No files') - response.mustcontain('No changesets') - - def test_compare_revisions(self): - self.log_user() - rev1 = 'b986218ba1c9' - rev2 = '3d8f361e72ab' - - response = self.app.get(url(controller='compare', action='index', - repo_name=HG_REPO, - org_ref_type="rev", - org_ref=rev1, - other_ref_type="rev", - other_ref=rev2, - )) - response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, rev1, HG_REPO, rev2)) - ## outgoing changesets between those revisions - response.mustcontain("""r1:%s""" % (HG_REPO, rev2)) - ## files - response.mustcontain(""".hgignore""" % (HG_REPO, rev1, rev2)) - - def test_compare_remote_repos(self): + def test_compare_forks_on_branch_extra_commits_hg(self): self.log_user() - form_data = dict( - repo_name=HG_FORK, - repo_name_full=HG_FORK, - repo_group=None, - repo_type='hg', - description='', - private=False, - copy_permissions=False, - landing_rev='tip', - update_after_clone=False, - fork_parent_id=Repository.get_by_repo_name(HG_REPO), - ) - RepoModel().create_fork(form_data, cur_user=TEST_USER_ADMIN_LOGIN) + repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg', + description='diff-test', + owner=TEST_USER_ADMIN_LOGIN) + r1_id = repo1.repo_id + Session().commit() + #commit something ! + cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n', + message='commit1', vcs_type='hg', parent=None, newfile=True) + + #fork this repo + repo2 = _fork_repo('one-fork', 'hg', parent='one') + Session().commit() + r2_id = repo2.repo_id - Session().commit() + #add two extra commit into fork + cs1 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\n', + message='commit2', vcs_type='hg', parent=cs0) - rev1 = '56349e29c2af' - rev2 = '7d4bc8ec6be5' + cs2 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\nline3\n', + message='commit3', vcs_type='hg', parent=cs1) + rev1 = 'default' + rev2 = 'default' response = self.app.get(url(controller='compare', action='index', - repo_name=HG_REPO, - org_ref_type="rev", + repo_name=repo2.repo_name, + org_ref_type="branch", org_ref=rev1, - other_ref_type="rev", + other_ref_type="branch", other_ref=rev2, - repo=HG_FORK, + repo=repo1.repo_name )) try: - response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, rev1, HG_FORK, rev2)) - ## outgoing changesets between those revisions + response.mustcontain('%s@%s -> %s@%s' % (repo2.repo_name, rev1, repo1.repo_name, rev2)) + response.mustcontain("""Showing 2 commits""") + response.mustcontain("""1 file changed with 2 insertions and 0 deletions""") - response.mustcontain("""r4:2dda4e345fac""" % (HG_REPO)) - response.mustcontain("""r5:6fff84722075""" % (HG_REPO)) - response.mustcontain("""r6:%s""" % (HG_REPO, rev2)) + response.mustcontain("""
    commit2
    """) + response.mustcontain("""
    commit3
    """) + response.mustcontain("""r1:%s""" % (repo2.repo_name, cs1.raw_id, cs1.short_id)) + response.mustcontain("""r2:%s""" % (repo2.repo_name, cs2.raw_id, cs2.short_id)) ## files - response.mustcontain("""vcs/backends/hg.py""" % (HG_REPO, rev1, rev2)) - response.mustcontain("""vcs/backends/__init__.py""" % (HG_REPO, rev1, rev2)) - response.mustcontain("""vcs/backends/base.py""" % (HG_REPO, rev1, rev2)) + response.mustcontain("""file1""" % (repo2.repo_name, rev1, rev2)) + finally: - RepoModel().delete(HG_FORK) + RepoModel().delete(r1_id) + RepoModel().delete(r2_id) - def test_compare_remote_repos_remote_flag_off(self): + def test_compare_forks_on_branch_extra_commits_origin_has_incomming_hg(self): self.log_user() - form_data = dict( - repo_name=HG_FORK, - repo_name_full=HG_FORK, - repo_group=None, - repo_type='hg', - description='', - private=False, - copy_permissions=False, - landing_rev='tip', - update_after_clone=False, - fork_parent_id=Repository.get_by_repo_name(HG_REPO), - ) - RepoModel().create_fork(form_data, cur_user=TEST_USER_ADMIN_LOGIN) + repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg', + description='diff-test', + owner=TEST_USER_ADMIN_LOGIN) + r1_id = repo1.repo_id + Session().commit() + #commit something ! + cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n', + message='commit1', vcs_type='hg', parent=None, newfile=True) + #fork this repo + repo2 = _fork_repo('one-fork', 'hg', parent='one') Session().commit() - rev1 = '56349e29c2af' - rev2 = '7d4bc8ec6be5' + #now commit something to origin repo + cs1_prim = _commit_change(repo1.repo_name, filename='file2', content='line1file2\n', + message='commit2', vcs_type='hg', parent=cs0, newfile=True) + + r2_id = repo2.repo_id + #add two extra commit into fork + cs1 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\n', + message='commit2', vcs_type='hg', parent=cs0) + + cs2 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\nline3\n', + message='commit3', vcs_type='hg', parent=cs1) + + rev1 = 'default' + rev2 = 'default' response = self.app.get(url(controller='compare', action='index', - repo_name=HG_REPO, - org_ref_type="rev", + repo_name=repo2.repo_name, + org_ref_type="branch", org_ref=rev1, - other_ref_type="rev", + other_ref_type="branch", other_ref=rev2, - repo=HG_FORK, - bundle=False, + repo=repo1.repo_name )) try: - response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, rev1, HG_FORK, rev2)) - ## outgoing changesets between those revisions + response.mustcontain('%s@%s -> %s@%s' % (repo2.repo_name, rev1, repo1.repo_name, rev2)) + response.mustcontain("""Showing 2 commits""") + response.mustcontain("""1 file changed with 2 insertions and 0 deletions""") - response.mustcontain("""r4:2dda4e345fac""" % (HG_REPO)) - response.mustcontain("""r5:6fff84722075""" % (HG_REPO)) - response.mustcontain("""r6:%s""" % (HG_REPO, rev2)) + response.mustcontain("""
    commit2
    """) + response.mustcontain("""
    commit3
    """) + response.mustcontain("""r1:%s""" % (repo2.repo_name, cs1.raw_id, cs1.short_id)) + response.mustcontain("""r2:%s""" % (repo2.repo_name, cs2.raw_id, cs2.short_id)) ## files - response.mustcontain("""vcs/backends/hg.py""" % (HG_REPO, rev1, rev2)) - response.mustcontain("""vcs/backends/__init__.py""" % (HG_REPO, rev1, rev2)) - response.mustcontain("""vcs/backends/base.py""" % (HG_REPO, rev1, rev2)) + response.mustcontain("""file1""" % (repo2.repo_name, rev1, rev2)) + finally: - RepoModel().delete(HG_FORK) + RepoModel().delete(r1_id) + RepoModel().delete(r2_id) -# def test_compare_origin_ahead_of_fork(self): + +# def test_compare_remote_repos_remote_flag_off(self): # self.log_user() -# -# form_data = dict( -# repo_name=HG_FORK, -# repo_name_full=HG_FORK, -# repo_group=None, -# repo_type='hg', -# description='', -# private=False, -# copy_permissions=False, -# landing_rev='tip', -# update_after_clone=False, -# fork_parent_id=Repository.get_by_repo_name(HG_REPO), -# ) -# RepoModel().create_fork(form_data, cur_user=TEST_USER_ADMIN_LOGIN) -# -# Session().commit() -# -# repo1 = Repository.get_by_repo_name(HG_REPO) -# r1_name = HG_REPO -# -# #commit something ! -# cs0 = ScmModel().create_node( -# repo=repo1.scm_instance, repo_name=r1_name, -# cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, -# author=TEST_USER_ADMIN_LOGIN, -# message='extra commit1', -# content='line1', -# f_path='file1' -# ) -# +# _fork_repo(HG_FORK, 'hg') # # rev1 = '56349e29c2af' # rev2 = '7d4bc8ec6be5' @@ -266,7 +190,7 @@ # )) # # try: -# response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, rev1, HG_REPO, rev2)) +# response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, rev1, HG_FORK, rev2)) # ## outgoing changesets between those revisions # # response.mustcontain("""r4:2dda4e345fac""" % (HG_REPO)) @@ -280,284 +204,143 @@ # finally: # RepoModel().delete(HG_FORK) - def test_compare_extra_commits(self): - self.log_user() - repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg', - description='diff-test', - owner=TEST_USER_ADMIN_LOGIN) - - repo2 = RepoModel().create_repo(repo_name='one-fork', repo_type='hg', - description='diff-test', - owner=TEST_USER_ADMIN_LOGIN) - - Session().commit() - r1_id = repo1.repo_id - r1_name = repo1.repo_name - r2_id = repo2.repo_id - r2_name = repo2.repo_name - - #commit something ! - cs0 = ScmModel().create_node( - repo=repo1.scm_instance, repo_name=r1_name, - cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit1', - content='line1', - f_path='file1' - ) - - cs0_prim = ScmModel().create_node( - repo=repo2.scm_instance, repo_name=r2_name, - cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit1', - content='line1', - f_path='file1' - ) - - cs1 = ScmModel().commit_change( - repo=repo2.scm_instance, repo_name=r2_name, - cs=cs0_prim, user=TEST_USER_ADMIN_LOGIN, author=TEST_USER_ADMIN_LOGIN, - message='commit2', - content='line1\nline2', - f_path='file1' - ) - - rev1 = 'default' - rev2 = 'default' - response = self.app.get(url(controller='compare', action='index', - repo_name=r2_name, - org_ref_type="branch", - org_ref=rev1, - other_ref_type="branch", - other_ref=rev2, - repo=r1_name - )) - - try: - response.mustcontain('%s@%s -> %s@%s' % (r2_name, rev1, r1_name, rev2)) - - response.mustcontain("""
    commit2
    """) - response.mustcontain("""r1:%s""" % (r2_name, cs1.raw_id, cs1.short_id)) - ## files - response.mustcontain("""file1""" % (r2_name, rev1, rev2)) - - finally: - RepoModel().delete(r1_id) - RepoModel().delete(r2_id) - - def test_org_repo_new_commits_after_forking(self): - self.log_user() - - repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg', - description='diff-test', - owner=TEST_USER_ADMIN_LOGIN) - - Session().commit() - r1_id = repo1.repo_id - r1_name = repo1.repo_name - - #commit something initially ! - cs0 = ScmModel().create_node( - repo=repo1.scm_instance, repo_name=r1_name, - cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit1', - content='line1', - f_path='file1' - ) - Session().commit() - self.assertEqual(repo1.scm_instance.revisions, [cs0.raw_id]) - #fork the repo1 - repo2 = RepoModel().create_repo(repo_name='one-fork', repo_type='hg', - description='compare-test', - clone_uri=repo1.repo_full_path, - owner=TEST_USER_ADMIN_LOGIN, fork_of='one') - Session().commit() - self.assertEqual(repo2.scm_instance.revisions, [cs0.raw_id]) - r2_id = repo2.repo_id - r2_name = repo2.repo_name - - #make 3 new commits in fork - cs1 = ScmModel().create_node( - repo=repo2.scm_instance, repo_name=r2_name, - cs=repo2.scm_instance[-1], user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit1-fork', - content='file1-line1-from-fork', - f_path='file1-fork' - ) - cs2 = ScmModel().create_node( - repo=repo2.scm_instance, repo_name=r2_name, - cs=cs1, user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit2-fork', - content='file2-line1-from-fork', - f_path='file2-fork' - ) - cs3 = ScmModel().create_node( - repo=repo2.scm_instance, repo_name=r2_name, - cs=cs2, user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit3-fork', - content='file3-line1-from-fork', - f_path='file3-fork' - ) - - #compare ! - rev1 = 'default' - rev2 = 'default' - response = self.app.get(url(controller='compare', action='index', - repo_name=r2_name, - org_ref_type="branch", - org_ref=rev1, - other_ref_type="branch", - other_ref=rev2, - repo=r1_name, - bundle=True, - )) - try: - response.mustcontain('%s@%s -> %s@%s' % (r2_name, rev1, r1_name, rev2)) - response.mustcontain("""file1-line1-from-fork""") - response.mustcontain("""file2-line1-from-fork""") - response.mustcontain("""file3-line1-from-fork""") - - #add new commit into parent ! - cs0 = ScmModel().create_node( - repo=repo1.scm_instance, repo_name=r1_name, - cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit2', - content='line1-from-new-parent', - f_path='file2' - ) - #compare ! - rev1 = 'default' - rev2 = 'default' - response = self.app.get(url(controller='compare', action='index', - repo_name=r2_name, - org_ref_type="branch", - org_ref=rev1, - other_ref_type="branch", - other_ref=rev2, - repo=r1_name, - bundle=True, - )) - - response.mustcontain('%s@%s -> %s@%s' % (r2_name, rev1, r1_name, rev2)) - response.mustcontain("""file2""") # new commit from parent - response.mustcontain("""line1-from-new-parent""") - response.mustcontain("""file1-line1-from-fork""") - response.mustcontain("""file2-line1-from-fork""") - response.mustcontain("""file3-line1-from-fork""") - finally: - RepoModel().delete(r2_id) - RepoModel().delete(r1_id) - - def test_org_repo_new_commits_after_forking_simple_diff(self): - self.log_user() - - repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg', - description='diff-test', - owner=TEST_USER_ADMIN_LOGIN) - - Session().commit() - r1_id = repo1.repo_id - r1_name = repo1.repo_name - - #commit something initially ! - cs0 = ScmModel().create_node( - repo=repo1.scm_instance, repo_name=r1_name, - cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit1', - content='line1', - f_path='file1' - ) - Session().commit() - self.assertEqual(repo1.scm_instance.revisions, [cs0.raw_id]) - #fork the repo1 - repo2 = RepoModel().create_repo(repo_name='one-fork', repo_type='hg', - description='compare-test', - clone_uri=repo1.repo_full_path, - owner=TEST_USER_ADMIN_LOGIN, fork_of='one') - Session().commit() - self.assertEqual(repo2.scm_instance.revisions, [cs0.raw_id]) - r2_id = repo2.repo_id - r2_name = repo2.repo_name - - #make 3 new commits in fork - cs1 = ScmModel().create_node( - repo=repo2.scm_instance, repo_name=r2_name, - cs=repo2.scm_instance[-1], user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit1-fork', - content='file1-line1-from-fork', - f_path='file1-fork' - ) - cs2 = ScmModel().create_node( - repo=repo2.scm_instance, repo_name=r2_name, - cs=cs1, user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit2-fork', - content='file2-line1-from-fork', - f_path='file2-fork' - ) - cs3 = ScmModel().create_node( - repo=repo2.scm_instance, repo_name=r2_name, - cs=cs2, user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit3-fork', - content='file3-line1-from-fork', - f_path='file3-fork' - ) - - #compare ! - rev1 = 'default' - rev2 = 'default' - response = self.app.get(url(controller='compare', action='index', - repo_name=r2_name, - org_ref_type="branch", - org_ref=rev1, - other_ref_type="branch", - other_ref=rev2, - repo=r1_name, - bundle=False, - )) - - try: - #response.mustcontain('%s@%s -> %s@%s' % (r2_name, rev1, r1_name, rev2)) - - #add new commit into parent ! - cs0 = ScmModel().create_node( - repo=repo1.scm_instance, repo_name=r1_name, - cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, - author=TEST_USER_ADMIN_LOGIN, - message='commit2', - content='line1', - f_path='file2' - ) - #compare ! - rev1 = 'default' - rev2 = 'default' - response = self.app.get(url(controller='compare', action='index', - repo_name=r2_name, - org_ref_type="branch", - org_ref=rev1, - other_ref_type="branch", - other_ref=rev2, - repo=r1_name, - bundle=False - )) - - response.mustcontain('%s@%s -> %s@%s' % (r2_name, rev1, r1_name, rev2)) - response.mustcontain("""file1-line1-from-fork""") - response.mustcontain("""file2-line1-from-fork""") - response.mustcontain("""file3-line1-from-fork""") - self.assertFalse("""file2""" in response.body) # new commit from parent - self.assertFalse("""line1-from-new-parent""" in response.body) - finally: - RepoModel().delete(r2_id) - RepoModel().delete(r1_id) +# +# def test_compare_remote_branches_hg(self): +# self.log_user() +# +# _fork_repo(HG_FORK, 'hg') +# +# rev1 = '56349e29c2af' +# rev2 = '7d4bc8ec6be5' +# +# response = self.app.get(url(controller='compare', action='index', +# repo_name=HG_REPO, +# org_ref_type="rev", +# org_ref=rev1, +# other_ref_type="rev", +# other_ref=rev2, +# repo=HG_FORK, +# )) +# +# try: +# response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, rev1, HG_FORK, rev2)) +# ## outgoing changesets between those revisions +# +# response.mustcontain("""r4:2dda4e345fac""" % (HG_REPO)) +# response.mustcontain("""r5:6fff84722075""" % (HG_REPO)) +# response.mustcontain("""r6:%s""" % (HG_REPO, rev2)) +# +# ## files +# response.mustcontain("""vcs/backends/hg.py""" % (HG_REPO, rev1, rev2)) +# response.mustcontain("""vcs/backends/__init__.py""" % (HG_REPO, rev1, rev2)) +# response.mustcontain("""vcs/backends/base.py""" % (HG_REPO, rev1, rev2)) +# finally: +# RepoModel().delete(HG_FORK) +# +# def test_org_repo_new_commits_after_forking_simple_diff(self): +# self.log_user() +# +# repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg', +# description='diff-test', +# owner=TEST_USER_ADMIN_LOGIN) +# +# Session().commit() +# r1_id = repo1.repo_id +# r1_name = repo1.repo_name +# +# #commit something initially ! +# cs0 = ScmModel().create_node( +# repo=repo1.scm_instance, repo_name=r1_name, +# cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, +# author=TEST_USER_ADMIN_LOGIN, +# message='commit1', +# content='line1', +# f_path='file1' +# ) +# Session().commit() +# self.assertEqual(repo1.scm_instance.revisions, [cs0.raw_id]) +# #fork the repo1 +# repo2 = RepoModel().create_repo(repo_name='one-fork', repo_type='hg', +# description='compare-test', +# clone_uri=repo1.repo_full_path, +# owner=TEST_USER_ADMIN_LOGIN, fork_of='one') +# Session().commit() +# self.assertEqual(repo2.scm_instance.revisions, [cs0.raw_id]) +# r2_id = repo2.repo_id +# r2_name = repo2.repo_name +# +# #make 3 new commits in fork +# cs1 = ScmModel().create_node( +# repo=repo2.scm_instance, repo_name=r2_name, +# cs=repo2.scm_instance[-1], user=TEST_USER_ADMIN_LOGIN, +# author=TEST_USER_ADMIN_LOGIN, +# message='commit1-fork', +# content='file1-line1-from-fork', +# f_path='file1-fork' +# ) +# cs2 = ScmModel().create_node( +# repo=repo2.scm_instance, repo_name=r2_name, +# cs=cs1, user=TEST_USER_ADMIN_LOGIN, +# author=TEST_USER_ADMIN_LOGIN, +# message='commit2-fork', +# content='file2-line1-from-fork', +# f_path='file2-fork' +# ) +# cs3 = ScmModel().create_node( +# repo=repo2.scm_instance, repo_name=r2_name, +# cs=cs2, user=TEST_USER_ADMIN_LOGIN, +# author=TEST_USER_ADMIN_LOGIN, +# message='commit3-fork', +# content='file3-line1-from-fork', +# f_path='file3-fork' +# ) +# +# #compare ! +# rev1 = 'default' +# rev2 = 'default' +# response = self.app.get(url(controller='compare', action='index', +# repo_name=r2_name, +# org_ref_type="branch", +# org_ref=rev1, +# other_ref_type="branch", +# other_ref=rev2, +# repo=r1_name, +# bundle=False, +# )) +# +# try: +# #response.mustcontain('%s@%s -> %s@%s' % (r2_name, rev1, r1_name, rev2)) +# +# #add new commit into parent ! +# cs0 = ScmModel().create_node( +# repo=repo1.scm_instance, repo_name=r1_name, +# cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN, +# author=TEST_USER_ADMIN_LOGIN, +# message='commit2', +# content='line1', +# f_path='file2' +# ) +# #compare ! +# rev1 = 'default' +# rev2 = 'default' +# response = self.app.get(url(controller='compare', action='index', +# repo_name=r2_name, +# org_ref_type="branch", +# org_ref=rev1, +# other_ref_type="branch", +# other_ref=rev2, +# repo=r1_name, +# bundle=False +# )) +# +# response.mustcontain('%s@%s -> %s@%s' % (r2_name, rev1, r1_name, rev2)) +# response.mustcontain("""file1-line1-from-fork""") +# response.mustcontain("""file2-line1-from-fork""") +# response.mustcontain("""file3-line1-from-fork""") +# self.assertFalse("""file2""" in response.body) # new commit from parent +# self.assertFalse("""line1-from-new-parent""" in response.body) +# finally: +# RepoModel().delete(r2_id) +# RepoModel().delete(r1_id) diff -r 0ed42ca7ff9e -r c2a206162062 rhodecode/tests/functional/test_compare_local.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rhodecode/tests/functional/test_compare_local.py Sat Nov 24 00:29:38 2012 +0100 @@ -0,0 +1,153 @@ +from rhodecode.tests import * +from rhodecode.model.repo import RepoModel +from rhodecode.model.meta import Session +from rhodecode.model.db import Repository +from rhodecode.model.scm import ScmModel +from rhodecode.lib.vcs.backends.base import EmptyChangeset + + +class TestCompareController(TestController): + + def test_compare_tag_hg(self): + self.log_user() + tag1 = '0.1.2' + tag2 = '0.1.3' + response = self.app.get(url(controller='compare', action='index', + repo_name=HG_REPO, + org_ref_type="tag", + org_ref=tag1, + other_ref_type="tag", + other_ref=tag2, + )) + response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, tag1, HG_REPO, tag2)) + ## outgoing changesets between tags + response.mustcontain('''r112:c5ddebc06eaa''' % HG_REPO) + response.mustcontain('''r115:70d4cef8a376''' % HG_REPO) + response.mustcontain('''r116:9749bfbfc0d2''' % HG_REPO) + response.mustcontain('''r117:41fda979f02f''' % HG_REPO) + response.mustcontain('''r118:bb1a3ab98cc4''' % HG_REPO) + response.mustcontain('''r119:36e0fc9d2808''' % HG_REPO) + response.mustcontain('''r120:17544fbfcd33''' % HG_REPO) + + response.mustcontain('11 files changed with 94 insertions and 64 deletions') + + ## files diff + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + response.mustcontain('''''' % (HG_REPO, tag1, tag2)) + + def test_compare_tag_git(self): + self.log_user() + tag1 = 'v0.1.2' + tag2 = 'v0.1.3' + response = self.app.get(url(controller='compare', action='index', + repo_name=GIT_REPO, + org_ref_type="tag", + org_ref=tag1, + other_ref_type="tag", + other_ref=tag2, + bundle=False + )) + response.mustcontain('%s@%s -> %s@%s' % (GIT_REPO, tag1, GIT_REPO, tag2)) + + ## outgoing changesets between tags + response.mustcontain('''r113:794bbdd31545''' % GIT_REPO) + response.mustcontain('''r115:e36d8c502532''' % GIT_REPO) + response.mustcontain('''r116:5c9ff4f6d750''' % GIT_REPO) + response.mustcontain('''r117:b7187fa2b8c1''' % GIT_REPO) + response.mustcontain('''r118:5f3b74262014''' % GIT_REPO) + response.mustcontain('''r119:17438a11f72b''' % GIT_REPO) + response.mustcontain('''r120:5a3a8fb00555''' % GIT_REPO) + + response.mustcontain('11 files changed with 94 insertions and 64 deletions') + + #files + response.mustcontain('''docs/api/utils/index.rst''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''test_and_report.sh''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''.hgignore''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''.hgtags''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''docs/api/index.rst''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''vcs/__init__.py''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''vcs/backends/hg.py''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''vcs/utils/__init__.py''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''vcs/utils/annotate.py''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''vcs/utils/diffs.py''' % (GIT_REPO, tag1, tag2)) + response.mustcontain('''vcs/utils/lazy.py''' % (GIT_REPO, tag1, tag2)) + + def test_index_branch_hg(self): + self.log_user() + response = self.app.get(url(controller='compare', action='index', + repo_name=HG_REPO, + org_ref_type="branch", + org_ref='default', + other_ref_type="branch", + other_ref='default', + )) + + response.mustcontain('%s@default -> %s@default' % (HG_REPO, HG_REPO)) + # branch are equal + response.mustcontain('No files') + response.mustcontain('No changesets') + + def test_index_branch_git(self): + self.log_user() + response = self.app.get(url(controller='compare', action='index', + repo_name=GIT_REPO, + org_ref_type="branch", + org_ref='master', + other_ref_type="branch", + other_ref='master', + )) + + response.mustcontain('%s@master -> %s@master' % (GIT_REPO, GIT_REPO)) + # branch are equal + response.mustcontain('No files') + response.mustcontain('No changesets') + + def test_compare_revisions_hg(self): + self.log_user() + rev1 = 'b986218ba1c9' + rev2 = '3d8f361e72ab' + + response = self.app.get(url(controller='compare', action='index', + repo_name=HG_REPO, + org_ref_type="rev", + org_ref=rev1, + other_ref_type="rev", + other_ref=rev2, + )) + response.mustcontain('%s@%s -> %s@%s' % (HG_REPO, rev1, HG_REPO, rev2)) + ## outgoing changesets between those revisions + response.mustcontain("""r1:%s""" % (HG_REPO, rev2)) + + response.mustcontain('1 file changed with 7 insertions and 0 deletions') + ## files + response.mustcontain(""".hgignore""" % (HG_REPO, rev1, rev2)) + + def test_compare_revisions_git(self): + self.log_user() + rev1 = 'c1214f7e79e02fc37156ff215cd71275450cffc3' + rev2 = '38b5fe81f109cb111f549bfe9bb6b267e10bc557' + + response = self.app.get(url(controller='compare', action='index', + repo_name=GIT_REPO, + org_ref_type="rev", + org_ref=rev1, + other_ref_type="rev", + other_ref=rev2, + )) + response.mustcontain('%s@%s -> %s@%s' % (GIT_REPO, rev1, GIT_REPO, rev2)) + ## outgoing changesets between those revisions + response.mustcontain("""r1:%s""" % (GIT_REPO, rev2[:12])) + response.mustcontain('1 file changed with 7 insertions and 0 deletions') + + ## files + response.mustcontain(""".hgignore""" % (GIT_REPO, rev1, rev2))