From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.
---
src/com/gitblit/wicket/pages/RepositoryPage.java | 551 +++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 376 insertions(+), 175 deletions(-)
diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.java b/src/com/gitblit/wicket/pages/RepositoryPage.java
index 143d885..c90e353 100644
--- a/src/com/gitblit/wicket/pages/RepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoryPage.java
@@ -15,153 +15,121 @@
*/
package com.gitblit.wicket.pages;
+import java.io.Serializable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Set;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.panel.Fragment;
-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.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;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.gitblit.Constants;
import com.gitblit.GitBlit;
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.utils.ArrayUtils;
import com.gitblit.utils.JGitUtils;
-import com.gitblit.utils.JGitUtils.SearchType;
import com.gitblit.utils.StringUtils;
+import com.gitblit.utils.TicgitUtils;
import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.PageRegistration;
+import com.gitblit.wicket.PageRegistration.OtherPageLink;
+import com.gitblit.wicket.SessionlessForm;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.LinkPanel;
+import com.gitblit.wicket.panels.NavigationPanel;
import com.gitblit.wicket.panels.RefsPanel;
public abstract class RepositoryPage extends BasePage {
+ protected final String projectName;
protected final String repositoryName;
protected final String objectId;
-
+
private transient Repository r;
private RepositoryModel m;
- private final Logger logger = LoggerFactory.getLogger(RepositoryPage.class);
-
- private final Map<String, String> knownPages = new HashMap<String, String>() {
-
- private static final long serialVersionUID = 1L;
-
- {
- put("summary", "gb.summary");
- put("log", "gb.log");
- put("branches", "gb.branches");
- put("tags", "gb.tags");
- put("tree", "gb.tree");
- put("metrics", "gb.metrics");
- put("tickets", "gb.tickets");
- put("edit", "gb.edit");
- }
- };
-
+ private Map<String, SubmoduleModel> submodules;
+
+ private final Map<String, PageRegistration> registeredPages;
+ private boolean showAdmin;
+ private boolean isOwner;
+
public RepositoryPage(PageParameters params) {
super(params);
repositoryName = WicketUtils.getRepositoryName(params);
- objectId = WicketUtils.getObject(params);
-
- if (StringUtils.isEmpty(repositoryName)) {
- error(MessageFormat.format("Repository not specified for {0}!", getPageName()), true);
- }
-
- Repository r = getRepository();
- RepositoryModel model = getRepositoryModel();
-
- // standard page links
- add(new BookmarkablePageLink<Void>("summary", SummaryPage.class,
- WicketUtils.newRepositoryParameter(repositoryName)));
- add(new BookmarkablePageLink<Void>("log", LogPage.class,
- WicketUtils.newRepositoryParameter(repositoryName)));
- add(new BookmarkablePageLink<Void>("branches", BranchesPage.class,
- WicketUtils.newRepositoryParameter(repositoryName)));
- add(new BookmarkablePageLink<Void>("tags", TagsPage.class,
- WicketUtils.newRepositoryParameter(repositoryName)));
- add(new BookmarkablePageLink<Void>("tree", TreePage.class,
- WicketUtils.newRepositoryParameter(repositoryName)));
- add(new BookmarkablePageLink<Void>("metrics", MetricsPage.class,
- WicketUtils.newRepositoryParameter(repositoryName)));
-
- // per-repository extra page links
- List<String> extraPageLinks = new ArrayList<String>();
-
- // Conditionally add tickets link
- if (model.useTickets && JGitUtils.getTicketsBranch(r) != null) {
- extraPageLinks.add("tickets");
- }
-
- // Conditionally add docs link
- if (model.useDocs) {
- extraPageLinks.add("docs");
- }
-
- final boolean showAdmin;
- if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
- boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
- showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
+ String root =StringUtils.getFirstPathElement(repositoryName);
+ if (StringUtils.isEmpty(root)) {
+ projectName = GitBlit.getString(Keys.web.repositoryRootGroupName, "main");
} else {
- showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
+ projectName = root;
+ }
+ objectId = WicketUtils.getObject(params);
+
+ if (StringUtils.isEmpty(repositoryName)) {
+ error(MessageFormat.format(getString("gb.repositoryNotSpecifiedFor"), getPageName()), true);
}
- // Conditionally add edit link
- if (showAdmin
- || GitBlitWebSession.get().isLoggedIn()
- && (model.owner != null && model.owner.equalsIgnoreCase(GitBlitWebSession.get()
- .getUser().username))) {
- extraPageLinks.add("edit");
+ if (!getRepositoryModel().hasCommits) {
+ setResponsePage(EmptyRepositoryPage.class, params);
+ }
+
+ if (getRepositoryModel().isCollectingGarbage) {
+ error(MessageFormat.format(getString("gb.busyCollectingGarbage"), getRepositoryModel().name), true);
}
- ListDataProvider<String> extrasDp = new ListDataProvider<String>(extraPageLinks);
- DataView<String> extrasView = new DataView<String>("extra", extrasDp) {
- private static final long serialVersionUID = 1L;
-
- public void populateItem(final Item<String> item) {
- String extra = item.getModelObject();
- if (extra.equals("tickets")) {
- item.add(new Label("extraSeparator", " | "));
- item.add(new LinkPanel("extraLink", null, getString("gb.tickets"),
- TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
- } else if (extra.equals("docs")) {
- item.add(new Label("extraSeparator", " | "));
- item.add(new LinkPanel("extraLink", null, getString("gb.docs"), DocsPage.class,
- WicketUtils.newRepositoryParameter(repositoryName)));
- } else if (extra.equals("edit")) {
- item.add(new Label("extraSeparator", " | "));
- item.add(new LinkPanel("extraLink", null, getString("gb.edit"),
- EditRepositoryPage.class, WicketUtils
- .newRepositoryParameter(repositoryName)));
+ if (objectId != null) {
+ RefModel branch = null;
+ if ((branch = JGitUtils.getBranch(getRepository(), objectId)) != null) {
+ UserModel user = GitBlitWebSession.get().getUser();
+ if (user == null) {
+ // workaround until get().getUser() is reviewed throughout the app
+ user = UserModel.ANONYMOUS;
+ }
+ boolean canAccess = user.hasBranchPermission(repositoryName,
+ branch.reference.getName());
+ if (!canAccess) {
+ error(getString("gb.accessDeined"), true);
}
}
- };
- add(extrasView);
+ }
- // disable current page
- disablePageLink(getPageName());
+ // register the available page links for this page and user
+ registeredPages = registerPages();
+
+ // standard page links
+ List<PageRegistration> pages = new ArrayList<PageRegistration>(registeredPages.values());
+ NavigationPanel navigationPanel = new NavigationPanel("navPanel", getClass(), pages);
+ add(navigationPanel);
+
+ add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest()
+ .getRelativePathPrefixToContextRoot(), repositoryName, null, 0)));
// add floating search form
SearchForm searchForm = new SearchForm("searchForm", repositoryName);
@@ -172,25 +140,178 @@
setStatelessHint(true);
}
- public void disablePageLink(String pageName) {
- for (String wicketId : knownPages.keySet()) {
- String key = knownPages.get(wicketId);
- String linkName = getString(key);
- if (linkName.equals(pageName)) {
- Component c = get(wicketId);
- if (c != null) {
- c.setEnabled(false);
- }
- break;
+ private Map<String, PageRegistration> registerPages() {
+ PageParameters params = null;
+ if (!StringUtils.isEmpty(repositoryName)) {
+ params = WicketUtils.newRepositoryParameter(repositoryName);
+ }
+ Map<String, PageRegistration> pages = new LinkedHashMap<String, PageRegistration>();
+
+ // standard links
+ pages.put("repositories", new PageRegistration("gb.repositories", RepositoriesPage.class));
+ pages.put("summary", new PageRegistration("gb.summary", SummaryPage.class, params));
+ pages.put("log", new PageRegistration("gb.log", LogPage.class, params));
+ pages.put("branches", new PageRegistration("gb.branches", BranchesPage.class, params));
+ pages.put("tags", new PageRegistration("gb.tags", TagsPage.class, params));
+ pages.put("tree", new PageRegistration("gb.tree", TreePage.class, params));
+ pages.put("forks", new PageRegistration("gb.forks", ForksPage.class, params));
+
+ // conditional links
+ Repository r = getRepository();
+ RepositoryModel model = getRepositoryModel();
+
+ // per-repository extra page links
+ if (model.useTickets && TicgitUtils.getTicketsBranch(r) != null) {
+ pages.put("tickets", new PageRegistration("gb.tickets", TicketsPage.class, params));
+ }
+ if (model.useDocs) {
+ pages.put("docs", new PageRegistration("gb.docs", DocsPage.class, params));
+ }
+ if (JGitUtils.getPagesBranch(r) != null) {
+ OtherPageLink pagesLink = new OtherPageLink("gb.pages", PagesServlet.asLink(
+ getRequest().getRelativePathPrefixToContextRoot(), repositoryName, null));
+ pages.put("pages", pagesLink);
+ }
+
+ // Conditionally add edit link
+ showAdmin = false;
+ if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
+ boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
+ showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
+ } else {
+ showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
+ }
+ isOwner = GitBlitWebSession.get().isLoggedIn()
+ && (model.owner != null && model.owner.equalsIgnoreCase(GitBlitWebSession.get()
+ .getUsername()));
+ if (showAdmin || isOwner) {
+ pages.put("edit", new PageRegistration("gb.edit", EditRepositoryPage.class, params));
+ }
+ return pages;
+ }
+
+ protected boolean allowForkControls() {
+ return true;
+ }
+
+ @Override
+ protected void setupPage(String repositoryName, String pageName) {
+ String projectName = StringUtils.getFirstPathElement(repositoryName);
+ ProjectModel project = GitBlit.self().getProjectModel(projectName);
+ if (project.isUserProject()) {
+ // user-as-project
+ add(new LinkPanel("projectTitle", null, project.getDisplayName(),
+ UserPage.class, WicketUtils.newUsernameParameter(project.name.substring(1))));
+ } else {
+ // project
+ add(new LinkPanel("projectTitle", null, project.name,
+ ProjectPage.class, WicketUtils.newProjectParameter(project.name)));
+ }
+
+ String name = StringUtils.stripDotGit(repositoryName);
+ if (!StringUtils.isEmpty(projectName) && name.startsWith(projectName)) {
+ name = name.substring(projectName.length() + 1);
+ }
+ add(new LinkPanel("repositoryName", null, name, SummaryPage.class,
+ WicketUtils.newRepositoryParameter(repositoryName)));
+ add(new Label("pageName", pageName).setRenderBodyOnly(true));
+
+ UserModel user = GitBlitWebSession.get().getUser();
+ if (user == null) {
+ user = UserModel.ANONYMOUS;
+ }
+
+ // indicate origin repository
+ RepositoryModel model = getRepositoryModel();
+ if (StringUtils.isEmpty(model.originRepository)) {
+ add(new Label("originRepository").setVisible(false));
+ } else {
+ RepositoryModel origin = GitBlit.self().getRepositoryModel(model.originRepository);
+ if (origin == null) {
+ // no origin repository
+ add(new Label("originRepository").setVisible(false));
+ } else if (!user.canView(origin)) {
+ // show origin repository without link
+ Fragment forkFrag = new Fragment("originRepository", "originFragment", this);
+ forkFrag.add(new Label("originRepository", StringUtils.stripDotGit(model.originRepository)));
+ add(forkFrag);
+ } else {
+ // link to origin repository
+ Fragment forkFrag = new Fragment("originRepository", "originFragment", this);
+ forkFrag.add(new LinkPanel("originRepository", null, StringUtils.stripDotGit(model.originRepository),
+ SummaryPage.class, WicketUtils.newRepositoryParameter(model.originRepository)));
+ add(forkFrag);
}
}
+
+ if (getRepositoryModel().isBare) {
+ add(new Label("workingCopyIndicator").setVisible(false));
+ } else {
+ Fragment wc = new Fragment("workingCopyIndicator", "workingCopyFragment", this);
+ Label lbl = new Label("workingCopy", getString("gb.workingCopy"));
+ WicketUtils.setHtmlTooltip(lbl, getString("gb.workingCopyWarning"));
+ wc.add(lbl);
+ add(wc);
+ }
+
+ // fork controls
+ if (!allowForkControls() || user == null || !user.isAuthenticated) {
+ // must be logged-in to fork, hide all fork controls
+ add(new ExternalLink("forkLink", "").setVisible(false));
+ add(new ExternalLink("myForkLink", "").setVisible(false));
+ add(new Label("forksProhibitedIndicator").setVisible(false));
+ } else {
+ String fork = GitBlit.self().getFork(user.username, model.name);
+ boolean hasFork = fork != null;
+ boolean canFork = user.canFork(model);
+
+ if (hasFork || !canFork) {
+ // user not allowed to fork or fork already exists or repo forbids forking
+ add(new ExternalLink("forkLink", "").setVisible(false));
+
+ if (user.canFork() && !model.allowForks) {
+ // show forks prohibited indicator
+ Fragment wc = new Fragment("forksProhibitedIndicator", "forksProhibitedFragment", this);
+ Label lbl = new Label("forksProhibited", getString("gb.forksProhibited"));
+ WicketUtils.setHtmlTooltip(lbl, getString("gb.forksProhibitedWarning"));
+ wc.add(lbl);
+ add(wc);
+ } else {
+ // can not fork, no need for forks prohibited indicator
+ add(new Label("forksProhibitedIndicator").setVisible(false));
+ }
+
+ if (hasFork && !fork.equals(model.name)) {
+ // user has fork, view my fork link
+ String url = getRequestCycle().urlFor(SummaryPage.class, WicketUtils.newRepositoryParameter(fork)).toString();
+ add(new ExternalLink("myForkLink", url));
+ } else {
+ // no fork, hide view my fork link
+ add(new ExternalLink("myForkLink", "").setVisible(false));
+ }
+ } else if (canFork) {
+ // can fork and we do not have one
+ add(new Label("forksProhibitedIndicator").setVisible(false));
+ add(new ExternalLink("myForkLink", "").setVisible(false));
+ String url = getRequestCycle().urlFor(ForkPage.class, WicketUtils.newRepositoryParameter(model.name)).toString();
+ add(new ExternalLink("forkLink", url));
+ }
+ }
+
+ super.setupPage(repositoryName, pageName);
+ }
+
+ protected void addSyndicationDiscoveryLink() {
+ add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(repositoryName,
+ objectId), SyndicationServlet.asLink(getRequest()
+ .getRelativePathPrefixToContextRoot(), repositoryName, objectId, 0)));
}
protected Repository getRepository() {
if (r == null) {
Repository r = GitBlit.self().getRepository(repositoryName);
if (r == null) {
- error("Can not load repository " + repositoryName, true);
+ error(getString("gb.canNotLoadRepository") + " " + repositoryName, true);
return null;
}
this.r = r;
@@ -203,7 +324,13 @@
RepositoryModel model = GitBlit.self().getRepositoryModel(
GitBlitWebSession.get().getUser(), repositoryName);
if (model == null) {
- error("Unauthorized access for repository " + repositoryName, true);
+ if (GitBlit.self().hasRepository(repositoryName)) {
+ // has repository, but unauthorized
+ authenticationError(getString("gb.unauthorizedAccessForRepository") + " " + repositoryName);
+ } else {
+ // does not have repository
+ error(getString("gb.canNotLoadRepository") + " " + repositoryName, true);
+ }
return null;
}
m = model;
@@ -214,49 +341,103 @@
protected RevCommit getCommit() {
RevCommit commit = JGitUtils.getCommit(r, objectId);
if (commit == null) {
- error(MessageFormat.format("Failed to find commit \"{0}\" in {1} for {2} page!",
+ error(MessageFormat.format(getString("gb.failedToFindCommit"),
objectId, repositoryName, getPageName()), true);
}
+ getSubmodules(commit);
return commit;
+ }
+
+ private Map<String, SubmoduleModel> getSubmodules(RevCommit commit) {
+ if (submodules == null) {
+ submodules = new HashMap<String, SubmoduleModel>();
+ for (SubmoduleModel model : JGitUtils.getSubmodules(r, commit.getTree())) {
+ submodules.put(model.path, model);
+ }
+ }
+ return submodules;
+ }
+
+ protected Map<String, SubmoduleModel> getSubmodules() {
+ return submodules;
+ }
+
+ protected SubmoduleModel getSubmodule(String path) {
+ SubmoduleModel model = submodules.get(path);
+ if (model == null) {
+ // undefined submodule?!
+ model = new SubmoduleModel(path.substring(path.lastIndexOf('/') + 1), path, path);
+ model.hasSubmodule = false;
+ model.gitblitPath = model.name;
+ return model;
+ } else {
+ // extract the repository name from the clone url
+ List<String> patterns = GitBlit.getStrings(Keys.git.submoduleUrlPatterns);
+ String submoduleName = StringUtils.extractRepositoryPath(model.url, patterns.toArray(new String[0]));
+
+ // determine the current path for constructing paths relative
+ // to the current repository
+ String currentPath = "";
+ if (repositoryName.indexOf('/') > -1) {
+ currentPath = repositoryName.substring(0, repositoryName.lastIndexOf('/') + 1);
+ }
+
+ // try to locate the submodule repository
+ // prefer bare to non-bare names
+ List<String> candidates = new ArrayList<String>();
+
+ // relative
+ candidates.add(currentPath + StringUtils.stripDotGit(submoduleName));
+ candidates.add(candidates.get(candidates.size() - 1) + ".git");
+
+ // relative, no subfolder
+ if (submoduleName.lastIndexOf('/') > -1) {
+ String name = submoduleName.substring(submoduleName.lastIndexOf('/') + 1);
+ candidates.add(currentPath + StringUtils.stripDotGit(name));
+ candidates.add(currentPath + candidates.get(candidates.size() - 1) + ".git");
+ }
+
+ // absolute
+ candidates.add(StringUtils.stripDotGit(submoduleName));
+ candidates.add(candidates.get(candidates.size() - 1) + ".git");
+
+ // absolute, no subfolder
+ if (submoduleName.lastIndexOf('/') > -1) {
+ String name = submoduleName.substring(submoduleName.lastIndexOf('/') + 1);
+ candidates.add(StringUtils.stripDotGit(name));
+ candidates.add(candidates.get(candidates.size() - 1) + ".git");
+ }
+
+ // create a unique, ordered set of candidate paths
+ Set<String> paths = new LinkedHashSet<String>(candidates);
+ for (String candidate : paths) {
+ if (GitBlit.self().hasRepository(candidate)) {
+ model.hasSubmodule = true;
+ model.gitblitPath = candidate;
+ return model;
+ }
+ }
+
+ // we do not have a copy of the submodule, but we need a path
+ model.gitblitPath = candidates.get(0);
+ return model;
+ }
+ }
+
+ protected String getShortObjectId(String objectId) {
+ return objectId.substring(0, GitBlit.getInteger(Keys.web.shortCommitIdLength, 6));
}
protected void addRefs(Repository r, RevCommit c) {
- add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r)));
+ add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r, getRepositoryModel().showRemoteBranches)));
}
protected void addFullText(String wicketId, String text, boolean substituteRegex) {
- String html = StringUtils.breakLinesForHtml(text);
+ String html = StringUtils.escapeForHtml(text, true);
if (substituteRegex) {
- Map<String, String> map = new HashMap<String, String>();
- // global regex keys
- if (GitBlit.getBoolean(Keys.regex.global, false)) {
- for (String key : GitBlit.getAllKeys(Keys.regex.global)) {
- if (!key.equals(Keys.regex.global)) {
- String subKey = key.substring(key.lastIndexOf('.') + 1);
- map.put(subKey, GitBlit.getString(key, ""));
- }
- }
- }
-
- // repository-specific regex keys
- List<String> keys = GitBlit.getAllKeys(Keys.regex._ROOT + "."
- + repositoryName.toLowerCase());
- for (String key : keys) {
- String subKey = key.substring(key.lastIndexOf('.') + 1);
- map.put(subKey, GitBlit.getString(key, ""));
- }
-
- for (Entry<String, String> entry : map.entrySet()) {
- String definition = entry.getValue().trim();
- String[] chunks = definition.split("!!!");
- if (chunks.length == 2) {
- html = html.replaceAll(chunks[0], chunks[1]);
- } else {
- logger.warn(entry.getKey()
- + " improperly formatted. Use !!! to separate match from replacement: "
- + definition);
- }
- }
+ html = GitBlit.self().processCommitMessage(repositoryName, text);
+ } else {
+ html = StringUtils.breakLinesForHtml(html);
}
add(new Label(wicketId, html).setEscapeModelStrings(false));
}
@@ -264,46 +445,46 @@
protected abstract String getPageName();
protected Component createPersonPanel(String wicketId, PersonIdent identity,
- SearchType searchType) {
+ Constants.SearchType searchType) {
+ String name = identity == null ? "" : identity.getName();
+ String address = identity == null ? "" : identity.getEmailAddress();
boolean showEmail = GitBlit.getBoolean(Keys.web.showEmailAddresses, false);
- if (!showEmail || StringUtils.isEmpty(identity.getName())
- || StringUtils.isEmpty(identity.getEmailAddress())) {
- String value = identity.getName();
+ if (!showEmail || StringUtils.isEmpty(name) || StringUtils.isEmpty(address)) {
+ String value = name;
if (StringUtils.isEmpty(value)) {
if (showEmail) {
- value = identity.getEmailAddress();
+ value = address;
} else {
value = getString("gb.missingUsername");
}
}
Fragment partial = new Fragment(wicketId, "partialPersonIdent", this);
- LinkPanel link = new LinkPanel("personName", "list", value, SearchPage.class,
+ LinkPanel link = new LinkPanel("personName", "list", value, GitSearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType));
setPersonSearchTooltip(link, value, searchType);
partial.add(link);
return partial;
} else {
Fragment fullPerson = new Fragment(wicketId, "fullPersonIdent", this);
- LinkPanel nameLink = new LinkPanel("personName", "list", identity.getName(),
- SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,
- identity.getName(), searchType));
- setPersonSearchTooltip(nameLink, identity.getName(), searchType);
+ LinkPanel nameLink = new LinkPanel("personName", "list", name, GitSearchPage.class,
+ WicketUtils.newSearchParameter(repositoryName, objectId, name, searchType));
+ setPersonSearchTooltip(nameLink, name, searchType);
fullPerson.add(nameLink);
- LinkPanel addressLink = new LinkPanel("personAddress", "list", "<"
- + identity.getEmailAddress() + ">", SearchPage.class,
- WicketUtils.newSearchParameter(repositoryName, objectId,
- identity.getEmailAddress(), searchType));
- setPersonSearchTooltip(addressLink, identity.getEmailAddress(), searchType);
+ LinkPanel addressLink = new LinkPanel("personAddress", "hidden-phone list", "<" + address + ">",
+ GitSearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,
+ address, searchType));
+ setPersonSearchTooltip(addressLink, address, searchType);
fullPerson.add(addressLink);
return fullPerson;
}
}
- protected void setPersonSearchTooltip(Component component, String value, SearchType searchType) {
- if (searchType.equals(SearchType.AUTHOR)) {
+ protected void setPersonSearchTooltip(Component component, String value,
+ Constants.SearchType searchType) {
+ if (searchType.equals(Constants.SearchType.AUTHOR)) {
WicketUtils.setHtmlTooltip(component, getString("gb.searchForAuthor") + " " + value);
- } else if (searchType.equals(SearchType.COMMITTER)) {
+ } else if (searchType.equals(Constants.SearchType.COMMITTER)) {
WicketUtils.setHtmlTooltip(component, getString("gb.searchForCommitter") + " " + value);
}
}
@@ -350,24 +531,29 @@
return WicketUtils.newObjectParameter(repositoryName, commitId);
}
- protected PageParameters newPathParameter(String path) {
- return WicketUtils.newPathParameter(repositoryName, objectId, path);
+ public boolean isShowAdmin() {
+ return showAdmin;
}
-
- private static class SearchForm extends StatelessForm<Void> {
+
+ public boolean isOwner() {
+ return isOwner;
+ }
+
+ private class SearchForm extends SessionlessForm<Void> implements Serializable {
private static final long serialVersionUID = 1L;
private final String repositoryName;
private final IModel<String> searchBoxModel = new Model<String>("");
- private final IModel<SearchType> searchTypeModel = new Model<SearchType>(SearchType.COMMIT);
+ private final IModel<Constants.SearchType> searchTypeModel = new Model<Constants.SearchType>(
+ Constants.SearchType.COMMIT);
public SearchForm(String id, String repositoryName) {
- super(id);
+ super(id, RepositoryPage.this.getClass(), RepositoryPage.this.getPageParameters());
this.repositoryName = repositoryName;
- DropDownChoice<SearchType> searchType = new DropDownChoice<SearchType>("searchType",
- Arrays.asList(SearchType.values()));
+ 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)));
TextField<String> searchBox = new TextField<String>("searchBox", searchBoxModel);
@@ -376,15 +562,19 @@
void setTranslatedAttributes() {
WicketUtils.setHtmlTooltip(get("searchType"), getString("gb.searchTypeTooltip"));
- WicketUtils.setHtmlTooltip(get("searchBox"), getString("gb.searchTooltip"));
+ WicketUtils.setHtmlTooltip(get("searchBox"),
+ MessageFormat.format(getString("gb.searchTooltip"), repositoryName));
WicketUtils.setInputPlaceholder(get("searchBox"), getString("gb.search"));
}
@Override
public void onSubmit() {
- SearchType searchType = searchTypeModel.getObject();
+ Constants.SearchType searchType = searchTypeModel.getObject();
String searchString = searchBoxModel.getObject();
- for (SearchType type : SearchType.values()) {
+ if (searchString == null) {
+ return;
+ }
+ for (Constants.SearchType type : Constants.SearchType.values()) {
if (searchString.toLowerCase().startsWith(type.name().toLowerCase() + ":")) {
searchType = type;
searchString = searchString.substring(type.name().toLowerCase().length() + 1)
@@ -392,8 +582,19 @@
break;
}
}
- setResponsePage(SearchPage.class,
- WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType));
+ Class<? extends BasePage> searchPageClass = GitSearchPage.class;
+ RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
+ if (GitBlit.getBoolean(Keys.web.allowLuceneIndexing, true)
+ && !ArrayUtils.isEmpty(model.indexedBranches)) {
+ // this repository is Lucene-indexed
+ searchPageClass = LuceneSearchPage.class;
+ }
+ // 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);
+ getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
}
}
-}
+}
--
Gitblit v1.9.1