Paul Martin
2016-04-27 c2188a840bc4153ae92112b04b2e06a90d3944aa
src/main/java/com/gitblit/wicket/panels/RefsPanel.java
@@ -15,6 +15,7 @@
 */
package com.gitblit.wicket.panels;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -24,25 +25,25 @@
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.revwalk.RevCommit;
import com.gitblit.Constants;
import com.gitblit.models.RefModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.pages.CommitPage;
import com.gitblit.wicket.pages.LogPage;
import com.gitblit.wicket.pages.TagPage;
import com.gitblit.wicket.pages.TicketsPage;
public class RefsPanel extends Panel {
public class RefsPanel extends BasePanel {
   private static final long serialVersionUID = 1L;
   private static final String R_CHANGES = "refs/changes/";
   public RefsPanel(String id, final String repositoryName, RevCommit c,
         Map<ObjectId, List<RefModel>> refs) {
@@ -65,7 +66,7 @@
            boolean remote2 = o2.displayName.startsWith(Constants.R_REMOTES);
            if (remote1 && remote2) {
               // both are remote heads, sort by name
               return o1.displayName.compareTo(o2.displayName);
               return o1.displayName.compareTo(o2.displayName);
            }
            if (remote1) {
               // o1 is remote, o2 comes first
@@ -79,7 +80,7 @@
            return o1.displayName.compareTo(o2.displayName);
         }
      });
      // count remote and determine if we should insert a break
      int remoteCount = 0;
      for (RefModel ref : refs) {
@@ -88,12 +89,15 @@
         }
      }
      final boolean shouldBreak = remoteCount < refs.size();
      RepositoryModel repository = app().repositories().getRepositoryModel(repositoryName);
      final boolean hasTickets = app().tickets().hasTickets(repository);
      ListDataProvider<RefModel> refsDp = new ListDataProvider<RefModel>(refs);
      DataView<RefModel> refsView = new DataView<RefModel>("ref", refsDp) {
         private static final long serialVersionUID = 1L;
         private boolean alreadyInsertedBreak = !shouldBreak;
         @Override
         public void populateItem(final Item<RefModel> item) {
            RefModel entry = item.getModelObject();
            String name = entry.displayName;
@@ -101,7 +105,14 @@
            boolean breakLine = false;
            Class<? extends WebPage> linkClass = CommitPage.class;
            String cssClass = "";
            if (name.startsWith(Constants.R_HEADS)) {
            String tooltip = "";
            if (name.startsWith(Constants.R_TICKET)) {
               // Gitblit ticket ref
               objectid = name.substring(Constants.R_TICKET.length());
               name = name.substring(Constants.R_HEADS.length());
               linkClass = TicketsPage.class;
               cssClass = "localBranch";
            } else if (name.startsWith(Constants.R_HEADS)) {
               // local branch
               linkClass = LogPage.class;
               name = name.substring(Constants.R_HEADS.length());
@@ -110,10 +121,34 @@
               // local head
               linkClass = LogPage.class;
               cssClass = "headRef";
            } else if (name.startsWith(R_CHANGES)) {
               // Gerrit change ref
               name = name.substring(R_CHANGES.length());
            } else if (name.startsWith(Constants.R_CHANGES)) {
               // Gitblit change ref
               name = name.substring(Constants.R_CHANGES.length());
               // strip leading nn/ from nn/#####nn/ps = #####nn-ps
               name = name.substring(name.indexOf('/') + 1).replace('/', '-');
               String [] values = name.split("-");
               // Gerrit change
               tooltip = MessageFormat.format(getString("gb.reviewPatchset"), values[0], values[1]);
               cssClass = "otherRef";
            } else if (name.startsWith(Constants.R_TICKETS_PATCHSETS)) {
               // Gitblit patchset ref
               name = name.substring(Constants.R_TICKETS_PATCHSETS.length());
               // strip leading nn/ from nn/#####nn/ps = #####nn-ps
               name = name.substring(name.indexOf('/') + 1).replace('/', '-');
               String [] values = name.split("-");
               tooltip = MessageFormat.format(getString("gb.ticketPatchset"), values[0], values[1]);
               linkClass = LogPage.class;
               cssClass = "otherRef";
            } else if (name.startsWith(Constants.R_PULL)) {
               // Pull Request ref
               String num = name.substring(Constants.R_PULL.length());
               if (num.endsWith("/head")) {
                  // strip pull request head from name
                  num = num.substring(0, num.length() - "/head".length());
               }
               name = "pr #" + num;
               tooltip = "pull request #" + num;
               cssClass = "pullRef";
            } else if (name.startsWith(Constants.R_REMOTES)) {
               // remote branch
               linkClass = LogPage.class;
@@ -138,17 +173,21 @@
               // codereview refs
               linkClass = CommitPage.class;
               cssClass = "otherRef";
            } else if (name.startsWith(com.gitblit.Constants.R_GITBLIT)) {
               // gitblit refs
            } else if (name.startsWith(com.gitblit.Constants.R_META)) {
               // internal meta refs
               linkClass = LogPage.class;
               cssClass = "otherRef";
               name = name.substring(com.gitblit.Constants.R_GITBLIT.length());
               name = name.substring(com.gitblit.Constants.R_META.length());
            }
            Component c = new LinkPanel("refName", null, name, linkClass,
                  WicketUtils.newObjectParameter(repositoryName, objectid));
            WicketUtils.setCssClass(c, cssClass);
            WicketUtils.setHtmlTooltip(c, name);
            if (StringUtils.isEmpty(tooltip)) {
               WicketUtils.setHtmlTooltip(c, name);
            } else {
               WicketUtils.setHtmlTooltip(c, tooltip);
            }
            item.add(c);
            Label lb = new Label("lineBreak", "<br/>");
            lb.setVisible(breakLine);