From 5ecbbefb6d83fbc4c8919b94b33f491fa0e0055f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 14 May 2013 20:15:07 -0400 Subject: [PATCH] [FIXED JENKINS-16652] Use UpdateSite.Plugin.deploy from PluginManager.doUploadPlugin. --- changelog.html | 3 +++ core/src/main/java/hudson/PluginManager.java | 24 +++++++++---------- .../main/java/hudson/model/UpdateCenter.java | 8 +++++++ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/changelog.html b/changelog.html index a69e93874a..f6df70719e 100644 --- a/changelog.html +++ b/changelog.html @@ -58,6 +58,9 @@ Upcoming changes
  • NPE from Run.getDynamic. (issue 17935) +
  • + Reworked Upload Plugin gesture to work more like installation from an update center, and in particular to support dynamic load. + (issue 16652)
  • Errors in init.groovy halted startup; changed to just log a warning. (issue 17933) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 3ef1a3ab06..b2aa0e59da 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -732,25 +732,23 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } // first copy into a temporary file name - File t = File.createTempFile("uploaded", "jp_",rootDir); - fileItem.write(t); // rename all new plugins to *.jpi + File t = File.createTempFile("uploaded", ".jpi"); + t.deleteOnExit(); + fileItem.write(t); fileItem.delete(); final String baseName = identifyPluginShortName(t); - // and move the temp file into a proper name - new File(rootDir, baseName + ".hpi").delete(); // don't keep confusing legacy *.hpi - new File(rootDir, baseName + ".jpi").delete(); // rename can fail if the file already exists - t.renameTo(new File(rootDir, baseName + ".jpi")); - - PluginWrapper existing = getPlugin(baseName); - if (existing!=null && existing.isBundled){ - existing.doPin(); - } - pluginUploaded = true; - return new HttpRedirect("."); + // Now create a dummy plugin that we can dynamically load (the InstallationJob will force a restart if one is needed): + JSONObject cfg = new JSONObject(). + element("name", baseName). + element("version", "0"). // unused but mandatory + element("url", t.toURI().toString()). + element("dependencies", new JSONArray()); + new UpdateSite(UpdateCenter.ID_UPLOAD, null).new Plugin(UpdateCenter.ID_UPLOAD, cfg).deploy(true); + return new HttpRedirect("../updateCenter"); } catch (IOException e) { throw e; } catch (Exception e) {// grrr. fileItem.write throws this diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index 7e874ea6de..b8fe591b9f 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -89,6 +89,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckForNull; import org.acegisecurity.context.SecurityContextHolder; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -119,6 +121,9 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas * @since 1.483 */ public static final String ID_DEFAULT = "default"; + + @Restricted(NoExternalUse.class) + public static final String ID_UPLOAD = "_upload"; /** * {@link ExecutorService} that performs installation. @@ -1012,6 +1017,9 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } public void run() { + if (ID_UPLOAD.equals(site.getId())) { + return; + } LOGGER.fine("Doing a connectivity check"); try { String connectionCheckUrl = site.getConnectionCheckUrl();