public static Pair determineSuitableRVMSdkDist()

in rake-runner-agent/src/org/jetbrains/plugins/ruby/rvm/SharedRVMUtil.java [56:98]


  public static Pair<String, String> determineSuitableRVMSdkDist(@NotNull final String rvmrcSdkRef,
                                                                 @Nullable final String rvmrcGemset,
                                                                 @NotNull final RubyDistToGemsetTable distName2GemsetsTable) {
    final InstalledRVM rvm = RVMPathsSettings.getRVMNullSafe();
    final String resolved = rvm.getDistrForName(rvmrcSdkRef);
    if (resolved == null) {
      return Pair.create(null,null);
    }
    final Set<String> installed = rvm.getInstalledRubies();
    if (installed.contains(resolved)) {
      // check gemsets
      for (String gemset : distName2GemsetsTable.getGemsets(resolved)) {
        if (areGemsetsEqual(rvmrcGemset, gemset)) {
          return Pair.create(resolved, gemset);
        }
      }
      return Pair.create(resolved, null);
    } else {
      // RVM cannot resolve such name into interpreter name
      // May be caused by RVM update (when installed 'ruby-1.8.7-pX' and requested '1.8.7' resolved into 'ruby-1.8.7-pY' by RVM)
      // In such case we can try to resolve manually, but should TODO: notify user.

      // Reverse ordered installed interpreters (from higher version to old)
      final SortedSet<String> ordered = new TreeSet<String>(installed).descendingSet();
      final List<String> possible = CollectionsUtil.filterCollection(ordered, new Filter<String>() {
        public boolean accept(@NotNull final String data) {
          // check either refName suites dist name or not
          return sdkRefMatchesManual(rvmrcSdkRef, data);
        }
      });
      // First try more suitable interpreter
      for (String dist : possible) {
        // check gemsets
        for (String gemset : distName2GemsetsTable.getGemsets(dist)) {
          if (areGemsetsEqual(rvmrcGemset, gemset)) {
            return Pair.create(dist, gemset);
          }
        }
        return Pair.create(dist, null);
      }
    }
    return Pair.create(null,null);
  }