Skip to content

Commit 765d58b

Browse files
committed
plugin autoupdate fixed: always provide plugin descriptor with new version number to plugin downloader
1 parent 9cbde91 commit 765d58b

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

idea/src/org/jetbrains/kotlin/idea/KotlinPluginUpdater.kt

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@
1616

1717
package org.jetbrains.kotlin.idea
1818

19-
import com.intellij.ide.plugins.IdeaPluginDescriptor
20-
import com.intellij.ide.plugins.PluginManager
21-
import com.intellij.ide.plugins.PluginManagerMain
22-
import com.intellij.ide.plugins.RepositoryHelper
19+
import com.intellij.ide.actions.ShowFilePathAction
20+
import com.intellij.ide.plugins.*
2321
import com.intellij.ide.util.PropertiesComponent
2422
import com.intellij.notification.NotificationDisplayType
2523
import com.intellij.notification.NotificationGroup
@@ -28,9 +26,9 @@ import com.intellij.openapi.Disposable
2826
import com.intellij.openapi.application.ApplicationInfo
2927
import com.intellij.openapi.application.ApplicationManager
3028
import com.intellij.openapi.application.ModalityState
29+
import com.intellij.openapi.application.PathManager
3130
import com.intellij.openapi.components.ServiceManager
3231
import com.intellij.openapi.diagnostic.Logger
33-
import com.intellij.openapi.extensions.PluginId
3432
import com.intellij.openapi.progress.ProgressIndicator
3533
import com.intellij.openapi.progress.ProgressManager
3634
import com.intellij.openapi.progress.Task
@@ -43,14 +41,15 @@ import com.intellij.openapi.vfs.CharsetToolkit
4341
import com.intellij.util.Alarm
4442
import com.intellij.util.io.HttpRequests
4543
import com.intellij.util.text.VersionComparatorUtil
44+
import java.io.File
4645
import java.net.URLEncoder
4746
import java.util.concurrent.TimeUnit
4847

4948
sealed class PluginUpdateStatus {
5049
object LatestVersionInstalled : PluginUpdateStatus()
5150

5251
class Update(val newVersion: String,
53-
val descriptorToInstall: IdeaPluginDescriptor?,
52+
val descriptorToInstall: IdeaPluginDescriptor,
5453
val hostToInstallFrom: String?) : PluginUpdateStatus()
5554

5655
class CheckFailed(val message: String) : PluginUpdateStatus()
@@ -90,19 +89,19 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos
9089
private fun updateCheck(callback: (PluginUpdateStatus) -> Boolean) {
9190
try {
9291
var (mainRepoUpdateSuccess, latestVersionInRepository) = getPluginVersionFromMainRepository()
93-
var descriptorToInstall: IdeaPluginDescriptor? = null
92+
var descriptorToInstall: IdeaPluginDescriptor? = initPluginDescriptor(latestVersionInRepository)
9493
var hostToInstallFrom: String? = null
9594

9695
for (host in RepositoryHelper.getPluginHosts().filterNotNull()) {
9796
val plugins = try {
9897
RepositoryHelper.loadPlugins(host, null)
9998
}
10099
catch(e: Exception) {
101-
LOG.info("Checking custom plugin reposityory $host failed", e)
100+
LOG.info("Checking custom plugin repository $host failed", e)
102101
continue
103102
}
104103

105-
val kotlinPlugin = plugins.find { it.pluginId.toString() == "org.jetbrains.kotlin" }
104+
val kotlinPlugin = plugins.find { it.pluginId == KotlinPluginUtil.KOTLIN_PLUGIN_ID }
106105
if (kotlinPlugin != null && VersionComparatorUtil.compare(kotlinPlugin.version, latestVersionInRepository) > 0) {
107106
latestVersionInRepository = kotlinPlugin.version
108107
descriptorToInstall = kotlinPlugin
@@ -116,7 +115,7 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos
116115
recordSuccessfulUpdateCheck()
117116
if (latestVersionInRepository != null && VersionComparatorUtil.compare(latestVersionInRepository, KotlinPluginUtil.getPluginVersion()) > 0) {
118117
ApplicationManager.getApplication().invokeLater({
119-
callback(PluginUpdateStatus.Update(latestVersionInRepository!!, descriptorToInstall, hostToInstallFrom))
118+
callback(PluginUpdateStatus.Update(latestVersionInRepository!!, descriptorToInstall!!, hostToInstallFrom))
120119
}, ModalityState.any())
121120
}
122121
else {
@@ -140,6 +139,15 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos
140139
}
141140
}
142141

142+
private fun initPluginDescriptor(newVersion: String?): IdeaPluginDescriptor? {
143+
if (newVersion == null) return null
144+
val originalPlugin = PluginManager.getPlugin(KotlinPluginUtil.KOTLIN_PLUGIN_ID)!!
145+
return PluginNode(KotlinPluginUtil.KOTLIN_PLUGIN_ID).apply {
146+
version = newVersion
147+
name = originalPlugin.name
148+
description = originalPlugin.description
149+
}
150+
}
143151

144152
data class RepositoryCheckResult(val success: Boolean, val newVersion: String?)
145153

@@ -189,20 +197,26 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos
189197

190198
fun installPluginUpdate(update: PluginUpdateStatus.Update,
191199
cancelCallback: () -> Unit = {}) {
192-
val descriptor = update.descriptorToInstall ?: PluginManager.getPlugin(PluginId.getId("org.jetbrains.kotlin")) ?: return
200+
val descriptor = update.descriptorToInstall
193201
val pluginDownloader = PluginDownloader.createDownloader(descriptor, update.hostToInstallFrom, null)
194202
ProgressManager.getInstance().run(object : Task.Backgroundable(null, "Downloading plugins", true) {
195203
override fun run(indicator: ProgressIndicator) {
204+
var installed = false
196205
if (pluginDownloader.prepareToInstall(indicator)) {
197206
val pluginDescriptor = pluginDownloader.descriptor
198207
if (pluginDescriptor != null) {
208+
installed = true
199209
pluginDownloader.install()
200210

201211
ApplicationManager.getApplication().invokeLater {
202212
PluginManagerMain.notifyPluginsUpdated(null)
203213
}
204214
}
205215
}
216+
217+
if (!installed) {
218+
notifyNotInstalled()
219+
}
206220
}
207221

208222
override fun onCancel() {
@@ -211,6 +225,23 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos
211225
})
212226
}
213227

228+
private fun notifyNotInstalled() {
229+
ApplicationManager.getApplication().invokeLater {
230+
val notification = notificationGroup.createNotification(
231+
"Kotlin",
232+
"Plugin update was not installed. <a href=\"#\">See the log for more information</a>",
233+
NotificationType.INFORMATION) { notification, event ->
234+
235+
val logFile = File(PathManager.getLogPath(), "idea.log")
236+
ShowFilePathAction.openFile(logFile)
237+
238+
notification.expire()
239+
}
240+
241+
notification.notify(null)
242+
}
243+
}
244+
214245
override fun dispose() {
215246
}
216247

idea/src/org/jetbrains/kotlin/idea/KotlinPluginUtil.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828

2929
public class KotlinPluginUtil {
3030

31+
public static final PluginId KOTLIN_PLUGIN_ID = PluginId.getId("org.jetbrains.kotlin");
32+
3133
@NotNull
3234
public static String getPluginVersion() {
33-
IdeaPluginDescriptor plugin = PluginManager.getPlugin(PluginId.getId("org.jetbrains.kotlin"));
35+
IdeaPluginDescriptor plugin = PluginManager.getPlugin(KOTLIN_PLUGIN_ID);
3436
assert plugin != null : "Kotlin plugin not found: " + Arrays.toString(PluginManagerCore.getPlugins());
3537
return plugin.getVersion();
3638
}

0 commit comments

Comments
 (0)