You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RepositoryPage.java 22KB

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
13 years ago
13 years ago
11 years ago
11 years ago
11 years ago
13 years ago
13 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket.pages;
  17. import java.io.Serializable;
  18. import java.text.MessageFormat;
  19. import java.util.ArrayList;
  20. import java.util.Arrays;
  21. import java.util.HashMap;
  22. import java.util.LinkedHashMap;
  23. import java.util.LinkedHashSet;
  24. import java.util.List;
  25. import java.util.Map;
  26. import java.util.Set;
  27. import org.apache.wicket.Component;
  28. import org.apache.wicket.PageParameters;
  29. import org.apache.wicket.RedirectException;
  30. import org.apache.wicket.markup.html.basic.Label;
  31. import org.apache.wicket.markup.html.form.DropDownChoice;
  32. import org.apache.wicket.markup.html.form.TextField;
  33. import org.apache.wicket.markup.html.link.ExternalLink;
  34. import org.apache.wicket.markup.html.link.Link;
  35. import org.apache.wicket.markup.html.panel.Fragment;
  36. import org.apache.wicket.model.IModel;
  37. import org.apache.wicket.model.Model;
  38. import org.apache.wicket.protocol.http.RequestUtils;
  39. import org.apache.wicket.request.target.basic.RedirectRequestTarget;
  40. import org.eclipse.jgit.diff.DiffEntry.ChangeType;
  41. import org.eclipse.jgit.lib.PersonIdent;
  42. import org.eclipse.jgit.lib.Repository;
  43. import org.eclipse.jgit.revwalk.RevCommit;
  44. import com.gitblit.Constants;
  45. import com.gitblit.GitBlit;
  46. import com.gitblit.Keys;
  47. import com.gitblit.PagesServlet;
  48. import com.gitblit.SyndicationServlet;
  49. import com.gitblit.models.ProjectModel;
  50. import com.gitblit.models.RepositoryModel;
  51. import com.gitblit.models.SubmoduleModel;
  52. import com.gitblit.models.UserModel;
  53. import com.gitblit.utils.ArrayUtils;
  54. import com.gitblit.utils.JGitUtils;
  55. import com.gitblit.utils.StringUtils;
  56. import com.gitblit.utils.TicgitUtils;
  57. import com.gitblit.wicket.GitBlitWebSession;
  58. import com.gitblit.wicket.PageRegistration;
  59. import com.gitblit.wicket.PageRegistration.OtherPageLink;
  60. import com.gitblit.wicket.SessionlessForm;
  61. import com.gitblit.wicket.WicketUtils;
  62. import com.gitblit.wicket.panels.BasePanel.JavascriptEventConfirmation;
  63. import com.gitblit.wicket.panels.LinkPanel;
  64. import com.gitblit.wicket.panels.NavigationPanel;
  65. import com.gitblit.wicket.panels.RefsPanel;
  66. public abstract class RepositoryPage extends BasePage {
  67. protected final String projectName;
  68. protected final String repositoryName;
  69. protected final String objectId;
  70. private transient Repository r;
  71. private RepositoryModel m;
  72. private Map<String, SubmoduleModel> submodules;
  73. private final Map<String, PageRegistration> registeredPages;
  74. private boolean showAdmin;
  75. private boolean isOwner;
  76. public RepositoryPage(PageParameters params) {
  77. super(params);
  78. repositoryName = WicketUtils.getRepositoryName(params);
  79. String root =StringUtils.getFirstPathElement(repositoryName);
  80. if (StringUtils.isEmpty(root)) {
  81. projectName = GitBlit.getString(Keys.web.repositoryRootGroupName, "main");
  82. } else {
  83. projectName = root;
  84. }
  85. objectId = WicketUtils.getObject(params);
  86. if (StringUtils.isEmpty(repositoryName)) {
  87. error(MessageFormat.format(getString("gb.repositoryNotSpecifiedFor"), getPageName()), true);
  88. }
  89. if (!getRepositoryModel().hasCommits) {
  90. setResponsePage(EmptyRepositoryPage.class, params);
  91. }
  92. // register the available page links for this page and user
  93. registeredPages = registerPages();
  94. // standard page links
  95. List<PageRegistration> pages = new ArrayList<PageRegistration>(registeredPages.values());
  96. NavigationPanel navigationPanel = new NavigationPanel("navPanel", getClass(), pages);
  97. add(navigationPanel);
  98. add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest()
  99. .getRelativePathPrefixToContextRoot(), repositoryName, null, 0)));
  100. // add floating search form
  101. SearchForm searchForm = new SearchForm("searchForm", repositoryName);
  102. add(searchForm);
  103. searchForm.setTranslatedAttributes();
  104. // set stateless page preference
  105. setStatelessHint(true);
  106. }
  107. private Map<String, PageRegistration> registerPages() {
  108. PageParameters params = null;
  109. if (!StringUtils.isEmpty(repositoryName)) {
  110. params = WicketUtils.newRepositoryParameter(repositoryName);
  111. }
  112. Map<String, PageRegistration> pages = new LinkedHashMap<String, PageRegistration>();
  113. // standard links
  114. pages.put("repositories", new PageRegistration("gb.repositories", RepositoriesPage.class));
  115. pages.put("summary", new PageRegistration("gb.summary", SummaryPage.class, params));
  116. pages.put("log", new PageRegistration("gb.log", LogPage.class, params));
  117. pages.put("branches", new PageRegistration("gb.branches", BranchesPage.class, params));
  118. pages.put("tags", new PageRegistration("gb.tags", TagsPage.class, params));
  119. pages.put("tree", new PageRegistration("gb.tree", TreePage.class, params));
  120. // conditional links
  121. Repository r = getRepository();
  122. RepositoryModel model = getRepositoryModel();
  123. // forks list button
  124. if (StringUtils.isEmpty(model.originRepository)) {
  125. if (!ArrayUtils.isEmpty(model.forks)) {
  126. // this origin repository has forks
  127. pages.put("forks", new PageRegistration("gb.forks", ForksPage.class, params));
  128. }
  129. } else {
  130. // this is a fork of another repository
  131. pages.put("forks", new PageRegistration("gb.forks", ForksPage.class, params));
  132. }
  133. // per-repository extra page links
  134. if (model.useTickets && TicgitUtils.getTicketsBranch(r) != null) {
  135. pages.put("tickets", new PageRegistration("gb.tickets", TicketsPage.class, params));
  136. }
  137. if (model.useDocs) {
  138. pages.put("docs", new PageRegistration("gb.docs", DocsPage.class, params));
  139. }
  140. if (JGitUtils.getPagesBranch(r) != null) {
  141. OtherPageLink pagesLink = new OtherPageLink("gb.pages", PagesServlet.asLink(
  142. getRequest().getRelativePathPrefixToContextRoot(), repositoryName, null));
  143. pages.put("pages", pagesLink);
  144. }
  145. // Conditionally add edit link
  146. showAdmin = false;
  147. if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
  148. boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
  149. showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
  150. } else {
  151. showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
  152. }
  153. isOwner = GitBlitWebSession.get().isLoggedIn()
  154. && (model.owner != null && model.owner.equalsIgnoreCase(GitBlitWebSession.get()
  155. .getUsername()));
  156. if (showAdmin || isOwner) {
  157. pages.put("edit", new PageRegistration("gb.edit", EditRepositoryPage.class, params));
  158. }
  159. return pages;
  160. }
  161. @Override
  162. protected void setupPage(String repositoryName, String pageName) {
  163. String projectName = StringUtils.getFirstPathElement(repositoryName);
  164. ProjectModel project = GitBlit.self().getProjectModel(projectName);
  165. if (project.isUserProject()) {
  166. // user-as-project
  167. add(new LinkPanel("projectTitle", null, project.getDisplayName(),
  168. UserPage.class, WicketUtils.newUsernameParameter(project.name.substring(1))));
  169. } else {
  170. // project
  171. add(new LinkPanel("projectTitle", null, project.name,
  172. ProjectPage.class, WicketUtils.newProjectParameter(project.name)));
  173. }
  174. String name = StringUtils.stripDotGit(repositoryName);
  175. if (!StringUtils.isEmpty(projectName) && name.startsWith(projectName)) {
  176. name = name.substring(projectName.length() + 1);
  177. }
  178. add(new LinkPanel("repositoryName", null, name, SummaryPage.class,
  179. WicketUtils.newRepositoryParameter(repositoryName)));
  180. add(new Label("pageName", pageName).setRenderBodyOnly(true));
  181. // indicate origin repository
  182. RepositoryModel model = getRepositoryModel();
  183. if (StringUtils.isEmpty(model.originRepository)) {
  184. add(new Label("originRepository").setVisible(false));
  185. } else {
  186. Fragment forkFrag = new Fragment("originRepository", "originFragment", this);
  187. forkFrag.add(new LinkPanel("originRepository", null, StringUtils.stripDotGit(model.originRepository),
  188. SummaryPage.class, WicketUtils.newRepositoryParameter(model.originRepository)));
  189. add(forkFrag);
  190. }
  191. if (getRepositoryModel().isBare) {
  192. add(new Label("workingCopyIndicator").setVisible(false));
  193. } else {
  194. Fragment wc = new Fragment("workingCopyIndicator", "workingCopyFragment", this);
  195. Label lbl = new Label("workingCopy", getString("gb.workingCopy"));
  196. WicketUtils.setHtmlTooltip(lbl, getString("gb.workingCopyWarning"));
  197. wc.add(lbl);
  198. add(wc);
  199. }
  200. if (getRepositoryModel().allowForks) {
  201. add(new Label("forksProhibitedIndicator").setVisible(false));
  202. } else {
  203. Fragment wc = new Fragment("forksProhibitedIndicator", "forksProhibitedFragment", this);
  204. Label lbl = new Label("forksProhibited", getString("gb.forksProhibited"));
  205. WicketUtils.setHtmlTooltip(lbl, getString("gb.forksProhibitedWarning"));
  206. wc.add(lbl);
  207. add(wc);
  208. }
  209. UserModel user = GitBlitWebSession.get().getUser();
  210. // fork button
  211. if (user != null) {
  212. final String clonedRepo = MessageFormat.format("~{0}/{1}.git", user.username, StringUtils.stripDotGit(StringUtils.getLastPathElement(model.name)));
  213. boolean hasClone = GitBlit.self().hasRepository(clonedRepo) && !getRepositoryModel().name.equals(clonedRepo);
  214. if (user.canForkRepository(model) && !hasClone) {
  215. Link<Void> forkLink = new Link<Void>("forkLink") {
  216. private static final long serialVersionUID = 1L;
  217. @Override
  218. public void onClick() {
  219. RepositoryModel model = getRepositoryModel();
  220. if (GitBlit.self().fork(model, GitBlitWebSession.get().getUser())) {
  221. throw new RedirectException(SummaryPage.class, WicketUtils.newRepositoryParameter(clonedRepo));
  222. } else {
  223. error(MessageFormat.format(getString("gb.repositoryForkFailed"), model));
  224. }
  225. }
  226. };
  227. forkLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
  228. getString("gb.forkRepository"), getRepositoryModel())));
  229. add(forkLink);
  230. } else {
  231. // user not allowed to fork or fork already exists or repo forbids forking
  232. add(new ExternalLink("forkLink", "").setVisible(false));
  233. }
  234. if (hasClone) {
  235. // user has clone
  236. String url = getRequestCycle().urlFor(SummaryPage.class, WicketUtils.newRepositoryParameter(clonedRepo)).toString();
  237. add(new ExternalLink("myForkLink", url));
  238. } else {
  239. // user does not have clone
  240. add(new ExternalLink("myForkLink", "").setVisible(false));
  241. }
  242. } else {
  243. // server prohibits forking
  244. add(new ExternalLink("forkLink", "").setVisible(false));
  245. add(new ExternalLink("myForkLink", "").setVisible(false));
  246. }
  247. super.setupPage(repositoryName, pageName);
  248. }
  249. protected void addSyndicationDiscoveryLink() {
  250. add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(repositoryName,
  251. objectId), SyndicationServlet.asLink(getRequest()
  252. .getRelativePathPrefixToContextRoot(), repositoryName, objectId, 0)));
  253. }
  254. protected Repository getRepository() {
  255. if (r == null) {
  256. Repository r = GitBlit.self().getRepository(repositoryName);
  257. if (r == null) {
  258. error(getString("gb.canNotLoadRepository") + " " + repositoryName, true);
  259. return null;
  260. }
  261. this.r = r;
  262. }
  263. return r;
  264. }
  265. protected RepositoryModel getRepositoryModel() {
  266. if (m == null) {
  267. RepositoryModel model = GitBlit.self().getRepositoryModel(
  268. GitBlitWebSession.get().getUser(), repositoryName);
  269. if (model == null) {
  270. if (GitBlit.self().hasRepository(repositoryName)) {
  271. // has repository, but unauthorized
  272. authenticationError(getString("gb.unauthorizedAccessForRepository") + " " + repositoryName);
  273. } else {
  274. // does not have repository
  275. error(getString("gb.canNotLoadRepository") + " " + repositoryName, true);
  276. }
  277. return null;
  278. }
  279. m = model;
  280. }
  281. return m;
  282. }
  283. protected RevCommit getCommit() {
  284. RevCommit commit = JGitUtils.getCommit(r, objectId);
  285. if (commit == null) {
  286. error(MessageFormat.format(getString("gb.failedToFindCommit"),
  287. objectId, repositoryName, getPageName()), true);
  288. }
  289. getSubmodules(commit);
  290. return commit;
  291. }
  292. private Map<String, SubmoduleModel> getSubmodules(RevCommit commit) {
  293. if (submodules == null) {
  294. submodules = new HashMap<String, SubmoduleModel>();
  295. for (SubmoduleModel model : JGitUtils.getSubmodules(r, commit.getTree())) {
  296. submodules.put(model.path, model);
  297. }
  298. }
  299. return submodules;
  300. }
  301. protected Map<String, SubmoduleModel> getSubmodules() {
  302. return submodules;
  303. }
  304. protected SubmoduleModel getSubmodule(String path) {
  305. SubmoduleModel model = submodules.get(path);
  306. if (model == null) {
  307. // undefined submodule?!
  308. model = new SubmoduleModel(path.substring(path.lastIndexOf('/') + 1), path, path);
  309. model.hasSubmodule = false;
  310. model.gitblitPath = model.name;
  311. return model;
  312. } else {
  313. // extract the repository name from the clone url
  314. List<String> patterns = GitBlit.getStrings(Keys.git.submoduleUrlPatterns);
  315. String submoduleName = StringUtils.extractRepositoryPath(model.url, patterns.toArray(new String[0]));
  316. // determine the current path for constructing paths relative
  317. // to the current repository
  318. String currentPath = "";
  319. if (repositoryName.indexOf('/') > -1) {
  320. currentPath = repositoryName.substring(0, repositoryName.lastIndexOf('/') + 1);
  321. }
  322. // try to locate the submodule repository
  323. // prefer bare to non-bare names
  324. List<String> candidates = new ArrayList<String>();
  325. // relative
  326. candidates.add(currentPath + StringUtils.stripDotGit(submoduleName));
  327. candidates.add(candidates.get(candidates.size() - 1) + ".git");
  328. // relative, no subfolder
  329. if (submoduleName.lastIndexOf('/') > -1) {
  330. String name = submoduleName.substring(submoduleName.lastIndexOf('/') + 1);
  331. candidates.add(currentPath + StringUtils.stripDotGit(name));
  332. candidates.add(currentPath + candidates.get(candidates.size() - 1) + ".git");
  333. }
  334. // absolute
  335. candidates.add(StringUtils.stripDotGit(submoduleName));
  336. candidates.add(candidates.get(candidates.size() - 1) + ".git");
  337. // absolute, no subfolder
  338. if (submoduleName.lastIndexOf('/') > -1) {
  339. String name = submoduleName.substring(submoduleName.lastIndexOf('/') + 1);
  340. candidates.add(StringUtils.stripDotGit(name));
  341. candidates.add(candidates.get(candidates.size() - 1) + ".git");
  342. }
  343. // create a unique, ordered set of candidate paths
  344. Set<String> paths = new LinkedHashSet<String>(candidates);
  345. for (String candidate : paths) {
  346. if (GitBlit.self().hasRepository(candidate)) {
  347. model.hasSubmodule = true;
  348. model.gitblitPath = candidate;
  349. return model;
  350. }
  351. }
  352. // we do not have a copy of the submodule, but we need a path
  353. model.gitblitPath = candidates.get(0);
  354. return model;
  355. }
  356. }
  357. protected String getShortObjectId(String objectId) {
  358. return objectId.substring(0, 8);
  359. }
  360. protected void addRefs(Repository r, RevCommit c) {
  361. add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r, getRepositoryModel().showRemoteBranches)));
  362. }
  363. protected void addFullText(String wicketId, String text, boolean substituteRegex) {
  364. String html = StringUtils.escapeForHtml(text, true);
  365. if (substituteRegex) {
  366. html = GitBlit.self().processCommitMessage(repositoryName, text);
  367. } else {
  368. html = StringUtils.breakLinesForHtml(html);
  369. }
  370. add(new Label(wicketId, html).setEscapeModelStrings(false));
  371. }
  372. protected abstract String getPageName();
  373. protected Component createPersonPanel(String wicketId, PersonIdent identity,
  374. Constants.SearchType searchType) {
  375. String name = identity == null ? "" : identity.getName();
  376. String address = identity == null ? "" : identity.getEmailAddress();
  377. boolean showEmail = GitBlit.getBoolean(Keys.web.showEmailAddresses, false);
  378. if (!showEmail || StringUtils.isEmpty(name) || StringUtils.isEmpty(address)) {
  379. String value = name;
  380. if (StringUtils.isEmpty(value)) {
  381. if (showEmail) {
  382. value = address;
  383. } else {
  384. value = getString("gb.missingUsername");
  385. }
  386. }
  387. Fragment partial = new Fragment(wicketId, "partialPersonIdent", this);
  388. LinkPanel link = new LinkPanel("personName", "list", value, GitSearchPage.class,
  389. WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType));
  390. setPersonSearchTooltip(link, value, searchType);
  391. partial.add(link);
  392. return partial;
  393. } else {
  394. Fragment fullPerson = new Fragment(wicketId, "fullPersonIdent", this);
  395. LinkPanel nameLink = new LinkPanel("personName", "list", name, GitSearchPage.class,
  396. WicketUtils.newSearchParameter(repositoryName, objectId, name, searchType));
  397. setPersonSearchTooltip(nameLink, name, searchType);
  398. fullPerson.add(nameLink);
  399. LinkPanel addressLink = new LinkPanel("personAddress", "hidden-phone list", "<" + address + ">",
  400. GitSearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,
  401. address, searchType));
  402. setPersonSearchTooltip(addressLink, address, searchType);
  403. fullPerson.add(addressLink);
  404. return fullPerson;
  405. }
  406. }
  407. protected void setPersonSearchTooltip(Component component, String value,
  408. Constants.SearchType searchType) {
  409. if (searchType.equals(Constants.SearchType.AUTHOR)) {
  410. WicketUtils.setHtmlTooltip(component, getString("gb.searchForAuthor") + " " + value);
  411. } else if (searchType.equals(Constants.SearchType.COMMITTER)) {
  412. WicketUtils.setHtmlTooltip(component, getString("gb.searchForCommitter") + " " + value);
  413. }
  414. }
  415. protected void setChangeTypeTooltip(Component container, ChangeType type) {
  416. switch (type) {
  417. case ADD:
  418. WicketUtils.setHtmlTooltip(container, getString("gb.addition"));
  419. break;
  420. case COPY:
  421. case RENAME:
  422. WicketUtils.setHtmlTooltip(container, getString("gb.rename"));
  423. break;
  424. case DELETE:
  425. WicketUtils.setHtmlTooltip(container, getString("gb.deletion"));
  426. break;
  427. case MODIFY:
  428. WicketUtils.setHtmlTooltip(container, getString("gb.modification"));
  429. break;
  430. }
  431. }
  432. @Override
  433. protected void onBeforeRender() {
  434. // dispose of repository object
  435. if (r != null) {
  436. r.close();
  437. r = null;
  438. }
  439. // setup page header and footer
  440. setupPage(repositoryName, "/ " + getPageName());
  441. super.onBeforeRender();
  442. }
  443. protected PageParameters newRepositoryParameter() {
  444. return WicketUtils.newRepositoryParameter(repositoryName);
  445. }
  446. protected PageParameters newCommitParameter() {
  447. return WicketUtils.newObjectParameter(repositoryName, objectId);
  448. }
  449. protected PageParameters newCommitParameter(String commitId) {
  450. return WicketUtils.newObjectParameter(repositoryName, commitId);
  451. }
  452. public boolean isShowAdmin() {
  453. return showAdmin;
  454. }
  455. public boolean isOwner() {
  456. return isOwner;
  457. }
  458. private class SearchForm extends SessionlessForm<Void> implements Serializable {
  459. private static final long serialVersionUID = 1L;
  460. private final String repositoryName;
  461. private final IModel<String> searchBoxModel = new Model<String>("");
  462. private final IModel<Constants.SearchType> searchTypeModel = new Model<Constants.SearchType>(
  463. Constants.SearchType.COMMIT);
  464. public SearchForm(String id, String repositoryName) {
  465. super(id, RepositoryPage.this.getClass(), RepositoryPage.this.getPageParameters());
  466. this.repositoryName = repositoryName;
  467. DropDownChoice<Constants.SearchType> searchType = new DropDownChoice<Constants.SearchType>(
  468. "searchType", Arrays.asList(Constants.SearchType.values()));
  469. searchType.setModel(searchTypeModel);
  470. add(searchType.setVisible(GitBlit.getBoolean(Keys.web.showSearchTypeSelection, false)));
  471. TextField<String> searchBox = new TextField<String>("searchBox", searchBoxModel);
  472. add(searchBox);
  473. }
  474. void setTranslatedAttributes() {
  475. WicketUtils.setHtmlTooltip(get("searchType"), getString("gb.searchTypeTooltip"));
  476. WicketUtils.setHtmlTooltip(get("searchBox"),
  477. MessageFormat.format(getString("gb.searchTooltip"), repositoryName));
  478. WicketUtils.setInputPlaceholder(get("searchBox"), getString("gb.search"));
  479. }
  480. @Override
  481. public void onSubmit() {
  482. Constants.SearchType searchType = searchTypeModel.getObject();
  483. String searchString = searchBoxModel.getObject();
  484. if (searchString == null) {
  485. return;
  486. }
  487. for (Constants.SearchType type : Constants.SearchType.values()) {
  488. if (searchString.toLowerCase().startsWith(type.name().toLowerCase() + ":")) {
  489. searchType = type;
  490. searchString = searchString.substring(type.name().toLowerCase().length() + 1)
  491. .trim();
  492. break;
  493. }
  494. }
  495. Class<? extends BasePage> searchPageClass = GitSearchPage.class;
  496. RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
  497. if (GitBlit.getBoolean(Keys.web.allowLuceneIndexing, true)
  498. && !ArrayUtils.isEmpty(model.indexedBranches)) {
  499. // this repository is Lucene-indexed
  500. searchPageClass = LuceneSearchPage.class;
  501. }
  502. // use an absolute url to workaround Wicket-Tomcat problems with
  503. // mounted url parameters (issue-111)
  504. PageParameters params = WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType);
  505. String relativeUrl = urlFor(searchPageClass, params).toString();
  506. String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
  507. getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
  508. }
  509. }
  510. }