@Override
  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(PyPackageManager.USE_USER_SITE);
    }
    if (extraOptions != null) {
      // TODO: Respect arguments quotation
      Collections.addAll(extraArgs, extraOptions.split(" +"));
    }
    if (!StringUtil.isEmptyOrSpaces(repository)) {
      extraArgs.add("--extra-index-url");
      extraArgs.add(repository);
    }
    if (forceUpgrade) {
      extraArgs.add("-U");
    }
    final PyRequirement req;
    if (version != null) {
      req = new PyRequirement(packageName, version);
    } else {
      req = new PyRequirement(packageName);
    }

    final PyPackageManagerUI ui =
        new PyPackageManagerUI(
            myProject,
            mySdk,
            new PyPackageManagerUI.Listener() {
              @Override
              public void started() {
                listener.operationStarted(packageName);
              }

              @Override
              public void finished(@Nullable List<PyExternalProcessException> exceptions) {
                listener.operationFinished(packageName, toErrorDescription(exceptions));
              }
            });
    ui.install(Collections.singletonList(req), extraArgs);
  }