diff --git a/kallithea/controllers/pullrequests.py b/kallithea/controllers/pullrequests.py --- a/kallithea/controllers/pullrequests.py +++ b/kallithea/controllers/pullrequests.py @@ -365,24 +365,10 @@ class PullrequestsController(BaseRepoCon return redirect(pull_request.url()) - @LoginRequired() - @NotAnonymous() - @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', - 'repository.admin') - def copy_update(self, repo_name, pull_request_id): - old_pull_request = PullRequest.get_or_404(pull_request_id) - assert old_pull_request.other_repo.repo_name == repo_name - if old_pull_request.is_closed(): - raise HTTPForbidden() - + def create_update(self, old_pull_request, updaterev, title, description, reviewers_ids): org_repo = RepoModel()._get_repo(old_pull_request.org_repo.repo_name) org_ref_type, org_ref_name, org_rev = old_pull_request.org_ref.split(':') - updaterev = request.POST.get('updaterev') - if updaterev: - new_org_rev = self._get_ref_rev(org_repo, 'rev', updaterev) - else: - # assert org_ref_type == 'branch', org_ref_type # TODO: what if not? - new_org_rev = self._get_ref_rev(org_repo, org_ref_type, org_ref_name) + new_org_rev = self._get_ref_rev(org_repo, 'rev', updaterev) other_repo = RepoModel()._get_repo(old_pull_request.other_repo.repo_name) other_ref_type, other_ref_name, other_rev = old_pull_request.other_ref.split(':') # other_rev is ancestor @@ -400,7 +386,7 @@ class PullrequestsController(BaseRepoCon infos = ['This is an update of %s "%s".' % (h.canonical_url('pullrequest_show', repo_name=old_pull_request.other_repo.repo_name, - pull_request_id=pull_request_id), + pull_request_id=old_pull_request.pull_request_id), old_pull_request.title)] if lost: @@ -435,18 +421,15 @@ class PullrequestsController(BaseRepoCon new_other_ref = '%s:%s:%s' % (other_ref_type, other_ref_name, ancestor_rev) new_org_ref = '%s:%s:%s' % (org_ref_type, org_ref_name, new_org_rev) - reviewers_ids = [r.user_id for r in old_pull_request.reviewers] - try: - old_title, old_v = re.match(r'(.*)\(v(\d+)\)\s*$', old_pull_request.title).groups() + title, old_v = re.match(r'(.*)\(v(\d+)\)\s*$', title).groups() v = int(old_v) + 1 except (AttributeError, ValueError): - old_title = old_pull_request.title v = 2 - title = '%s (v%s)' % (old_title.strip(), v) + title = '%s (v%s)' % (title.strip(), v) # using a mail-like separator, insert new update info at the top of the list - descriptions = old_pull_request.description.replace('\r\n', '\n').split('\n-- \n', 1) + descriptions = description.replace('\r\n', '\n').split('\n-- \n', 1) description = descriptions[0].strip() + '\n\n-- \n' + '\n'.join(infos) if len(descriptions) > 1: description += '\n\n' + descriptions[1].strip() @@ -470,9 +453,9 @@ class PullrequestsController(BaseRepoCon pull_request_id=pull_request.pull_request_id), repo=old_pull_request.other_repo.repo_id, user=c.authuser.user_id, - pull_request=pull_request_id, + pull_request=old_pull_request.pull_request_id, closing_pr=True) - PullRequestModel().close_pull_request(pull_request_id) + PullRequestModel().close_pull_request(old_pull_request.pull_request_id) Session().commit() h.flash(_('Pull request update created'), @@ -496,13 +479,20 @@ class PullrequestsController(BaseRepoCon raise HTTPForbidden() _form = PullRequestPostForm()().to_python(request.POST) + reviewers_ids = [int(s) for s in _form['review_members']] + + if _form['updaterev']: + return self.create_update(pull_request, + _form['updaterev'], + _form['pullrequest_title'], + _form['pullrequest_desc'], + reviewers_ids) old_description = pull_request.description pull_request.title = _form['pullrequest_title'] pull_request.description = _form['pullrequest_desc'].strip() or _('No description') PullRequestModel().mention_from_description(pull_request, old_description) - reviewers_ids = [int(s) for s in _form['review_members']] PullRequestModel().update_reviewers(pull_request_id, reviewers_ids) Session().commit() diff --git a/kallithea/model/forms.py b/kallithea/model/forms.py --- a/kallithea/model/forms.py +++ b/kallithea/model/forms.py @@ -505,6 +505,7 @@ def PullRequestPostForm(): pullrequest_title = v.UnicodeString(strip=True, required=True) pullrequest_desc = v.UnicodeString(strip=True, required=False) review_members = v.Set() + updaterev = v.UnicodeString(strip=True, required=False, if_missing=None) return _PullRequestPostForm diff --git a/kallithea/public/css/style.css b/kallithea/public/css/style.css --- a/kallithea/public/css/style.css +++ b/kallithea/public/css/style.css @@ -3490,6 +3490,7 @@ input.btn { cursor: default !important; } +input[disabled].btn, .btn.disabled { color: #999; } diff --git a/kallithea/templates/pullrequests/pullrequest_show.html b/kallithea/templates/pullrequests/pullrequest_show.html --- a/kallithea/templates/pullrequests/pullrequest_show.html +++ b/kallithea/templates/pullrequests/pullrequest_show.html @@ -173,13 +173,26 @@ ${self.repo_context_bar('showpullrequest
${c.update_msg}
%if c.available: -
+
%for cnt, cs in enumerate(c.available): - - - + %if cs.revision == c.cs_ranges[-1].revision: + + + %else: + + + + %endif %endfor
${h.radio(name='updaterev', value=cs.raw_id)}${h.link_to(h.show_id(cs),h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id))}
${h.urlify_commit(cs.message, c.repo_name)}
+ %if editable: + ${h.radio(name='updaterev', value='')} + %endif + ${_("Current revision - no change")} + %if editable: + ${h.radio(name='updaterev', value=cs.raw_id)} + %endif + ${h.link_to(h.show_id(cs),h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id))}
${h.urlify_commit(cs.message, c.repo_name)}
@@ -187,11 +200,6 @@ ${self.repo_context_bar('showpullrequest %endif
${c.update_msg_other}
- %if editable and c.available: -
- ${h.submit('copy_update',_('Create Pull Request Update'),class_="btn btn-small")} -
- %endif
@@ -235,8 +243,9 @@ ${self.repo_context_bar('showpullrequest
%if editable:
- ${h.submit('pr-form-save',_('Save'),class_="btn btn-small")} - ${h.reset('pr-form-reset',_('Cancel'),class_="btn btn-small")} + ${h.submit('pr-form-save',_('Save Changes'),class_="btn btn-small")} + ${h.submit('pr-form-clone',_('Save as New Pull Request'),class_="btn btn-small",disabled='disabled')} + ${h.reset('pr-form-reset',_('Cancel Changes'),class_="btn btn-small")}
%endif
@@ -344,10 +353,17 @@ ${self.repo_context_bar('showpullrequest linkInlineComments(document.getElementsByClassName('firstlink'), document.getElementsByClassName("inline-comment")); + $('#updaterevs input').change(function(e){ + var update = !!e.target.value; + $('#pr-form-save').prop('disabled',update); + $('#pr-form-clone').prop('disabled',!update); + }); var $org_review_members = $('#review_members').clone(); $('#pr-form-reset').click(function(e){ $('#pr-edit-form').hide(); $('.pr-not-edit').show(); + $('#pr-form-save').prop('disabled',false); + $('#pr-form-clone').prop('disabled',true); $('#review_members').html($org_review_members); });