PY-18703 Can no longer mix conda/pip under Conda env

This commit is contained in:
Ekaterina Tuzova
2017-07-05 13:47:47 +03:00
parent bf75fb88fe
commit 1e0e07e6d3
9 changed files with 153 additions and 81 deletions
@@ -17,6 +17,7 @@ import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.AnActionButton;
import com.intellij.ui.DoubleClickListener;
import com.intellij.ui.TableSpeedSearch;
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.table.JBTable;
import com.intellij.util.CatchingConsumer;
@@ -83,6 +84,7 @@ public class InstalledPackagesPanel extends JPanel {
myPackagesTable.setPreferredScrollableViewportSize(null);
myPackagesTable.setStriped(true);
myPackagesTable.getTableHeader().setReorderingAllowed(false);
new TableSpeedSearch(myPackagesTable);
myUpgradeButton = new AnActionButton("Upgrade", IconUtil.getMoveUpIcon()) {
@Override
@@ -111,6 +113,7 @@ public class InstalledPackagesPanel extends JPanel {
.addExtraAction(myUninstallButton)
.addExtraAction(myUpgradeButton);
decorator.addExtraActions(getExtraActions());
add(decorator.createPanel());
myInstallButton.setEnabled(false);
myUninstallButton.setEnabled(false);
@@ -145,6 +148,10 @@ public class InstalledPackagesPanel extends JPanel {
}.installOn(myPackagesTable);
}
protected AnActionButton[] getExtraActions() {
return new AnActionButton[0];
}
@NotNull
protected ManagePackagesDialog createManagePackagesDialog() {
return new ManagePackagesDialog(myProject,
+1
View File
@@ -36,6 +36,7 @@ public class PythonIcons {
}
public static class Python {
public static final Icon Anaconda = load("/icons/com/jetbrains/python/anaconda.png"); // 16x16
public static class Buildout {
public static final Icon Buildout = load("/icons/com/jetbrains/python/buildout/buildout.png"); // 16x16
Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 B

@@ -40,38 +40,38 @@ import java.util.Set;
public class PyCondaPackageManagerImpl extends PyPackageManagerImpl {
public static final String PYTHON = "python";
public boolean useConda = true;
public boolean useConda() {
return useConda;
}
public void useConda(boolean conda) {
useConda = conda;
}
PyCondaPackageManagerImpl(@NotNull final Sdk sdk) {
super(sdk);
}
@Override
public void installManagement() throws ExecutionException {
}
@Override
public boolean hasManagement() throws ExecutionException {
final Sdk sdk = getSdk();
return isCondaVEnv(sdk);
}
@Override
protected void installManagement(@NotNull String name) throws ExecutionException {
}
@Override
public void install(@NotNull List<PyRequirement> requirements, @NotNull List<String> extraArgs) throws ExecutionException {
final ArrayList<String> arguments = new ArrayList<>();
for (PyRequirement requirement : requirements) {
arguments.add(requirement.toString());
}
arguments.add("-y");
if (extraArgs.contains("-U")) {
getCondaOutput("update", arguments);
if (useConda) {
final ArrayList<String> arguments = new ArrayList<>();
for (PyRequirement requirement : requirements) {
arguments.add(requirement.toString());
}
arguments.add("-y");
if (extraArgs.contains("-U")) {
getCondaOutput("update", arguments);
}
else {
arguments.addAll(extraArgs);
getCondaOutput("install", arguments);
}
}
else {
arguments.addAll(extraArgs);
getCondaOutput("install", arguments);
super.install(requirements, extraArgs);
}
}
@@ -109,27 +109,41 @@ public class PyCondaPackageManagerImpl extends PyPackageManagerImpl {
@Override
public void install(@NotNull String requirementString) throws ExecutionException {
getCondaOutput("install", Lists.newArrayList(requirementString, "-y"));
if (useConda) {
super.install(requirementString);
}
else {
getCondaOutput("install", Lists.newArrayList(requirementString, "-y"));
}
}
@Override
public void uninstall(@NotNull List<PyPackage> packages) throws ExecutionException {
final ArrayList<String> arguments = new ArrayList<>();
for (PyPackage aPackage : packages) {
arguments.add(aPackage.getName());
}
arguments.add("-y");
if (useConda) {
final ArrayList<String> arguments = new ArrayList<>();
for (PyPackage aPackage : packages) {
arguments.add(aPackage.getName());
}
arguments.add("-y");
getCondaOutput("remove", arguments);
getCondaOutput("remove", arguments);
}
else {
super.uninstall(packages);
}
}
@NotNull
@Override
protected List<PyPackage> collectPackages() throws ExecutionException {
final ProcessOutput output = getCondaOutput("list", Lists.newArrayList("-e"));
final Set<PyPackage> packages = Sets.newConcurrentHashSet(parseCondaToolOutput(output.getStdout()));
packages.addAll(super.collectPackages());
return Lists.newArrayList(packages);
if (useConda) {
final ProcessOutput output = getCondaOutput("list", Lists.newArrayList("-e"));
final Set<PyPackage> packages = Sets.newConcurrentHashSet(parseCondaToolOutput(output.getStdout()));
return Lists.newArrayList(packages);
}
else {
return super.collectPackages();
}
}
@NotNull
@@ -162,7 +176,7 @@ public class PyCondaPackageManagerImpl extends PyPackageManagerImpl {
final VirtualFile homeDirectory = sdk.getHomeDirectory();
if (homeDirectory == null) return false;
final VirtualFile condaMeta = SystemInfo.isWindows ? homeDirectory.getParent().findChild(condaName) :
homeDirectory.getParent().getParent().findChild(condaName);
homeDirectory.getParent().getParent().findChild(condaName);
return condaMeta != null;
}
@@ -227,9 +227,7 @@ public class PyCondaPackageService implements PersistentStateComponent<PyCondaPa
final ProcessOutput output = PySdkUtil.getProcessOutput(runDirectory, new String[]{condaPython, path, "channels"});
if (output.getExitCode() != 0) return;
final List<String> lines = output.getStdoutLines();
for (String line : lines) {
CONDA_CHANNELS.add(line);
}
CONDA_CHANNELS.addAll(lines);
LAST_TIME_CHECKED = System.currentTimeMillis();
}
}
@@ -27,9 +27,12 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.CatchingConsumer;
import com.intellij.webcore.packaging.PackageVersionComparator;
import com.intellij.webcore.packaging.RepoPackage;
import com.jetbrains.python.packaging.PyCondaPackageManagerImpl;
import com.jetbrains.python.packaging.PyCondaPackageService;
import com.jetbrains.python.packaging.PyPackageManager;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -40,86 +43,102 @@ public class PyCondaManagementService extends PyPackageManagementService {
super(project, sdk);
}
private boolean useConda() {
return PyPackageManager.getInstance(mySdk) instanceof PyCondaPackageManagerImpl &&
((PyCondaPackageManagerImpl)PyPackageManager.getInstance(mySdk)).useConda();
}
@Override
@NotNull
public List<RepoPackage> getAllPackagesCached() {
return versionMapToPackageList(PyCondaPackageService.getInstance().getCondaPackages());
return useConda() ? versionMapToPackageList(PyCondaPackageService.getInstance().getCondaPackages()) : super.getAllPackagesCached();
}
@Override
@NotNull
public List<RepoPackage> getAllPackages() {
return versionMapToPackageList(PyCondaPackageService.getInstance().loadAndGetPackages());
public List<RepoPackage> getAllPackages() throws IOException {
return useConda() ? versionMapToPackageList(PyCondaPackageService.getInstance().loadAndGetPackages()) : super.getAllPackages();
}
@Override
@NotNull
public List<RepoPackage> reloadAllPackages() {
return getAllPackages();
public List<RepoPackage> reloadAllPackages() throws IOException {
return useConda() ? getAllPackages() : super.reloadAllPackages();
}
@Override
public List<String> getAllRepositories() {
List<String> result = new ArrayList<>();
result.addAll(PyCondaPackageService.getInstance().loadAndGetChannels());
return result;
return useConda() ? Lists.newArrayList(PyCondaPackageService.getInstance().loadAndGetChannels()) : super.getAllRepositories();
}
@Override
public void addRepository(String repositoryUrl) {
final String conda = PyCondaPackageService.getCondaExecutable(mySdk.getHomeDirectory());
final ArrayList<String> parameters = Lists.newArrayList(conda, "config", "--add", "channels", repositoryUrl, "--force");
final GeneralCommandLine commandLine = new GeneralCommandLine(parameters);
if (useConda()) {
final String conda = PyCondaPackageService.getCondaExecutable(mySdk.getHomeDirectory());
final ArrayList<String> parameters = Lists.newArrayList(conda, "config", "--add", "channels", repositoryUrl, "--force");
final GeneralCommandLine commandLine = new GeneralCommandLine(parameters);
try {
final CapturingProcessHandler handler = new CapturingProcessHandler(commandLine);
final ProcessOutput result = handler.runProcess();
final int exitCode = result.getExitCode();
if (exitCode != 0) {
final String message = StringUtil.isEmptyOrSpaces(result.getStdout()) && StringUtil.isEmptyOrSpaces(result.getStderr()) ?
"Permission denied" : "Non-zero exit code";
LOG.warn("Failed to add repository " + message);
try {
final CapturingProcessHandler handler = new CapturingProcessHandler(commandLine);
final ProcessOutput result = handler.runProcess();
final int exitCode = result.getExitCode();
if (exitCode != 0) {
final String message = StringUtil.isEmptyOrSpaces(result.getStdout()) && StringUtil.isEmptyOrSpaces(result.getStderr()) ?
"Permission denied" : "Non-zero exit code";
LOG.warn("Failed to add repository " + message);
}
PyCondaPackageService.getInstance().addChannel(repositoryUrl);
}
catch (ExecutionException e) {
LOG.warn("Failed to add repository");
}
PyCondaPackageService.getInstance().addChannel(repositoryUrl);
}
catch (ExecutionException e) {
LOG.warn("Failed to add repository");
else {
super.addRepository(repositoryUrl);
}
}
@Override
public void removeRepository(String repositoryUrl) {
final String conda = PyCondaPackageService.getCondaExecutable(mySdk.getHomeDirectory());
final ArrayList<String> parameters = Lists.newArrayList(conda, "config", "--remove", "channels", repositoryUrl, "--force");
final GeneralCommandLine commandLine = new GeneralCommandLine(parameters);
if (useConda()) {
final String conda = PyCondaPackageService.getCondaExecutable(mySdk.getHomeDirectory());
final ArrayList<String> parameters = Lists.newArrayList(conda, "config", "--remove", "channels", repositoryUrl, "--force");
final GeneralCommandLine commandLine = new GeneralCommandLine(parameters);
try {
final CapturingProcessHandler handler = new CapturingProcessHandler(commandLine);
final ProcessOutput result = handler.runProcess();
final int exitCode = result.getExitCode();
if (exitCode != 0) {
final String message = StringUtil.isEmptyOrSpaces(result.getStdout()) && StringUtil.isEmptyOrSpaces(result.getStderr()) ?
"Permission denied" : "Non-zero exit code";
LOG.warn("Failed to remove repository " + message);
try {
final CapturingProcessHandler handler = new CapturingProcessHandler(commandLine);
final ProcessOutput result = handler.runProcess();
final int exitCode = result.getExitCode();
if (exitCode != 0) {
final String message = StringUtil.isEmptyOrSpaces(result.getStdout()) && StringUtil.isEmptyOrSpaces(result.getStderr()) ?
"Permission denied" : "Non-zero exit code";
LOG.warn("Failed to remove repository " + message);
}
PyCondaPackageService.getInstance().removeChannel(repositoryUrl);
}
catch (ExecutionException e) {
LOG.warn("Failed to remove repository");
}
PyCondaPackageService.getInstance().removeChannel(repositoryUrl);
}
catch (ExecutionException e) {
LOG.warn("Failed to remove repository");
else {
super.removeRepository(repositoryUrl);
}
}
@Override
public boolean canInstallToUser() {
return false;
return !useConda() && super.canInstallToUser();
}
@Override
public void fetchPackageVersions(String packageName, CatchingConsumer<List<String>, Exception> consumer) {
final List<String> versions = PyCondaPackageService.getInstance().getPackageVersions(packageName);
Collections.sort(versions, Collections.reverseOrder(new PackageVersionComparator()));
consumer.consume(versions);
if (useConda()) {
final List<String> versions = PyCondaPackageService.getInstance().getPackageVersions(packageName);
Collections.sort(versions, Collections.reverseOrder(new PackageVersionComparator()));
consumer.consume(versions);
}
else {
super.fetchPackageVersions(packageName, consumer);
}
}
}
@@ -18,11 +18,13 @@ package com.jetbrains.python.packaging.ui;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
import com.intellij.execution.ExecutionException;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.ui.ToggleActionButton;
import com.intellij.webcore.packaging.InstalledPackage;
import com.intellij.webcore.packaging.InstalledPackagesPanel;
import com.intellij.webcore.packaging.PackageManagementService;
@@ -30,6 +32,7 @@ import com.intellij.webcore.packaging.PackagesNotificationPanel;
import com.jetbrains.python.packaging.*;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import icons.PythonIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -183,4 +186,34 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
return myHasManagement && !PyCondaPackageManagerImpl.PYTHON.equals(pyPackage.getName());
}
@Override
@NotNull
protected ToggleActionButton[] getExtraActions() {
return new ToggleActionButton[]{new ToggleActionButton("Use Conda Package Manager", PythonIcons.Python.Anaconda) {
@Override
public boolean isSelected(AnActionEvent e) {
final Sdk sdk = getSelectedSdk();
return sdk != null && PyPackageManager.getInstance(sdk) instanceof PyCondaPackageManagerImpl &&
((PyCondaPackageManagerImpl)PyPackageManager.getInstance(sdk)).useConda();
}
@Override
public void setSelected(AnActionEvent e, boolean state) {
final Sdk sdk = getSelectedSdk();
if (sdk == null) return;
final PyPackageManager manager = PyPackageManager.getInstance(sdk);
if (manager instanceof PyCondaPackageManagerImpl) {
((PyCondaPackageManagerImpl)manager).useConda(state);
}
updatePackages(myPackageManagementService);
}
@Override
public boolean isVisible() {
final Sdk sdk = getSelectedSdk();
return sdk != null && PythonSdkType.isCondaVirtualEnv(sdk);
}
}};
}
}
@@ -174,7 +174,7 @@ public class PyPackageManagementService extends PackageManagementServiceEx {
catch (ExecutionException e) {
throw new IOException(e);
}
Collections.sort(packages, (pkg1, pkg2) -> pkg1.getName().compareTo(pkg2.getName()));
Collections.sort(packages, Comparator.comparing(InstalledPackage::getName));
return new ArrayList<>(packages);
}