Well-known problem: https://issues.jenkins-ci.org/browse/JENKINS-18364
Also: https://issues.jenkins-ci.org/browse/JENKINS-20052 Alas the current behavior of ListView.getAllItems is not at all adequately tested, given the interacting possibilities of · explicitly listed items · recursive views · item regexps · status filtering · ViewJobFilter’s, which can · remove otherwise visible items · add otherwise unmentioned or excluded items · depend on, or even countermand, other filters so making casual changes before a full test suite has been written would be unwise. Regarding the immediate problem, which is the excessive calls to getRelativeLinkTo, I am wondering whether as I suggested in https://issues.jenkins-ci.org/browse/JENKINS-19310 it would not be better to abandon ${jobBaseURL} and the complex code which generates relative links, always emitting absolute links (that is, absolute within the server: ${rootURL}/${item.url}), using something similar to AbstractItem.getUrl to automatically include the current (Ancestor) view in the link where applicable (so /jenkins/job/someFolder/view/currentView/job/includedJob/). Alternately, just hack getRelativeLinkTo to not call View.getItems at all, and produce a URL under the assumption that the item is in the ancestor view. Even if it were not, it would not actually matter unless a View subclass overrode getItem(String) to verify that the named item was a member—the default implementation does not do so, and ListView does not override it. In other words, see if the following helps and introduces no obvious problem: diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 4899606..3326e66 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -1014,25 +1014,14 @@ public class Functions { Item i=p; String url = ""; - Collection<TopLevelItem> viewItems; - if (view != null) { - viewItems = view.getItems(); - } else { - viewItems = Collections.emptyList(); - } while(true) { ItemGroup ig = i.getParent(); url = i.getShortUrl()+url; if(ig== Jenkins.getInstance() || (view != null && ig == view.getOwnerItemGroup())) { assert i instanceof TopLevelItem; - if(viewItems.contains((TopLevelItem)i)) { - // if p and the current page belongs to the same view, then return a relative path - return normalizeURI(ancestors.get(view)+'/'+url); - } else { - // otherwise return a path from the root Hudson - return normalizeURI(request.getContextPath()+'/'+p.getUrl()); - } + // assume p and the current page belong to the same view, so return a relative path + return normalizeURI(ancestors.get(view)+'/'+url); } path = ancestors.get(ig); diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index a35cce9..c6ee303 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -42,6 +42,7 @@ import java.util.logging.LogRecord; import jenkins.model.Jenkins; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.jvnet.hudson.test.Bug; @@ -135,6 +136,7 @@ public class FunctionsTest { assertEquals("job/i/", result); } + @Ignore("too expensive to make it correct") @Test @PrepareForTest({Stapler.class, Jenkins.class}) public void testGetRelativeLinkTo_JobNotContainedInView() throws Exception{ -- You received this message because you are subscribed to the Google Groups "Jenkins Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
