James Moger
2013-10-24 a7317acec01cde855a9f9f3d2da3dcc49d89aa86
src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
@@ -16,6 +16,8 @@
package com.gitblit.wicket.pages;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -43,6 +45,8 @@
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.pegdown.LinkRenderer;
import org.pegdown.ast.WikiLinkNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -75,7 +79,7 @@
public abstract class RepositoryPage extends RootPage {
   private final Logger logger = LoggerFactory.getLogger(getClass());
   protected final Logger logger = LoggerFactory.getLogger(getClass());
   private final String PARAM_STAR = "star";
@@ -204,7 +208,7 @@
      // conditional links
      // per-repository extra page links
      if (model.showReadme || model.useDocs) {
      if (model.useDocs) {
         pages.put("docs", new PageRegistration("gb.docs", DocsPage.class, params, true));
      }
      if (JGitUtils.getPagesBranch(r) != null) {
@@ -399,6 +403,30 @@
      return commit;
   }
   protected String getBestCommitId(RevCommit commit) {
      String head = null;
      try {
         head = r.resolve(getRepositoryModel().HEAD).getName();
      } catch (Exception e) {
      }
      String id = commit.getName();
      if (!StringUtils.isEmpty(head) && head.equals(id)) {
         // match default branch
         return Repository.shortenRefName(getRepositoryModel().HEAD);
      }
      // find first branch match
      for (RefModel ref : JGitUtils.getLocalBranches(r, false, -1)) {
         if (ref.getObjectId().getName().equals(id)) {
            return ref.getName();
         }
      }
      // return sha
      return id;
   }
   protected Map<String, SubmoduleModel> getSubmodules(RevCommit commit) {
      if (submodules == null) {
         submodules = new HashMap<String, SubmoduleModel>();
@@ -482,12 +510,17 @@
      add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r, getRepositoryModel().showRemoteBranches)));
   }
   protected void addFullText(String wicketId, String text, boolean substituteRegex) {
      String html = StringUtils.escapeForHtml(text, false);
      if (substituteRegex) {
         html = GitBlit.self().processCommitMessage(repositoryName, html);
      } else {
         html = StringUtils.breakLinesForHtml(html);
   protected void addFullText(String wicketId, String text) {
      RepositoryModel model = getRepositoryModel();
      String content = GitBlit.self().processCommitMessage(model, text);
      String html;
      switch (model.commitMessageRenderer) {
      case MARKDOWN:
         html = MessageFormat.format("<div class='commit_message'>{0}</div>", content);
         break;
      default:
         html = MessageFormat.format("<pre class='commit_message'>{0}</pre>", content);
         break;
      }
      add(new Label(wicketId, html).setEscapeModelStrings(false));
   }
@@ -615,6 +648,33 @@
      return isOwner;
   }
   /**
    * Returns a Pegdown/Markdown link renderer which renders WikiLinks.
    *
    * @return a link renderer
    */
   protected LinkRenderer getLinkRenderer() {
      RevCommit head = JGitUtils.getCommit(r, "HEAD");
      final String id = getBestCommitId(head);
      LinkRenderer renderer = new LinkRenderer() {
         @Override
         public Rendering render(WikiLinkNode node) {
            try {
               String path = URLEncoder.encode(node.getText().replace(' ', '-'), "UTF-8");
               String name = node.getText();
               if (name.indexOf('/') > -1) {
                  name = name.substring(name.lastIndexOf('/') + 1);
               }
               String url = urlFor(MarkdownPage.class, WicketUtils.newPathParameter(repositoryName, id, path)).toString();
               return new Rendering(url, name);
            } catch (UnsupportedEncodingException e) {
               throw new IllegalStateException();
            }
         }
      };
      return renderer;
   }
   private class SearchForm extends SessionlessForm<Void> implements Serializable {
      private static final long serialVersionUID = 1L;