diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index ace1d44d413fc925f1a549f3882a51c25b12bc9a..ccf17cf176381bfb0355fd7d36f7b04b4e1ccd28 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -684,13 +684,28 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas String n = en.nextElement(); if(n.startsWith("plugin.")) { n = n.substring(7); - if (n.indexOf(".") > 0) { - String[] pluginInfo = n.split("\\."); - UpdateSite.Plugin p = Jenkins.getInstance().getUpdateCenter().getById(pluginInfo[1]).getPlugin(pluginInfo[0]); - if(p==null) - throw new Failure("No such plugin: "+n); - p.deploy(dynamicLoad); + // JENKINS-22080 plugin names can contain '.' as could (according to rumour) update sites + int index = n.indexOf('.'); + UpdateSite.Plugin p = null; + while (index != -1) { + if (index + 1 >= n.length()) { + break; + } + String pluginName = n.substring(0, index); + String siteName = n.substring(index + 1); + UpdateSite updateSite = Jenkins.getInstance().getUpdateCenter().getById(siteName); + if (siteName != null) { + if (p != null) { + throw new Failure("Ambiguous plugin: " + n); + } + p = updateSite.getPlugin(pluginName); + } + index = n.indexOf('.', index + 1); + } + if (p == null) { + throw new Failure("No such plugin: " + n); } + p.deploy(dynamicLoad); } } rsp.sendRedirect("../updateCenter/");