wsl: merge isWsl1 and getWslVersion master
authorSergey Simonchik <sergey.simonchik@jetbrains.com>
Sat, 8 May 2021 21:19:16 +0000 (00:19 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Sat, 8 May 2021 21:19:16 +0000 (21:19 +0000)
GitOrigin-RevId: a0efc134330f1f94ae4d00171ddc3086f4cc9622

platform/platform-impl/src/com/intellij/execution/wsl/WSLDistribution.java
platform/platform-impl/src/com/intellij/execution/wsl/WSLUtil.java

index 0e1dc01805de9a8d53ddd1f8397c39774ff8d443..39b1e4393d06cbe832b68ca3049894361c1e4a08 100644 (file)
@@ -54,7 +54,7 @@ public class WSLDistribution {
   private static final String RUN_PARAMETER = "run";
   public static final String UNC_PREFIX = "\\\\wsl$\\";
   private static final String WSLENV = "WSLENV";
-  private static final int DEFAULT_TIMEOUT = SystemProperties.getIntProperty("ide.wsl.probe.timeout", 20_000);
+  static final int DEFAULT_TIMEOUT = SystemProperties.getIntProperty("ide.wsl.probe.timeout", 20_000);
 
   private static final Key<ProcessListener> SUDO_LISTENER_KEY = Key.create("WSL sudo listener");
 
index d0208788630a2782e1c8b4f238ba3ad9a734859e..f82d8d2415c041a6b9bdefcf5bfe90603ef24150 100644 (file)
@@ -3,7 +3,7 @@ package com.intellij.execution.wsl;
 
 import com.intellij.execution.ExecutionException;
 import com.intellij.execution.configurations.GeneralCommandLine;
-import com.intellij.execution.process.*;
+import com.intellij.execution.process.ProcessOutput;
 import com.intellij.execution.util.ExecUtil;
 import com.intellij.openapi.application.Experiments;
 import com.intellij.openapi.diagnostic.Logger;
@@ -157,17 +157,9 @@ public final class WSLUtil {
     return FileUtil.toSystemDependentName(Character.toUpperCase(wslPath.charAt(driveLetterIndex)) + ":" + wslPath.substring(slashIndex));
   }
 
-  @NotNull
-  public static ThreeState isWsl1(@NotNull WSLDistribution distribution) {
-    try {
-      ProcessOutput output = distribution.executeOnWsl(10_000, "uname", "-v");
-      if (output.getExitCode() != 0) return ThreeState.UNSURE;
-      return ThreeState.fromBoolean(output.getStdout().contains("Microsoft"));
-    }
-    catch (ExecutionException e) {
-      LOG.warn(e);
-      return ThreeState.UNSURE;
-    }
+  public static @NotNull ThreeState isWsl1(@NotNull WSLDistribution distribution) {
+    int version = getWslVersion(distribution);
+    return version < 0 ? ThreeState.UNSURE : ThreeState.fromBoolean(version == 1);
   }
 
   /**
@@ -175,6 +167,14 @@ public final class WSLUtil {
    * @return version if it can be determined or -1 instead
    */
   public static int getWslVersion(@NotNull WSLDistribution distribution) {
+    int version = getVersionFromWslCli(distribution);
+    if (version < 0) {
+      version = getVersionByUname(distribution);
+    }
+    return version;
+  }
+
+  private static int getVersionFromWslCli(@NotNull WSLDistribution distribution) {
     Path wslExe = WSLDistribution.findWslExe();
     if (wslExe == null) {
       LOG.warn("wsl.exe is not found");
@@ -185,7 +185,7 @@ public final class WSLUtil {
 
     ProcessOutput output;
     try {
-      output = ExecUtil.execAndGetOutput(commandLine, 10_000);
+      output = ExecUtil.execAndGetOutput(commandLine, WSLDistribution.DEFAULT_TIMEOUT);
     }
     catch (ExecutionException e) {
       LOG.warn("Failed to run " + commandLine.getCommandLineString(), e);
@@ -214,6 +214,20 @@ public final class WSLUtil {
     }).filter(v -> v != -1).findFirst().orElse(-1);
   }
 
+  // To be removed when old WSL installations (without wsl.exe) are gone.
+  private static int getVersionByUname(@NotNull WSLDistribution distribution) {
+    try {
+      ProcessOutput output = distribution.executeOnWsl(WSLDistribution.DEFAULT_TIMEOUT, "uname", "-v");
+      if (output.checkSuccess(LOG)) {
+        return output.getStdout().contains("Microsoft") ? 1 : 2;
+      }
+    }
+    catch (ExecutionException e) {
+      LOG.warn(e);
+    }
+    return -1;
+  }
+
   public static @NotNull @NlsSafe String getMsId(@NotNull @NlsSafe String msOrInternalId) {
     WslDistributionDescriptor descriptor = ContainerUtil.find(WSLDistributionService.getInstance().getDescriptors(),
                                                               d -> d.getId().equals(msOrInternalId));