diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 50c115a850..1d285059e9 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -1824,8 +1824,8 @@ public class Functions { */ public static String breakableString(final String plain) { - return plain.replaceAll("(\\p{Punct}+\\w)", "$1") - .replaceAll("(\\w{10})(?=\\w{3})", "$1") + return plain.replaceAll("([\\p{Punct}&&[^;]]+\\w)", "$1") + .replaceAll("([^\\p{Punct}\\s-]{10})(?=[^\\p{Punct}\\s-]{3})", "$1") ; } diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 8d13742cac..a35cce9240 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -291,9 +291,26 @@ public class FunctionsTest { @Test public void testBreakableString() { - assertEquals("Hello world!", Functions.breakableString("Hello world!")); - assertEquals("H,e.l/l:o-w_o=+|d", Functions.breakableString("H,e.l/l:o-w_o=+|d")); - assertEquals("ALongStringThatCanNotBeBrokenByDefault", Functions.breakableString("ALongStringThatCanNotBeBrokenByDefault")); + assertBrokenAs("Hello world!", "Hello world!"); + assertBrokenAs("Hello-world!", "Hello", "-world!"); + assertBrokenAs("ALongStringThatCanNotBeBrokenByDefault", "ALongStrin", "gThatCanNo", "tBeBrokenB", "yDefault"); + assertBrokenAs("jenkins_main_trunk", "jenkins", "_main", "_trunk"); + + assertBrokenAs("<<<<<", "", "<", "<", "<", "<", "<"); + assertBrokenAs("&&&&&", "", "&", "&", "&", "&", "&"); + assertBrokenAs("ϑϑϑ", "", "ϑ", "ϑ", "ϑ"); + assertBrokenAs("Crazy <ha ha>", "Crazy ", "<ha ha", ">"); + assertBrokenAs("A;String>Full]Of)Weird}Punctuation", "A;String", ">Full", "]Of", ")Weird", "}Punctuation"); + assertBrokenAs("<<a<bc<def<ghi<", "", "<", "<a", "<bc", "<def", "<ghi", "<"); + assertBrokenAs("H,e.l/l:o=w_o+|d", "H", ",e", ".l", "/l", ":o", "=w", "_o", "+|d"); + assertBrokenAs("a¶‱ﻷa¶‱ﻷa¶‱ﻷa¶‱ﻷa¶‱ﻷa¶‱ﻷa¶‱ﻷa¶‱ﻷ", "a¶‱ﻷa¶‱ﻷa¶", "‱ﻷa¶‱ﻷa¶‱ﻷ", "a¶‱ﻷa¶‱ﻷa¶‱ﻷ"); + } + + private void assertBrokenAs(String plain, String... chunks) { + assertEquals( + Util.join(Arrays.asList(chunks), ""), + Functions.breakableString(plain) + ); } @Bug(20800)