InstalledPackagesPanel runs package upgrade through PackageManagementService

This commit is contained in:
Dmitry Jemerov
2013-05-03 21:25:53 +02:00
parent 941b3c8ab5
commit 66e081be35
3 changed files with 89 additions and 86 deletions
@@ -12,13 +12,11 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.ui.DoubleClickListener;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.table.JBTable;
import com.intellij.util.CatchingConsumer;
import com.intellij.util.Consumer;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.webcore.packaging.ManagePackagesDialog;
import com.intellij.webcore.packaging.PackageManagementService;
import com.intellij.webcore.packaging.PackagesNotificationPanel;
import com.intellij.webcore.packaging.*;
import com.jetbrains.python.packaging.*;
import org.apache.xmlrpc.AsyncCallback;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -33,7 +31,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URL;
import java.util.*;
import java.util.List;
@@ -167,69 +164,14 @@ public class InstalledPackagesPanel extends JPanel {
@Override
public void actionPerformed(ActionEvent e) {
final int[] rows = myPackagesTable.getSelectedRows();
final Sdk selectedSdk = mySelectedSdk;
final PackageManagementService selPackageManagementService = myPackageManagementService;
if (selectedSdk != null) {
if (myPackageManagementService != null) {
for (int row : rows) {
final Object pyPackage = myPackagesTableModel.getValueAt(row, 0);
if (pyPackage instanceof PyPackage) {
final String packageName = ((PyPackage)pyPackage).getName();
final Object currentVersion = myPackagesTableModel.getValueAt(row, 1);
if (pyPackage instanceof InstalledPackage) {
final String packageName = ((InstalledPackage)pyPackage).getName();
final String currentVersion = (String)myPackagesTableModel.getValueAt(row, 1);
PyPIPackageUtil.INSTANCE.usePackageReleases(packageName, new AsyncCallback() {
@Override
public void handleResult(Object result, URL url, String method) {
final List<String> releases = (List<String>)result;
PyPIPackageUtil.INSTANCE.addPackageReleases(packageName, releases);
if (!releases.isEmpty() &&
PyRequirement.VERSION_COMPARATOR.compare((String)currentVersion, releases.get(0)) >= 0)
return;
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
PyPackageManagerImpl.UI ui =
new PyPackageManagerImpl.UI(myProject, selectedSdk, new PyPackageManagerImpl.UI.Listener() {
@Override
public void started() {
myPackagesTable.setPaintBusy(true);
currentlyInstalling.add(packageName);
}
@Override
public void finished(final List<PyExternalProcessException> exceptions) {
myPackagesTable.clearSelection();
updatePackages(selectedSdk, selPackageManagementService);
myPackagesTable.setPaintBusy(false);
currentlyInstalling.remove(packageName);
if (exceptions.isEmpty()) {
myNotificationArea.showSuccess("Package successfully upgraded");
}
else {
myNotificationArea.showError("Upgrade packages failed. <a href=\"xxx\">Details...</a>",
"Upgrade Packages Failed",
PyPackageManagerImpl.UI
.createDescription(exceptions, "Upgrade packages failed."));
}
}
});
ui.install(Collections.singletonList(new PyRequirement(packageName)), Collections.singletonList("-U"));
myUpgradeButton.setEnabled(false);
}
}, ModalityState.any());
}
@Override
public void handleError(Exception exception, URL url, String method) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
Messages.showErrorDialog("Error occurred. Please, check your internet connection.",
"Upgrade Package Failed.");
}
}, ModalityState.any());
}
});
upgradePackage(packageName, currentVersion);
}
}
}
@@ -237,6 +179,61 @@ public class InstalledPackagesPanel extends JPanel {
});
}
private void upgradePackage(final String packageName, final String currentVersion) {
final Sdk selectedSdk = mySelectedSdk;
final PackageManagementService selPackageManagementService = myPackageManagementService;
myPackageManagementService.fetchPackageVersions(packageName, new CatchingConsumer<List<String>, Exception>() {
@Override
public void consume(List<String> releases) {
if (!releases.isEmpty() &&
PyRequirement.VERSION_COMPARATOR.compare(currentVersion, releases.get(0)) >= 0)
return;
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
final PackageManagementService.Listener listener = new PackageManagementService.Listener() {
@Override
public void installationStarted(String packageName) {
myPackagesTable.setPaintBusy(true);
currentlyInstalling.add(packageName);
}
@Override
public void installationFinished(String packageName, @Nullable String errorDescription) {
myPackagesTable.clearSelection();
updatePackages(selectedSdk, selPackageManagementService);
myPackagesTable.setPaintBusy(false);
currentlyInstalling.remove(packageName);
if (errorDescription == null) {
myNotificationArea.showSuccess("Package " + packageName + " successfully upgraded");
}
else {
myNotificationArea.showError("Upgrade packages failed. <a href=\"xxx\">Details...</a>",
"Upgrade Packages Failed",
"Upgrade packages failed.\n" + errorDescription);
}
}
};
myPackageManagementService.installPackage(new RepoPackage(packageName, null /* TODO? */), null, true, null, listener, false);
myUpgradeButton.setEnabled(false);
}
}, ModalityState.any());
}
@Override
public void consume(Exception e) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
Messages.showErrorDialog("Error occurred. Please, check your internet connection.",
"Upgrade Package Failed.");
}
}, ModalityState.any());
}
});
}
private void updateUninstallUpgrade() {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
@@ -250,18 +247,18 @@ public class InstalledPackagesPanel extends JPanel {
final int index = selected[i];
if (index >= myPackagesTable.getRowCount()) continue;
final Object value = myPackagesTable.getValueAt(index, 0);
if (value instanceof PyPackage) {
final PyPackage pyPackage = (PyPackage)value;
if (!canUninstallPackage(pyPackage)) {
if (value instanceof InstalledPackage) {
final InstalledPackage pkg = (InstalledPackage)value;
if (!canUninstallPackage(pkg)) {
canUninstall = false;
}
if (!canUpgradePackage(pyPackage)) {
if (!canUpgradePackage(pkg)) {
canUpgrade = false;
}
final String pyPackageName = pyPackage.getName();
final String pyPackageName = pkg.getName();
final String availableVersion = (String)myPackagesTable.getValueAt(index, 2);
if (!upgradeAvailable) {
upgradeAvailable = PyRequirement.VERSION_COMPARATOR.compare(pyPackage.getVersion(), availableVersion) < 0 &&
upgradeAvailable = PyRequirement.VERSION_COMPARATOR.compare(pkg.getVersion(), availableVersion) < 0 &&
!currentlyInstalling.contains(pyPackageName);
}
if (!canUninstall && !canUpgrade) break;
@@ -274,11 +271,11 @@ public class InstalledPackagesPanel extends JPanel {
}, ModalityState.any());
}
protected boolean canUninstallPackage(PyPackage pyPackage) {
protected boolean canUninstallPackage(InstalledPackage pyPackage) {
return true;
}
protected boolean canUpgradePackage(PyPackage pyPackage) {
protected boolean canUpgradePackage(InstalledPackage pyPackage) {
return true;
}
@@ -6,6 +6,7 @@ import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.util.Consumer;
import com.intellij.webcore.packaging.InstalledPackage;
import com.intellij.webcore.packaging.PackagesNotificationPanel;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackage;
@@ -149,22 +150,22 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
}
@Override
protected boolean canUninstallPackage(PyPackage pyPackage) {
protected boolean canUninstallPackage(InstalledPackage pkg) {
if (!myHasPip) return false;
if (PythonSdkType.isVirtualEnv(mySelectedSdk)) {
final String location = pyPackage.getLocation();
if (PythonSdkType.isVirtualEnv(mySelectedSdk) && pkg instanceof PyPackage) {
final String location = ((PyPackage) pkg).getLocation();
if (location != null && location.startsWith(PyPackageManagerImpl.getUserSite())) {
return false;
}
}
if ("pip".equals(pyPackage.getName()) || "distribute".equals(pyPackage.getName())) {
if ("pip".equals(pkg.getName()) || "distribute".equals(pkg.getName())) {
return false;
}
return true;
}
@Override
protected boolean canUpgradePackage(PyPackage pyPackage) {
protected boolean canUpgradePackage(InstalledPackage pyPackage) {
return myHasPip;
}
}
@@ -115,13 +115,10 @@ public class PyPackageManagementService extends PackageManagementService {
}
@Override
public void installPackage(final String packageName,
String repositoryUrl,
String version,
boolean installToUser,
String extraOptions,
final Listener listener) {
final String repository = repositoryUrl.equals(PyPIPackageUtil.PYPI_URL) ? null : repositoryUrl;
public void installPackage(final RepoPackage repoPackage,String version, boolean forceUpgrade, String extraOptions,
final Listener listener, boolean installToUser) {
final String packageName = repoPackage.getName();
final String repository = PyPIPackageUtil.PYPI_URL.equals(repoPackage.getRepoUrl()) ? null : repoPackage.getRepoUrl();
final List<String> extraArgs = new ArrayList<String>();
if (installToUser) {
extraArgs.add(PyPackageManagerImpl.USE_USER_SITE);
@@ -134,6 +131,9 @@ public class PyPackageManagementService extends PackageManagementService {
extraArgs.add("--extra-index-url");
extraArgs.add(repository);
}
if (forceUpgrade) {
extraArgs.add("-U");
}
final PyRequirement req;
if (version != null) {
req = new PyRequirement(packageName, version);
@@ -150,7 +150,11 @@ public class PyPackageManagementService extends PackageManagementService {
@Override
public void finished(@Nullable List<PyExternalProcessException> exceptions) {
listener.installationFinished(packageName, PyPackageManagerImpl.UI.createDescription(exceptions, ""));
String errorDescription = null;
if (exceptions != null && exceptions.size() > 0) {
errorDescription = PyPackageManagerImpl.UI.createDescription(exceptions, "");
}
listener.installationFinished(packageName, errorDescription);
}
});
ui.install(Collections.singletonList(req), extraArgs);
@@ -165,6 +169,7 @@ public class PyPackageManagementService extends PackageManagementService {
PyPIPackageUtil.INSTANCE.addPackageReleases(packageName, releases);
consumer.consume(releases);
}
@Override
public void handleError(Exception exception, URL url, String method) {
consumer.consume(exception);