Skip to content

Commit 8db9512

Browse files
committed
Windows support - code review fixes
1 parent 73ba62a commit 8db9512

File tree

5 files changed

+48
-31
lines changed

5 files changed

+48
-31
lines changed

scala/private/rule_impls.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1166,7 +1166,7 @@ def scala_test_impl(ctx):
11661166
ctx = ctx,
11671167
executable = executable,
11681168
jvm_flags = [
1169-
"-DRULES_SCALA_WS=%s" % ctx.workspace_name,
1169+
"-DRULES_SCALA_MAIN_WS_NAME=%s" % ctx.workspace_name,
11701170
"-DRULES_SCALA_ARGS_FILE=%s" % argsFile.short_path
11711171
] + ctx.attr.jvm_flags,
11721172
main_class = ctx.attr.main_class,

src/java/io/bazel/rulesscala/exe/BUILD

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,20 @@ java_library(
55
"LaunchInfo.java",
66
],
77
deps = [
8-
"@bazel_tools//tools/java/runfiles:runfiles",
8+
"@bazel_tools//tools/java/runfiles",
99
"//external:io_bazel_rules_scala/dependency/scala/guava",
1010
],
11-
visibility = ["//visibility:public"],
11+
visibility = ["//visibility:private"],
1212
)
1313

1414
java_binary(
1515
name = "exe",
1616
main_class = "io.bazel.rulesscala.exe.LauncherFileWriter",
17-
visibility = ["//visibility:public"],
1817
runtime_deps = [
1918
":exe-lib",
2019
],
2120
data = [
22-
"@bazel_tools//tools/launcher:launcher",
21+
"@bazel_tools//tools/launcher",
2322
],
23+
visibility = ["//visibility:public"],
2424
)

src/java/io/bazel/rulesscala/scala_test/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ java_library(
44
visibility = ["//visibility:public"],
55
deps = [
66
"//external:io_bazel_rules_scala/dependency/scalatest/scalatest",
7-
"@bazel_tools//tools/java/runfiles:runfiles",
7+
"@bazel_tools//tools/java/runfiles",
88
],
99
)

src/java/io/bazel/rulesscala/scala_test/Runner.java

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,27 @@
22

33
import com.google.devtools.build.runfiles.Runfiles;
44
import java.io.IOException;
5+
import java.io.File;
56
import java.util.List;
67
import java.util.Map;
78
import java.nio.charset.Charset;
89
import java.nio.file.Files;
910
import java.nio.file.Paths;
1011

11-
/** This exists only as a proxy for scala tests's runner to provide access to env variables */
12+
/** This exists only as a proxy for scala tests's runner to:
13+
* - provide access to env variables
14+
* - unwrap runner's arguments from a file (passed via file to overcome command-line string limitation on Windows)
15+
**/
1216
public class Runner {
1317
/**
1418
* This is the name of the env var set by bazel when a user provides a `--test_filter` test option
1519
*/
1620
private static final String TESTBRIDGE_TEST_ONLY = "TESTBRIDGE_TEST_ONLY";
1721

1822
/**
19-
* This is the name of the system property used to pass Bazel's workspace name
23+
* This is the name of the system property used to pass the main workspace name
2024
*/
21-
private static final String RULES_SCALA_WS = "RULES_SCALA_WS";
25+
private static final String RULES_SCALA_MAIN_WS_NAME = "RULES_SCALA_MAIN_WS_NAME";
2226

2327
/**
2428
* This is the name of the system property used to pass a short path of the file, which includes
@@ -31,32 +35,26 @@ public static void main(String[] args) throws IOException {
3135
}
3236

3337
private static String[] extendArgs(String[] args, Map<String, String> env) throws IOException {
34-
args = extendFromSystemPropArgs(args);
38+
args = extendFromFileArgs(args);
3539
args = extendFromEnvVar(args, env, TESTBRIDGE_TEST_ONLY, "-s");
3640
return args;
3741
}
3842

39-
private static String[] extendFromSystemPropArgs(String[] args) throws IOException {
40-
String rulesWorkspace = System.getProperty(RULES_SCALA_WS);
41-
if (rulesWorkspace == null || rulesWorkspace.trim().isEmpty())
42-
throw new IllegalArgumentException(RULES_SCALA_WS + " is null or empty.");
43-
44-
String rulesArgsKey = System.getProperty(RULES_SCALA_ARGS_FILE);
45-
if (rulesArgsKey == null || rulesArgsKey.trim().isEmpty())
43+
private static String[] extendFromFileArgs(String[] args) throws IOException {
44+
String runnerArgsFileKey = System.getProperty(RULES_SCALA_ARGS_FILE);
45+
if (runnerArgsFileKey == null || runnerArgsFileKey.trim().isEmpty())
4646
throw new IllegalArgumentException(RULES_SCALA_ARGS_FILE + " is null or empty.");
4747

48-
String rulesArgsPath = Runfiles.create().rlocation(rulesWorkspace + "/" + rulesArgsKey);
49-
if (rulesArgsPath == null)
50-
throw new IllegalArgumentException("rlocation value is null for key: " + rulesArgsKey);
48+
String workspace = System.getProperty(RULES_SCALA_MAIN_WS_NAME);
49+
if (workspace == null || workspace.trim().isEmpty())
50+
throw new IllegalArgumentException(RULES_SCALA_MAIN_WS_NAME + " is null or empty.");
5151

52-
List<String> runnerArgs = Files.readAllLines(Paths.get(rulesArgsPath), Charset.forName("UTF-8"));
52+
String runnerArgsFilePath = Runfiles.create().rlocation(workspace + "/" + runnerArgsFileKey);
53+
if (runnerArgsFilePath == null)
54+
throw new IllegalArgumentException("rlocation value is null for key: " + runnerArgsFileKey);
5355

54-
int runpathFlag = runnerArgs.indexOf("-R");
55-
if (runpathFlag >= 0) {
56-
String runpathKey = runnerArgs.get(runpathFlag + 1);
57-
String runpath = Runfiles.create().rlocation(rulesWorkspace + "/" + runpathKey);
58-
runnerArgs.set(runpathFlag + 1, runpath);
59-
}
56+
List<String> runnerArgs = Files.readAllLines(Paths.get(runnerArgsFilePath), Charset.forName("UTF-8"));
57+
rlocateRunpathValue(workspace, runnerArgs);
6058

6159
String[] runnerArgsArray = runnerArgs.toArray(new String[runnerArgs.size()]);
6260

@@ -73,12 +71,28 @@ private static String[] extendFromEnvVar(
7371
if (value == null) {
7472
return args;
7573
}
76-
;
7774
String[] flag = new String[] {flagName, value};
7875
String[] result = new String[args.length + flag.length];
7976
System.arraycopy(args, 0, result, 0, args.length);
8077
System.arraycopy(flag, 0, result, args.length, flag.length);
8178

8279
return result;
8380
}
81+
82+
/**
83+
* Replaces ScalaTest Runner's runpath elements paths (see http://www.scalatest.org/user_guide/using_the_runner)
84+
* with values from Bazel's runfiles
85+
*/
86+
private static void rlocateRunpathValue(String rulesWorkspace, List<String> runnerArgs) throws IOException {
87+
int runpathFlag = runnerArgs.indexOf("-R");
88+
if (runpathFlag >= 0) {
89+
String[] runpathElements = runnerArgs.get(runpathFlag + 1).split(File.pathSeparator);
90+
Runfiles runfiles = Runfiles.create();
91+
for (int i = 0; i < runpathElements.length; i++) {
92+
runpathElements[i] = runfiles.rlocation(rulesWorkspace + "/" + runpathElements[i]);
93+
}
94+
String runpath = String.join(File.separator, runpathElements);
95+
runnerArgs.set(runpathFlag + 1, runpath);
96+
}
97+
}
8498
}

src/java/io/bazel/rulesscala/scalac/ScalacProcessor.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import scala.tools.nsc.reporters.ConsoleReporter;
2323

2424
class ScalacProcessor implements Processor {
25+
private static boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows");
26+
2527
/** This is the reporter field for scalac, which we want to access */
2628
private static Field reporterField;
2729

@@ -251,7 +253,7 @@ private static void removeTmp(Path tmp) throws IOException {
251253
@Override
252254
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
253255
throws IOException {
254-
file.toFile().setWritable(true);
256+
if (isWindows) file.toFile().setWritable(true);
255257
Files.delete(file);
256258
return FileVisitResult.CONTINUE;
257259
}
@@ -288,11 +290,12 @@ private static void copyResources(
288290
} else {
289291
dstr = resource.destination;
290292
}
291-
if (dstr.charAt(0) == '/' || dstr.charAt(0) == '\\') {
293+
294+
if (dstr.charAt(0) == '/') {
292295
// we don't want to copy to an absolute destination
293296
dstr = dstr.substring(1);
294297
}
295-
if (dstr.startsWith("../") || dstr.startsWith("..\\")) {
298+
if (dstr.startsWith("../")) {
296299
// paths to external repositories, for some reason, start with a leading ../
297300
// we don't want to copy the resource out of our temporary directory, so
298301
// instead we replace ../ with external/

0 commit comments

Comments
 (0)