Skip to content

Commit 3333e9f

Browse files
committed
report errors when running rebar --version (aids #488)
1 parent dc43005 commit 3333e9f

File tree

3 files changed

+56
-27
lines changed

3 files changed

+56
-27
lines changed

src/org/intellij/erlang/rebar/settings/RebarConfigurationForm.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
2323
import com.intellij.openapi.util.Pair;
2424
import com.intellij.openapi.util.io.FileUtilRt;
25+
import com.intellij.openapi.util.text.StringUtil;
2526
import com.intellij.openapi.vfs.VirtualFile;
2627
import com.intellij.ui.DocumentAdapter;
2728
import com.intellij.ui.components.labels.ActionLink;
@@ -82,14 +83,17 @@ public JComponent createComponent() {
8283

8384
private boolean validateRebarPath() {
8485
String rebarPath = myRebarPathSelector.getText();
85-
if (new File(rebarPath).exists()) {
86-
String version = ExtProcessUtil.restrictedTimeExec(myRebarPathSelector.getText() + " --version", 3000);
87-
if (version.startsWith("rebar")) {
88-
myRebarVersionText.setText(version);
89-
return true;
90-
}
86+
if (!new File(rebarPath).exists()) return false;
87+
88+
ExtProcessUtil.ExtProcessOutput output = ExtProcessUtil.execAndGetFirstLine(myRebarPathSelector.getText() + " --version", 3000);
89+
String version = output.getStdOut();
90+
if (version.startsWith("rebar")) {
91+
myRebarVersionText.setText(version);
92+
return true;
9193
}
92-
myRebarVersionText.setText("N/A");
94+
95+
String stdErr = output.getStdErr();
96+
myRebarVersionText.setText("N/A" + (StringUtil.isNotEmpty(stdErr) ? ": Error: " + stdErr : ""));
9397
return false;
9498
}
9599

src/org/intellij/erlang/settings/ErlangExternalToolsConfigurable.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.intellij.openapi.util.text.StringUtil;
2828
import com.intellij.openapi.vfs.VirtualFile;
2929
import com.intellij.ui.TitledSeparator;
30-
import com.intellij.util.containers.ContainerUtil;
3130
import org.intellij.erlang.dialyzer.DialyzerSettings;
3231
import org.intellij.erlang.emacs.EmacsSettings;
3332
import org.intellij.erlang.rebar.settings.RebarConfigurationForm;
@@ -42,7 +41,6 @@
4241

4342
import javax.swing.*;
4443
import java.io.File;
45-
import java.util.List;
4644

4745
public class ErlangExternalToolsConfigurable implements SearchableConfigurable, Configurable.NoScroll {
4846
public static final String ERLANG_RELATED_TOOLS = "Erlang External Tools";
@@ -168,13 +166,7 @@ public void disposeUIResources() {
168166
}
169167

170168
private void validateEmacsPath() {
171-
String version = ExtProcessUtil.restrictedTimeExec(myEmacsPathSelector.getText() + " --version", 3000);
172-
List<String> split = StringUtil.split(version, "\n");
173-
if (StringUtil.containsIgnoreCase(version, "emacs") && split.size() > 0) {
174-
myEmacsVersionText.setText(ContainerUtil.getFirstItem(split));
175-
}
176-
else {
177-
myEmacsVersionText.setText("N/A");
178-
}
169+
String rawVersion = ExtProcessUtil.execAndGetFirstLine(myEmacsPathSelector.getText() + " --version", 3000).getStdOut();
170+
myEmacsVersionText.setText(StringUtil.containsIgnoreCase(rawVersion, "emacs") ? rawVersion : "N/A");
179171
}
180172
}

src/org/intellij/erlang/utils/ExtProcessUtil.java

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

1717
package org.intellij.erlang.utils;
1818

19+
import com.intellij.openapi.util.text.StringUtil;
1920
import org.jetbrains.annotations.NotNull;
2021

2122
import java.io.BufferedReader;
2223
import java.io.IOException;
24+
import java.io.InputStream;
2325
import java.io.InputStreamReader;
2426
import java.util.concurrent.*;
2527

@@ -28,21 +30,17 @@ private ExtProcessUtil() {
2830
}
2931

3032
@NotNull
31-
public static String restrictedTimeExec(@NotNull String cmd, int timeout) {
33+
public static ExtProcessOutput execAndGetFirstLine(@NotNull String cmd, long timeout) {
3234
try {
3335
final Process cmdRunner = Runtime.getRuntime().exec(cmd);
3436
ExecutorService singleTreadExecutor = Executors.newSingleThreadExecutor();
35-
Future<String> cmdRunnerFuture = singleTreadExecutor.submit(new Callable<String>() {
37+
Future<ExtProcessOutput> cmdRunnerFuture = singleTreadExecutor.submit(new Callable<ExtProcessOutput>() {
3638
@Override
37-
public String call() throws Exception {
39+
public ExtProcessOutput call() throws Exception {
3840
cmdRunner.waitFor();
39-
BufferedReader outReader = new BufferedReader(new InputStreamReader(cmdRunner.getInputStream()));
40-
try {
41-
String firstLine = outReader.readLine();
42-
return firstLine == null ? "" : firstLine;
43-
} finally {
44-
outReader.close();
45-
}
41+
String stdOut = readLine(cmdRunner.getInputStream());
42+
String stdErr = readLine(cmdRunner.getErrorStream());
43+
return new ExtProcessOutput(stdOut, stdErr);
4644
}
4745
});
4846
try {
@@ -53,6 +51,41 @@ public String call() throws Exception {
5351
singleTreadExecutor.shutdown();
5452
} catch (IOException e) { // Suppress
5553
}
54+
return new ExtProcessOutput("", "");
55+
}
56+
57+
@NotNull
58+
private static String readLine(InputStream stream) {
59+
BufferedReader errReader = new BufferedReader(new InputStreamReader(stream));
60+
try {
61+
return StringUtil.notNullize(errReader.readLine());
62+
} catch (IOException ignore) {
63+
} finally {
64+
try {
65+
errReader.close();
66+
} catch (IOException ignore) {
67+
}
68+
}
5669
return "";
5770
}
71+
72+
public static class ExtProcessOutput {
73+
private final String myStdOut;
74+
private final String myStdErr;
75+
76+
public ExtProcessOutput(@NotNull String stdOut, @NotNull String stdErr) {
77+
myStdOut = stdOut;
78+
myStdErr = stdErr;
79+
}
80+
81+
@NotNull
82+
public String getStdOut() {
83+
return myStdOut;
84+
}
85+
86+
@NotNull
87+
public String getStdErr() {
88+
return myStdErr;
89+
}
90+
}
5891
}

0 commit comments

Comments
 (0)