private void upgradePackage()

in src/org/jetbrains/r/packages/remote/ui/RInstalledPackagesPanelBase.java [392:449]


  private void upgradePackage(final @NotNull RInstalledPackage pkg, final @Nullable String toVersion) {
    final RPackageManagementService selectedPackageManagementService = myPackageManagementService;
    myPackageManagementService.fetchPackageVersions(pkg.getName(), new CatchingConsumer<>() {
      @Override
      public void consume(java.util.List<String> releases) {
        if (!releases.isEmpty() && !isUpdateAvailable(pkg.getVersion(), releases.get(0))) {
          return;
        }

        ApplicationManager.getApplication().invokeLater(() -> {
          ModalityState modalityState = ModalityState.current();
          final PackageManagementService.Listener listener = new PackageManagementService.Listener() {
            @Override
            public void operationStarted(final String packageName) {
              ApplicationManager.getApplication().invokeLater(() -> myCurrentlyInstalling.add(packageName), modalityState);
            }

            @Override
            public void operationFinished(final String packageName,
                                          final @Nullable PackageManagementService.ErrorDescription errorDescription) {
              ApplicationManager.getApplication().invokeLater(() -> {
                myPackagesTable.clearSelection();
                updatePackages(selectedPackageManagementService);
                myCurrentlyInstalling.remove(packageName);
                if (errorDescription == null) {
                  myNotificationArea.showSuccess("Package " + packageName + " successfully upgraded");
                }
                else {
                  myNotificationArea.showError("Upgrade packages failed. <a href=\"xxx\">Details...</a>",
                                               RBundle.INSTANCE.message("install.package.dialog.title.upgrade.packages.failed"),
                                               errorDescription);
                }

                if (myCurrentlyInstalling.isEmpty() && !myWaitingToUpgrade.isEmpty()) {
                  upgradePostponedPackages();
                }
              }, modalityState);
            }
          };
          PackageManagementServiceEx serviceEx = getServiceEx();
          if (serviceEx != null) {
            serviceEx.updatePackage(pkg, toVersion, listener);
          }
          else {
            myPackageManagementService.installPackage(new RepoPackage(pkg.getName(), null /* TODO? */), null, true, null, listener, false);
          }
          myUpgradeEnabled = false;
        }, ModalityState.any());
      }

      @Override
      public void consume(Exception e) {
        ApplicationManager.getApplication().invokeLater(() -> Messages
          .showErrorDialog(RBundle.INSTANCE.message("install.package.dialog.message.error.occurred.please.check.your.internet.connection"),
                           RBundle.INSTANCE.message("install.package.dialog.title.upgrade.package.failed")), ModalityState.any());
      }
    });
  }