James Moger
2013-11-25 5ae529ea8a73edc8e2bb1e7f9576e51c9d870224
src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
@@ -37,7 +37,6 @@
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.RequestUtils;
import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import org.eclipse.jgit.lib.PersonIdent;
@@ -47,20 +46,20 @@
import org.slf4j.LoggerFactory;
import com.gitblit.Constants;
import com.gitblit.GitBlit;
import com.gitblit.GitBlitException;
import com.gitblit.Keys;
import com.gitblit.PagesServlet;
import com.gitblit.SyndicationServlet;
import com.gitblit.models.ProjectModel;
import com.gitblit.models.RefModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.SubmoduleModel;
import com.gitblit.models.UserModel;
import com.gitblit.models.UserRepositoryPreferences;
import com.gitblit.servlet.PagesServlet;
import com.gitblit.servlet.SyndicationServlet;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.DeepCopier;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.MessageProcessor;
import com.gitblit.utils.RefLogUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.CacheControl;
@@ -98,7 +97,7 @@
      repositoryName = WicketUtils.getRepositoryName(params);
      String root =StringUtils.getFirstPathElement(repositoryName);
      if (StringUtils.isEmpty(root)) {
         projectName = GitBlit.getString(Keys.web.repositoryRootGroupName, "main");
         projectName = app().settings().getString(Keys.web.repositoryRootGroupName, "main");
      } else {
         projectName = root;
      }
@@ -140,7 +139,7 @@
            UserRepositoryPreferences prefs = user.getPreferences().getRepositoryPreferences(getRepositoryModel().name);
            prefs.starred = star;
            try {
               GitBlit.self().updateUserModel(user.username, user, false);
               app().gitblit().reviseUser(user.username, user);
            } catch (GitBlitException e) {
               logger.error("Failed to update user " + user.username, e);
               error(getString("gb.failedToUpdateUser"), false);
@@ -177,6 +176,10 @@
      return getClass();
   }
   protected MessageProcessor messageProcessor() {
      return new MessageProcessor(app().settings());
   }
   private Map<String, PageRegistration> registerPages() {
      PageParameters params = null;
      if (!StringUtils.isEmpty(repositoryName)) {
@@ -197,16 +200,14 @@
      }
      pages.put("commits", new PageRegistration("gb.commits", LogPage.class, params));
      pages.put("tree", new PageRegistration("gb.tree", TreePage.class, params));
      pages.put("docs", new PageRegistration("gb.docs", DocsPage.class, params, true));
      pages.put("compare", new PageRegistration("gb.compare", ComparePage.class, params, true));
      if (GitBlit.getBoolean(Keys.web.allowForking, true)) {
      if (app().settings().getBoolean(Keys.web.allowForking, true)) {
         pages.put("forks", new PageRegistration("gb.forks", ForksPage.class, params, true));
      }
      // conditional links
      // per-repository extra page links
      if (model.useDocs) {
         pages.put("docs", new PageRegistration("gb.docs", DocsPage.class, params, true));
      }
      if (JGitUtils.getPagesBranch(r) != null) {
         OtherPageLink pagesLink = new OtherPageLink("gb.pages", PagesServlet.asLink(
               getRequest().getRelativePathPrefixToContextRoot(), repositoryName, null), true);
@@ -215,11 +216,11 @@
      // Conditionally add edit link
      showAdmin = false;
      if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
         boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
      if (app().settings().getBoolean(Keys.web.authenticateAdminPages, true)) {
         boolean allowAdmin = app().settings().getBoolean(Keys.web.allowAdministration, false);
         showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
      } else {
         showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
         showAdmin = app().settings().getBoolean(Keys.web.allowAdministration, false);
      }
      isOwner = GitBlitWebSession.get().isLoggedIn()
            && (model.isOwner(GitBlitWebSession.get()
@@ -228,13 +229,13 @@
   }
   protected boolean allowForkControls() {
      return GitBlit.getBoolean(Keys.web.allowForking, true);
      return app().settings().getBoolean(Keys.web.allowForking, true);
   }
   @Override
   protected void setupPage(String repositoryName, String pageName) {
      String projectName = StringUtils.getFirstPathElement(repositoryName);
      ProjectModel project = GitBlit.self().getProjectModel(projectName);
      ProjectModel project = app().projects().getProjectModel(projectName);
      if (project.isUserProject()) {
         // user-as-project
         add(new LinkPanel("projectTitle", null, project.getDisplayName(),
@@ -261,9 +262,16 @@
      // indicate origin repository
      RepositoryModel model = getRepositoryModel();
      if (StringUtils.isEmpty(model.originRepository)) {
         add(new Label("originRepository").setVisible(false));
         if (model.isMirror) {
            Fragment mirrorFrag = new Fragment("originRepository", "mirrorFragment", this);
            Label lbl = new Label("originRepository", MessageFormat.format(getString("gb.mirrorOf"), "<b>" + model.origin + "</b>"));
            mirrorFrag.add(lbl.setEscapeModelStrings(false));
            add(mirrorFrag);
         } else {
            add(new Label("originRepository").setVisible(false));
         }
      } else {
         RepositoryModel origin = GitBlit.self().getRepositoryModel(model.originRepository);
         RepositoryModel origin = app().repositories().getRepositoryModel(model.originRepository);
         if (origin == null) {
            // no origin repository
            add(new Label("originRepository").setVisible(false));
@@ -307,7 +315,7 @@
         add(new ExternalLink("forkLink", "").setVisible(false));
         add(new ExternalLink("myForkLink", "").setVisible(false));
      } else {
         String fork = GitBlit.self().getFork(user.username, model.name);
         String fork = app().repositories().getFork(user.username, model.name);
         boolean hasFork = fork != null;
         boolean canFork = user.canFork(model);
@@ -359,7 +367,7 @@
   protected Repository getRepository() {
      if (r == null) {
         Repository r = GitBlit.self().getRepository(repositoryName);
         Repository r = app().repositories().getRepository(repositoryName);
         if (r == null) {
            error(getString("gb.canNotLoadRepository") + " " + repositoryName, true);
            return null;
@@ -371,10 +379,10 @@
   protected RepositoryModel getRepositoryModel() {
      if (m == null) {
         RepositoryModel model = GitBlit.self().getRepositoryModel(
         RepositoryModel model = app().repositories().getRepositoryModel(
               GitBlitWebSession.get().getUser(), repositoryName);
         if (model == null) {
            if (GitBlit.self().hasRepository(repositoryName, true)) {
            if (app().repositories().hasRepository(repositoryName, true)) {
               // has repository, but unauthorized
               authenticationError(getString("gb.unauthorizedAccessForRepository") + " " + repositoryName);
            } else {
@@ -397,6 +405,30 @@
      }
      getSubmodules(commit);
      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) {
@@ -422,7 +454,7 @@
         return model;
      } else {
         // extract the repository name from the clone url
         List<String> patterns = GitBlit.getStrings(Keys.git.submoduleUrlPatterns);
         List<String> patterns = app().settings().getStrings(Keys.git.submoduleUrlPatterns);
         String submoduleName = StringUtils.extractRepositoryPath(model.url, patterns.toArray(new String[0]));
         // determine the current path for constructing paths relative
@@ -461,7 +493,7 @@
         // create a unique, ordered set of candidate paths
         Set<String> paths = new LinkedHashSet<String>(candidates);
         for (String candidate : paths) {
            if (GitBlit.self().hasRepository(candidate)) {
            if (app().repositories().hasRepository(candidate)) {
               model.hasSubmodule = true;
               model.gitblitPath = candidate;
               return model;
@@ -475,7 +507,7 @@
   }
   protected String getShortObjectId(String objectId) {
      return objectId.substring(0, GitBlit.getInteger(Keys.web.shortCommitIdLength, 6));
      return objectId.substring(0, app().settings().getInteger(Keys.web.shortCommitIdLength, 6));
   }
   protected void addRefs(Repository r, RevCommit c) {
@@ -484,7 +516,7 @@
   protected void addFullText(String wicketId, String text) {
      RepositoryModel model = getRepositoryModel();
      String content = GitBlit.self().processCommitMessage(model, text);
      String content = messageProcessor().processCommitMessage(model, text);
      String html;
      switch (model.commitMessageRenderer) {
      case MARKDOWN:
@@ -505,7 +537,7 @@
      String address = identity == null ? "" : identity.getEmailAddress();
      name = StringUtils.removeNewlines(name);
      address = StringUtils.removeNewlines(address);
      boolean showEmail = GitBlit.getBoolean(Keys.web.showEmailAddresses, false);
      boolean showEmail = app().settings().getBoolean(Keys.web.showEmailAddresses, false);
      if (!showEmail || StringUtils.isEmpty(name) || StringUtils.isEmpty(address)) {
         String value = name;
         if (StringUtils.isEmpty(value)) {
@@ -636,7 +668,7 @@
         DropDownChoice<Constants.SearchType> searchType = new DropDownChoice<Constants.SearchType>(
               "searchType", Arrays.asList(Constants.SearchType.values()));
         searchType.setModel(searchTypeModel);
         add(searchType.setVisible(GitBlit.getBoolean(Keys.web.showSearchTypeSelection, false)));
         add(searchType.setVisible(app().settings().getBoolean(Keys.web.showSearchTypeSelection, false)));
         TextField<String> searchBox = new TextField<String>("searchBox", searchBoxModel);
         add(searchBox);
      }
@@ -654,9 +686,7 @@
         String searchString = searchBoxModel.getObject();
         if (StringUtils.isEmpty(searchString)) {
            // redirect to self to avoid wicket page update bug
            PageParameters params = RepositoryPage.this.getPageParameters();
            String relativeUrl = urlFor(RepositoryPage.this.getClass(), params).toString();
            String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
            String absoluteUrl = getCanonicalUrl();
            getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
            return;
         }
@@ -669,8 +699,8 @@
            }
         }
         Class<? extends BasePage> searchPageClass = GitSearchPage.class;
         RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
         if (GitBlit.getBoolean(Keys.web.allowLuceneIndexing, true)
         RepositoryModel model = app().repositories().getRepositoryModel(repositoryName);
         if (app().settings().getBoolean(Keys.web.allowLuceneIndexing, true)
               && !ArrayUtils.isEmpty(model.indexedBranches)) {
            // this repository is Lucene-indexed
            searchPageClass = LuceneSearchPage.class;
@@ -678,8 +708,7 @@
         // use an absolute url to workaround Wicket-Tomcat problems with
         // mounted url parameters (issue-111)
         PageParameters params = WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType);
         String relativeUrl = urlFor(searchPageClass, params).toString();
         String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
         String absoluteUrl = getCanonicalUrl(searchPageClass, params);
         getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
      }
   }