diff --git a/rhodecode/controllers/pullrequests.py b/rhodecode/controllers/pullrequests.py --- a/rhodecode/controllers/pullrequests.py +++ b/rhodecode/controllers/pullrequests.py @@ -52,6 +52,7 @@ from rhodecode.model.repo import RepoMod from rhodecode.model.comment import ChangesetCommentsModel from rhodecode.model.changeset_status import ChangesetStatusModel from rhodecode.model.forms import PullRequestForm +from mercurial import scmutil log = logging.getLogger(__name__) @@ -67,7 +68,7 @@ class PullrequestsController(BaseRepoCon c.users_array = repo_model.get_users_js() c.users_groups_array = repo_model.get_users_groups_js() - def _get_repo_refs(self, repo, rev=None): + def _get_repo_refs(self, repo, rev=None, branch_rev=None): """return a structure with repo's interesting changesets, suitable for the selectors in pullrequest.html""" branches = [('branch:%s:%s' % (k, v), k) @@ -83,11 +84,25 @@ class PullrequestsController(BaseRepoCon tips = [x[1] for x in branches + bookmarks + tags if x[0].endswith(colontip)] selected = 'tag:tip:%s' % tip - special = [(selected, 'tip (%s)' % ', '.join(tips))] + special = [(selected, 'tip: %s' % ', '.join(tips))] if rev: selected = 'rev:%s:%s' % (rev, rev) - special.append((selected, rev)) + special.append((selected, '%s: %s' % (_("Selected"), rev[:12]))) + + # list named branches that has been merged to this named branch - it should probably merge back + if branch_rev: + # not restricting to merge() would also get branch point and be better + # (especially because it would get the branch point) ... but is currently too expensive + revs = ["sort(parents(branch(id('%s')) and merge()) - branch(id('%s')))" % + (branch_rev, branch_rev)] + otherbranches = {} + for i in scmutil.revrange(repo._repo, revs): + cs = repo.get_changeset(i) + otherbranches[cs.branch] = cs.raw_id + for branch, node in otherbranches.iteritems(): + selected = 'branch:%s:%s' % (branch, node) + special.append((selected, '%s: %s' % (_('Peer'), branch))) return [(special, _("Special")), (bookmarks, _("Bookmarks")), @@ -121,18 +136,23 @@ class PullrequestsController(BaseRepoCon category='warning') redirect(url('summary_home', repo_name=org_repo.repo_name)) + org_rev = request.GET.get('rev_end') + # rev_start is not directly useful - its parent could however be used + # as default for other and thus give a simple compare view + #other_rev = request.POST.get('rev_start') + other_repos_info = {} c.org_repos = [] c.org_repos.append((org_repo.repo_name, org_repo.repo_name)) c.default_org_repo = org_repo.repo_name - c.org_refs, c.default_org_ref = self._get_repo_refs(org_repo.scm_instance) + c.org_refs, c.default_org_ref = self._get_repo_refs(org_repo.scm_instance, org_rev) c.other_repos = [] # add org repo to other so we can open pull request against itself c.other_repos.extend(c.org_repos) c.default_other_repo = org_repo.repo_name - c.default_other_refs, c.default_other_ref = self._get_repo_refs(org_repo.scm_instance) + c.default_other_refs, c.default_other_ref = self._get_repo_refs(org_repo.scm_instance, branch_rev=org_rev) usr_data = lambda usr: dict(user_id=usr.user_id, username=usr.username, firstname=usr.firstname, @@ -191,23 +211,12 @@ class PullrequestsController(BaseRepoCon return redirect(url('pullrequest_home', repo_name=repo_name)) org_repo = _form['org_repo'] - org_ref = _form['org_ref'] + org_ref = 'rev:merge:%s' % _form['merge_rev'] other_repo = _form['other_repo'] - other_ref = _form['other_ref'] + other_ref = 'rev:ancestor:%s' % _form['ancestor_rev'] 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'] @@ -265,9 +274,6 @@ class PullrequestsController(BaseRepoCon :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, @@ -279,7 +285,7 @@ class PullrequestsController(BaseRepoCon other_ref_rev) = pull_request.other_ref.split(':') # despite opening revisions for bookmarks/branches/tags, we always - # convert this to rev to prevent changes after book or branch change + # convert this to rev to prevent changes after bookmark or branch change org_ref = ('rev', org_ref_rev) other_ref = ('rev', other_ref_rev) @@ -290,10 +296,6 @@ class PullrequestsController(BaseRepoCon 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.org_ref = org_ref[1] @@ -394,6 +396,7 @@ class PullrequestsController(BaseRepoCon c.changeset_statuses = ChangesetStatus.STATUSES c.as_form = False + c.ancestor = None # there is one - but right here we don't know which return render('/pullrequests/pullrequest_show.html') @NotAnonymous()