diff --git a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/Configuration.java b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/Configuration.java index 11ecca956f5..ad28426c791 100644 --- a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/Configuration.java +++ b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/Configuration.java @@ -291,6 +291,12 @@ public final class Configuration { */ private boolean navigateWindowEnabled; + /** + * If true, redirect to a single result when a single search result is found. + */ + private boolean redirectOnSingleSearchResult; + + private SuggesterConfig suggesterConfig = new SuggesterConfig(); private StatsdConfig statsdConfig = new StatsdConfig(); @@ -604,6 +610,7 @@ public Configuration() { setQuickContextScan(true); //below can cause an outofmemory error, since it is defaulting to NO LIMIT setRamBufferSize(DEFAULT_RAM_BUFFER_SIZE); //MB + setRedirectOnSingleSearchResult(true); setRemoteScmSupported(RemoteSCM.OFF); setRepositories(new ArrayList<>()); setReviewPattern("\\b(\\d{4}/\\d{3})\\b"); // in form e.g. PSARC 2008/305 @@ -1234,6 +1241,14 @@ public void setDisplayRepositories(boolean flag) { this.displayRepositories = flag; } + public boolean isRedirectOnSingleSearchResult() { + return redirectOnSingleSearchResult; + } + + public void setRedirectOnSingleSearchResult(boolean flag) { + this.redirectOnSingleSearchResult = flag; + } + public boolean getListDirsFirst() { return listDirsFirst; } diff --git a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/RuntimeEnvironment.java b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/RuntimeEnvironment.java index 941eee11f87..1c087bbf547 100644 --- a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/RuntimeEnvironment.java +++ b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/RuntimeEnvironment.java @@ -1437,6 +1437,14 @@ public void setDisplayRepositories(boolean displayRepositories) { syncWriteConfiguration(displayRepositories, Configuration::setDisplayRepositories); } + public boolean isRedirectOnSingleSearchResult() { + return syncReadConfiguration(Configuration::isRedirectOnSingleSearchResult); + } + + public void setRedirectOnSingleSearchResult(boolean redirectOnSingleSearchResult) { + syncWriteConfiguration(redirectOnSingleSearchResult, Configuration::setRedirectOnSingleSearchResult); + } + public boolean getListDirsFirst() { return syncReadConfiguration(Configuration::getListDirsFirst); } diff --git a/opengrok-web/src/main/java/org/opengrok/web/PageConfig.java b/opengrok-web/src/main/java/org/opengrok/web/PageConfig.java index a821834eb4c..c68e5dcf59e 100644 --- a/opengrok-web/src/main/java/org/opengrok/web/PageConfig.java +++ b/opengrok-web/src/main/java/org/opengrok/web/PageConfig.java @@ -1520,7 +1520,12 @@ public SearchHelper prepareSearch() { * @return a search helper. */ public SearchHelper prepareInternalSearch(SortOrder sortOrder) { + boolean isRedirectOnSingleSearchResult = getEnv().isRedirectOnSingleSearchResult(); String xrValue = req.getParameter(QueryParameters.NO_REDIRECT_PARAM); + if (xrValue != null && !xrValue.isEmpty()) { + isRedirectOnSingleSearchResult = false; + } + return new SearchHelper.Builder(getDataRoot(), new File(getSourceRootPath()), getEftarReader(), getQueryBuilder(), req.getContextPath()) .start(getStartIndex()) @@ -1528,7 +1533,7 @@ public SearchHelper prepareInternalSearch(SortOrder sortOrder) { .maxItems(getMaxItems()) .crossRefSearch(getPrefix() == Prefix.SEARCH_R) .guiSearch(getPrefix() == Prefix.SEARCH_R || getPrefix() == Prefix.SEARCH_P) - .noRedirect(xrValue != null && !xrValue.isEmpty()) + .noRedirect(!isRedirectOnSingleSearchResult) .build(); }