changeset 4784:d42d7b2a3b2f

pullrequests: reintroduce 'update' functionality as separate submit button in the big form
author Mads Kiilerich <madski@unity3d.com>
date Wed, 21 Jan 2015 17:35:11 +0100
parents 2145dfdc3af3
children 6262ca7ed934
files kallithea/controllers/pullrequests.py kallithea/model/forms.py kallithea/public/css/style.css kallithea/templates/pullrequests/pullrequest_show.html
diffstat 4 files changed, 45 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/controllers/pullrequests.py	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/controllers/pullrequests.py	Wed Jan 21 17:35:11 2015 +0100
@@ -365,24 +365,10 @@
 
         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 @@
 
         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 @@
         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 @@
                                                    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 @@
             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()
--- a/kallithea/model/forms.py	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/model/forms.py	Wed Jan 21 17:35:11 2015 +0100
@@ -505,6 +505,7 @@
         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
 
--- a/kallithea/public/css/style.css	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/public/css/style.css	Wed Jan 21 17:35:11 2015 +0100
@@ -3490,6 +3490,7 @@
     cursor: default !important;
 }
 
+input[disabled].btn,
 .btn.disabled {
     color: #999;
 }
--- a/kallithea/templates/pullrequests/pullrequest_show.html	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/templates/pullrequests/pullrequest_show.html	Wed Jan 21 17:35:11 2015 +0100
@@ -173,13 +173,26 @@
             <div class="input">
               <div class="msg-div">${c.update_msg}</div>
               %if c.available:
-              <div style="max-height:200px; overflow-y:auto; overflow-x:hidden; margin-bottom: 10px">
+              <div id="updaterevs" style="max-height:200px; overflow-y:auto; overflow-x:hidden; margin-bottom: 10px">
                 <table class="noborder">
                   %for cnt, cs in enumerate(c.available):
                     <tr>
-                    <td>${h.radio(name='updaterev', value=cs.raw_id)}</td>
-                    <td>${h.link_to(h.show_id(cs),h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id))}</td>
-                    <td><div class="message" style="white-space:normal; height:1.1em; max-width: 500px; padding:0">${h.urlify_commit(cs.message, c.repo_name)}</div></td>
+                      %if cs.revision == c.cs_ranges[-1].revision:
+                        <td>
+                          %if editable:
+                            ${h.radio(name='updaterev', value='')}
+                          %endif
+                        </td>
+                        <td colspan="2">${_("Current revision - no change")}</td>
+                      %else:
+                        <td>
+                          %if editable:
+                            ${h.radio(name='updaterev', value=cs.raw_id)}
+                          %endif
+                        </td>
+                        <td>${h.link_to(h.show_id(cs),h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id))}</td>
+                        <td><div class="message" style="white-space:normal; height:1.1em; max-width: 500px; padding:0">${h.urlify_commit(cs.message, c.repo_name)}</div></td>
+                      %endif
                     </tr>
                   %endfor
                 </table>
@@ -187,11 +200,6 @@
               %endif
               <div class="msg-div">${c.update_msg_other}</div>
             </div>
-            %if editable and c.available:
-              <div class="buttons">
-                ${h.submit('copy_update',_('Create Pull Request Update'),class_="btn btn-small")}
-              </div>
-            %endif
         </div>
       </div>
     </div>
@@ -235,8 +243,9 @@
       <div class="fields">
         %if editable:
           <div class="buttons">
-            ${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")}
           </div>
         %endif
       </div>
@@ -344,10 +353,17 @@
 
           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);
           });