David Ostrovsky
2014-03-11 b799d545f37f7123aaa1ee1d0ff3b61f1f3cc8c2
src/main/java/com/gitblit/wicket/pages/TicketPage.java
@@ -64,6 +64,7 @@
import com.gitblit.models.PathModel.PathChangeModel;
import com.gitblit.models.RegistrantAccessPermission;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.RepositoryUrl;
import com.gitblit.models.SubmoduleModel;
import com.gitblit.models.TicketModel;
import com.gitblit.models.TicketModel.Change;
@@ -79,6 +80,7 @@
import com.gitblit.tickets.TicketLabel;
import com.gitblit.tickets.TicketMilestone;
import com.gitblit.tickets.TicketResponsible;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.JGitUtils.MergeStatus;
import com.gitblit.utils.MarkdownUtils;
@@ -327,7 +329,7 @@
       * UPDATE FORM (DISCUSSION TAB)
       */
      if (user.canEdit(ticket, repository) && app().tickets().isAcceptingTicketUpdates(repository)) {
         if (ticket.isOpen()) {
         if (user.canAdmin(ticket, repository) && ticket.isOpen()) {
            /*
             * OPEN TICKET
             */
@@ -520,7 +522,7 @@
         WicketUtils.setCssClass(votersCount, "badge badge-info");
      }
      add(votersCount);
      if (user.isAuthenticated) {
      if (user.isAuthenticated && app().tickets().isAcceptingTicketUpdates(repository)) {
         Model<String> model;
         if (ticket.isVoter(user.username)) {
            model = Model.of(getString("gb.removeVote"));
@@ -560,7 +562,7 @@
         WicketUtils.setCssClass(watchersCount, "badge badge-info");
      }
      add(watchersCount);
      if (user.isAuthenticated) {
      if (user.isAuthenticated && app().tickets().isAcceptingTicketUpdates(repository)) {
         Model<String> model;
         if (ticket.isWatching(user.username)) {
            model = Model.of(getString("gb.stopWatching"));
@@ -731,15 +733,36 @@
       *  PATCHSET TAB
       */
      if (currentPatchset == null) {
         // no patchset yet, show propose fragment
         // no patchset available
         String repoUrl = getRepositoryUrl(user, repository);
         Fragment changeIdFrag = new Fragment("patchset", "proposeFragment", this);
         changeIdFrag.add(new Label("proposeInstructions", MarkdownUtils.transformMarkdown(getString("gb.proposeInstructions"))).setEscapeModelStrings(false));
         changeIdFrag.add(new Label("ptWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Barnum")));
         changeIdFrag.add(new Label("ptWorkflowSteps", getProposeWorkflow("propose_pt.md", repoUrl, ticket.number)).setEscapeModelStrings(false));
         changeIdFrag.add(new Label("gitWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Git")));
         changeIdFrag.add(new Label("gitWorkflowSteps", getProposeWorkflow("propose_git.md", repoUrl, ticket.number)).setEscapeModelStrings(false));
         add(changeIdFrag);
         if (ticket.isOpen() && app().tickets().isAcceptingNewPatchsets(repository) && !StringUtils.isEmpty(repoUrl)) {
            // ticket & repo will accept a proposal patchset
            // show the instructions for proposing a patchset
            Fragment changeIdFrag = new Fragment("patchset", "proposeFragment", this);
            changeIdFrag.add(new Label("proposeInstructions", MarkdownUtils.transformMarkdown(getString("gb.proposeInstructions"))).setEscapeModelStrings(false));
            changeIdFrag.add(new Label("ptWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Barnum")));
            changeIdFrag.add(new Label("ptWorkflowSteps", getProposeWorkflow("propose_pt.md", repoUrl, ticket.number)).setEscapeModelStrings(false));
            changeIdFrag.add(new Label("gitWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Git")));
            changeIdFrag.add(new Label("gitWorkflowSteps", getProposeWorkflow("propose_git.md", repoUrl, ticket.number)).setEscapeModelStrings(false));
            add(changeIdFrag);
         } else {
            // explain why you can't propose a patchset
            Fragment fragment = new Fragment("patchset", "canNotProposeFragment", this);
            String reason = "";
            if (ticket.isClosed()) {
               reason = getString("gb.ticketIsClosed");
            } else if (repository.isMirror) {
               reason = getString("gb.repositoryIsMirror");
            } else if (repository.isFrozen) {
               reason = getString("gb.repositoryIsFrozen");
            } else if (!repository.acceptNewPatchsets) {
               reason = getString("gb.repositoryDoesNotAcceptPatchsets");
            } else {
               reason = getString("gb.serverDoesNotAcceptPatchsets");
            }
            fragment.add(new Label("reason", reason));
            add(fragment);
         }
      } else {
         // show current patchset
         Fragment patchsetFrag = new Fragment("patchset", "patchsetFragment", this);
@@ -967,7 +990,11 @@
      md = md.replace("${ticketId}", "" + ticketId);
      md = md.replace("${patchset}", "" + 1);
      md = md.replace("${reviewBranch}", Repository.shortenRefName(PatchsetCommand.getTicketBranch(ticketId)));
      md = md.replace("${integrationBranch}", Repository.shortenRefName(getRepositoryModel().HEAD));
      String integrationBranch = Repository.shortenRefName(getRepositoryModel().mergeTo);
      if (!StringUtils.isEmpty(ticket.mergeTo)) {
         integrationBranch = ticket.mergeTo;
      }
      md = md.replace("${integrationBranch}", integrationBranch);
      return MarkdownUtils.transformMarkdown(md);
   }
@@ -1044,7 +1071,7 @@
      panel.add(reviewsView);
      if (ticket.isOpen() && user.canReviewPatchset(repository)) {
      if (ticket.isOpen() && user.canReviewPatchset(repository) && app().tickets().isAcceptingTicketUpdates(repository)) {
         // can only review open tickets
         Review myReview = null;
         for (Change change : ticket.getReviews(currentPatchset)) {
@@ -1134,7 +1161,7 @@
               String displayPath = entry.path;
               String path = entry.path;
               if (entry.isSymlink()) {
                  RevCommit commit = JGitUtils.getCommit(getRepository(), Constants.R_TICKETS_PATCHSETS + ticket.number);
                  RevCommit commit = JGitUtils.getCommit(getRepository(), PatchsetCommand.getTicketBranch(ticket.number));
                  path = JGitUtils.getStringContent(getRepository(), commit.getTree(), path);
                  displayPath = entry.path + " -> " + path;
               }
@@ -1178,8 +1205,8 @@
      };
      panel.add(pathsView);
      addPtReviewInstructions(user, repository, panel);
      addGitReviewInstructions(user, repository, panel);
      addPtCheckoutInstructions(user, repository, panel);
      addGitCheckoutInstructions(user, repository, panel);
      panel.add(createMergePanel(user, repository));
      return panel;
@@ -1253,17 +1280,14 @@
      return x;
   }
   protected void addGitReviewInstructions(UserModel user, RepositoryModel repository, MarkupContainer panel) {
      String repoUrl = getRepositoryUrl(user, repository);
   protected void addGitCheckoutInstructions(UserModel user, RepositoryModel repository, MarkupContainer panel) {
      panel.add(new Label("gitStep1", MessageFormat.format(getString("gb.stepN"), 1)));
      panel.add(new Label("gitStep2", MessageFormat.format(getString("gb.stepN"), 2)));
      String ticketBranch  = Repository.shortenRefName(PatchsetCommand.getTicketBranch(ticket.number));
      String reviewBranch = PatchsetCommand.getReviewBranch(ticket.number);
      String step1 = MessageFormat.format("git fetch {0} {1}", repoUrl, ticketBranch);
      String step2 = MessageFormat.format("git checkout -B {0} FETCH_HEAD", reviewBranch);
      String step1 = "git fetch origin";
      String step2 = MessageFormat.format("git checkout {0} && git pull --ff-only\nOR\ngit checkout {0} && git reset --hard origin/{0}", ticketBranch);
      panel.add(new Label("gitPreStep1", step1));
      panel.add(new Label("gitPreStep2", step2));
@@ -1272,7 +1296,7 @@
      panel.add(createCopyFragment("gitCopyStep2", step2.replace("\n", " && ")));
   }
   protected void addPtReviewInstructions(UserModel user, RepositoryModel repository, MarkupContainer panel) {
   protected void addPtCheckoutInstructions(UserModel user, RepositoryModel repository, MarkupContainer panel) {
      String step1 = MessageFormat.format("pt checkout {0,number,0}", ticket.number);
      panel.add(new Label("ptPreStep", step1));
      panel.add(createCopyFragment("ptCopyStep", step1));
@@ -1417,7 +1441,6 @@
   protected Component getMergeInstructions(UserModel user, RepositoryModel repository, String markupId, String infoKey) {
      Fragment cmd = new Fragment(markupId, "commandlineMergeFragment", this);
      cmd.add(new Label("instructions", MessageFormat.format(getString(infoKey), ticket.mergeTo)));
      String repoUrl = getRepositoryUrl(user, repository);
      // git instructions
      cmd.add(new Label("mergeStep1", MessageFormat.format(getString("gb.stepN"), 1)));
@@ -1427,9 +1450,9 @@
      String ticketBranch = Repository.shortenRefName(PatchsetCommand.getTicketBranch(ticket.number));
      String reviewBranch = PatchsetCommand.getReviewBranch(ticket.number);
      String step1 = MessageFormat.format("git checkout -B {0} {1}", reviewBranch, ticket.mergeTo);
      String step2 = MessageFormat.format("git pull {0} {1}", repoUrl, ticketBranch);
      String step3 = MessageFormat.format("git checkout {0}\ngit merge {1}\ngit push origin {0}", ticket.mergeTo, reviewBranch);
      String step1 = MessageFormat.format("git checkout -b {0} {1}", reviewBranch, ticket.mergeTo);
      String step2 = MessageFormat.format("git pull origin {0}", ticketBranch);
      String step3 = MessageFormat.format("git checkout {0}\ngit merge {1}\ngit push origin {0}\ngit branch -d {1}", ticket.mergeTo, reviewBranch);
      cmd.add(new Label("mergePreStep1", step1));
      cmd.add(new Label("mergePreStep2", step2));
@@ -1455,7 +1478,11 @@
    */
   protected String getRepositoryUrl(UserModel user, RepositoryModel repository) {
      HttpServletRequest req = ((WebRequest) getRequest()).getHttpServletRequest();
      String primaryurl = app().gitblit().getRepositoryUrls(req, user, repository).get(0).url;
      List<RepositoryUrl> urls = app().gitblit().getRepositoryUrls(req, user, repository);
      if (ArrayUtils.isEmpty(urls)) {
         return null;
      }
      String primaryurl = urls.get(0).url;
      String url = primaryurl;
      try {
         url = new URIish(primaryurl).setUser(null).toString();