James Moger
2014-03-12 b8e1fa94f3f28a94b466c79b1a4b24c6fd755df1
src/main/java/com/gitblit/git/PatchsetReceivePack.java
@@ -60,6 +60,7 @@
import com.gitblit.models.TicketModel.PatchsetType;
import com.gitblit.models.TicketModel.Status;
import com.gitblit.models.UserModel;
import com.gitblit.tickets.BranchTicketService;
import com.gitblit.tickets.ITicketService;
import com.gitblit.tickets.TicketMilestone;
import com.gitblit.tickets.TicketNotifier;
@@ -105,7 +106,7 @@
   protected final TicketNotifier ticketNotifier;
   private boolean requireCleanMerge;
   private boolean requireMergeablePatchset;
   public PatchsetReceivePack(IGitblit gitblit, Repository db, RepositoryModel repository, UserModel user) {
      super(gitblit, db, repository, user);
@@ -257,12 +258,26 @@
   /** Execute commands to update references. */
   @Override
   protected void executeCommands() {
      // we process patchsets unless the user is pushing something special
      boolean processPatchsets = true;
      for (ReceiveCommand cmd : filterCommands(Result.NOT_ATTEMPTED)) {
         if (ticketService instanceof BranchTicketService
               && BranchTicketService.BRANCH.equals(cmd.getRefName())) {
            // the user is pushing an update to the BranchTicketService data
            processPatchsets = false;
         }
      }
      // workaround for JGit's awful scoping choices
      //
      // reset the patchset refs to NOT_ATTEMPTED (see validateCommands)
      for (ReceiveCommand cmd : filterCommands(Result.OK)) {
         if (isPatchsetRef(cmd.getRefName())) {
            cmd.setResult(Result.NOT_ATTEMPTED);
         } else if (ticketService instanceof BranchTicketService
               && BranchTicketService.BRANCH.equals(cmd.getRefName())) {
            // the user is pushing an update to the BranchTicketService data
            processPatchsets = false;
         }
      }
@@ -292,7 +307,7 @@
            continue;
         }
         if (isPatchsetRef(cmd.getRefName())) {
         if (isPatchsetRef(cmd.getRefName()) && processPatchsets) {
            if (ticketService == null) {
               sendRejection(cmd, "Sorry, the ticket service is unavailable and can not accept patchsets at this time.");
               continue;
@@ -393,6 +408,8 @@
            for (ReceiveCommand cmd : toApply) {
               if (cmd.getResult() == Result.NOT_ATTEMPTED) {
                  sendRejection(cmd, "lock error: {0}", err.getMessage());
                  LOGGER.error(MessageFormat.format("failed to lock {0}:{1}",
                        repository.name, cmd.getRefName()), err);
               }
            }
         }
@@ -467,6 +484,8 @@
    * @return the patchset command
    */
   private PatchsetCommand preparePatchset(ReceiveCommand cmd) {
      LOGGER.info(MessageFormat.format("Preparing {0} patchset command for \"{1}\" received from {2}",
            repository.name, cmd.getRefName(), user.username));
      String branch = getIntegrationBranch(cmd.getRefName());
      long number = getTicketId(cmd.getRefName());
@@ -539,7 +558,7 @@
      case MERGEABLE:
         break;
      default:
         if (ticket == null || requireCleanMerge) {
         if (ticket == null || requireMergeablePatchset) {
            sendError("");
            sendError("Your patchset can not be cleanly merged into {0}.", forBranch);
            sendError("Please rebase your patchset and push again.");
@@ -647,8 +666,7 @@
            sendError("  1. you created the ticket");
            sendError("  2. you created the first patchset");
            sendError("  3. you are specified as responsible for the ticket");
            sendError("  4. you are listed as a reviewer for the ticket");
            sendError("  5. you have push (RW) permission to {0}", repository.name);
            sendError("  4. you have push (RW) permissions to {0}", repository.name);
            sendError("");
            sendRejection(cmd, "not permitted to push to ticket {0,number,0}", ticket.number);
            return null;