Skip to content

Commit 61208df

Browse files
Merge pull request #387 from Workiva/fix_paths_for_windows__backpatch_3.7
Fixes for Windows compatibility (backpatch to 3.7.x)
2 parents 6940542 + 26e3933 commit 61208df

12 files changed

+150
-44
lines changed

lib/src/executable.dart

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,42 @@ import 'dart:io';
44
import 'package:analyzer/dart/analysis/utilities.dart';
55
import 'package:args/command_runner.dart';
66
import 'package:dart_dev/dart_dev.dart';
7-
import 'package:dart_dev/src/dart_dev_tool.dart';
8-
import 'package:dart_dev/src/utils/format_tool_builder.dart';
9-
import 'package:dart_dev/src/utils/parse_flag_from_args.dart';
107
import 'package:io/ansi.dart';
118
import 'package:io/io.dart' show ExitCode;
129
import 'package:logging/logging.dart';
1310
import 'package:path/path.dart' as p;
1411

15-
import '../utils.dart';
1612
import 'dart_dev_runner.dart';
1713
import 'tools/over_react_format_tool.dart';
1814
import 'utils/assert_dir_is_dart_package.dart';
15+
import 'utils/cached_pubspec.dart';
16+
import 'utils/dart_dev_paths.dart';
1917
import 'utils/dart_tool_cache.dart';
2018
import 'utils/ensure_process_exit.dart';
19+
import 'utils/format_tool_builder.dart';
2120
import 'utils/logging.dart';
21+
import 'utils/parse_flag_from_args.dart';
2222

2323
typedef _ConfigGetter = Map<String, DevTool> Function();
2424

25-
final _runScriptPath = p.join(cacheDirPath, 'run.dart');
25+
final paths = DartDevPaths();
2626

27-
final _runScript = File(_runScriptPath);
28-
29-
const _configPath = 'tool/dart_dev/config.dart';
30-
31-
const _oldDevDartPath = 'tool/dev.dart';
32-
33-
final _relativeDevDartPath = p.relative(
34-
p.absolute(_configPath),
35-
from: p.absolute(p.dirname(_runScriptPath)),
36-
);
27+
final _runScript = File(paths.runScript);
3728

3829
Future<void> run(List<String> args) async {
3930
attachLoggerToStdio(args);
40-
final configExists = File(_configPath).existsSync();
41-
final oldDevDartExists = File(_oldDevDartPath).existsSync();
31+
32+
final configExists = File(paths.config).existsSync();
33+
final oldDevDartExists = File(paths.legacyConfig).existsSync();
4234

4335
if (!configExists) {
44-
log.fine('No custom `tool/dart_dev/config.dart` file found; '
36+
log.fine('No custom `${paths.config}` file found; '
4537
'using default config.');
4638
}
4739
if (oldDevDartExists) {
4840
log.warning(yellow.wrap(
49-
'dart_dev v3 now expects configuration to be at `$_configPath`,\n'
50-
'but `$_oldDevDartPath` still exists. View the guide to see how to upgrade:\n'
41+
'dart_dev v3 now expects configuration to be at `${paths.config}`,\n'
42+
'but `${paths.legacyConfig}` still exists. View the guide to see how to upgrade:\n'
5143
'https://github.com/Workiva/dart_dev/blob/master/doc/v3-upgrade-guide.md'));
5244
}
5345

@@ -59,7 +51,7 @@ Future<void> run(List<String> args) async {
5951

6052
generateRunScript();
6153
final process = await Process.start(
62-
Platform.executable, [_runScriptPath, ...args],
54+
Platform.executable, [paths.runScript, ...args],
6355
mode: ProcessStartMode.inheritStdio);
6456
ensureProcessExit(process);
6557
exitCode = await process.exitCode;
@@ -69,7 +61,7 @@ Future<void> handleFastFormat(List<String> args) async {
6961
assertDirIsDartPackage();
7062

7163
DevTool formatTool;
72-
final configFile = File(_configPath);
64+
final configFile = File(paths.config);
7365
if (configFile.existsSync()) {
7466
final toolBuilder = FormatToolBuilder();
7567
parseString(content: configFile.readAsStringSync())
@@ -115,13 +107,13 @@ bool get shouldWriteRunScript =>
115107
_runScript.readAsStringSync() != buildDartDevRunScriptContents();
116108

117109
String buildDartDevRunScriptContents() {
118-
final hasCustomToolDevDart = File(_configPath).existsSync();
110+
final hasCustomToolDevDart = File(paths.config).existsSync();
119111
return '''
120112
import 'dart:io';
121113
122114
import 'package:dart_dev/src/core_config.dart';
123115
import 'package:dart_dev/src/executable.dart' as executable;
124-
${hasCustomToolDevDart ? "import '$_relativeDevDartPath' as custom_dev;" : ""}
116+
${hasCustomToolDevDart ? "import '${paths.configFromRunScriptForDart}' as custom_dev;" : ""}
125117
126118
void main(List<String> args) async {
127119
await executable.runWithConfig(args,
@@ -146,8 +138,7 @@ Future<void> runWithConfig(
146138
config = configGetter();
147139
} catch (error) {
148140
stderr
149-
..writeln(
150-
'Invalid "tool/dart_dev/config.dart" in ${p.absolute(p.current)}')
141+
..writeln('Invalid "${paths.config}" in ${p.absolute(p.current)}')
151142
..writeln()
152143
..writeln('It should provide a `Map<String, DevTool> config;` getter,'
153144
' but it either does not exist or threw unexpectedly:')

lib/src/tools/analyze_tool.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:logging/logging.dart';
88
import '../dart_dev_tool.dart';
99
import '../utils/arg_results_utils.dart';
1010
import '../utils/assert_no_positional_args_nor_args_after_separator.dart';
11+
import '../utils/executables.dart' as exe;
1112
import '../utils/logging.dart';
1213
import '../utils/process_declaration.dart';
1314
import '../utils/run_process_and_ensure_exit.dart';
@@ -161,7 +162,7 @@ ProcessDeclaration buildProcess(
161162
verbose: context.verbose);
162163
final entrypoints = buildEntrypoints(include: include, root: path);
163164
logCommand(args, entrypoints, verbose: context.verbose);
164-
return ProcessDeclaration('dartanalyzer', [...args, ...entrypoints],
165+
return ProcessDeclaration(exe.dartanalyzer, [...args, ...entrypoints],
165166
mode: ProcessStartMode.inheritStdio);
166167
}
167168

lib/src/tools/format_tool.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import '../../utils.dart';
1212
import '../dart_dev_tool.dart';
1313
import '../utils/arg_results_utils.dart';
1414
import '../utils/assert_no_positional_args_nor_args_after_separator.dart';
15+
import '../utils/executables.dart' as exe;
1516
import '../utils/logging.dart';
1617
import '../utils/organize_directives/organize_directives_in_paths.dart';
1718
import '../utils/package_is_immediate_dependency.dart';
@@ -537,10 +538,10 @@ FormatExecution buildExecution(
537538
ProcessDeclaration buildFormatProcess([Formatter formatter]) {
538539
switch (formatter) {
539540
case Formatter.dartStyle:
540-
return ProcessDeclaration('pub', ['run', 'dart_style:format']);
541+
return ProcessDeclaration(exe.pub, ['run', 'dart_style:format']);
541542
case Formatter.dartfmt:
542543
default:
543-
return ProcessDeclaration('dartfmt', []);
544+
return ProcessDeclaration(exe.dartfmt, []);
544545
}
545546
}
546547

lib/src/tools/over_react_format_tool.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:dart_dev/dart_dev.dart';
55
import 'package:dart_dev/utils.dart';
66

77
import '../tools/format_tool.dart';
8+
import '../utils/executables.dart' as exe;
89

910
class OverReactFormatTool extends DevTool {
1011
/// Wrap lines longer than this.
@@ -31,9 +32,9 @@ class OverReactFormatTool extends DevTool {
3132
'over_react_format',
3233
if (lineLength != null) '--line-length=$lineLength'
3334
];
34-
final process = ProcessDeclaration('pub', [...args, ...paths],
35+
final process = ProcessDeclaration(exe.pub, [...args, ...paths],
3536
mode: ProcessStartMode.inheritStdio);
36-
logCommand('pub', paths, args, verbose: context?.verbose);
37+
logCommand(exe.pub, paths, args, verbose: context?.verbose);
3738
return runProcessAndEnsureExit(process);
3839
}
3940
}

lib/src/tools/test_tool.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:logging/logging.dart';
99

1010
import '../dart_dev_tool.dart';
1111
import '../utils/arg_results_utils.dart';
12+
import '../utils/executables.dart' as exe;
1213
import '../utils/logging.dart';
1314
import '../utils/package_is_immediate_dependency.dart';
1415
import '../utils/process_declaration.dart';
@@ -315,7 +316,7 @@ TestExecution buildExecution(
315316
verbose: context.verbose);
316317
logSubprocessHeader(_log, 'pub ${args.join(' ')}'.trim());
317318
return TestExecution.process(
318-
ProcessDeclaration('pub', args, mode: ProcessStartMode.inheritStdio));
319+
ProcessDeclaration(exe.pub, args, mode: ProcessStartMode.inheritStdio));
319320
}
320321

321322
// NOTE: This currently depends on https://github.com/dart-lang/build/pull/2445

lib/src/tools/tuneup_check_tool.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:logging/logging.dart';
99
import '../dart_dev_tool.dart';
1010
import '../utils/arg_results_utils.dart';
1111
import '../utils/assert_no_positional_args_nor_args_after_separator.dart';
12+
import '../utils/executables.dart' as exe;
1213
import '../utils/logging.dart';
1314
import '../utils/package_is_immediate_dependency.dart';
1415
import '../utils/process_declaration.dart';
@@ -152,5 +153,5 @@ TuneupExecution buildExecution(
152153
verbose: context.verbose);
153154
logSubprocessHeader(_log, 'pub ${args.join(' ')}');
154155
return TuneupExecution.process(
155-
ProcessDeclaration('pub', args, mode: ProcessStartMode.inheritStdio));
156+
ProcessDeclaration(exe.pub, args, mode: ProcessStartMode.inheritStdio));
156157
}

lib/src/tools/webdev_serve_tool.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:pub_semver/pub_semver.dart';
1010
import '../dart_dev_tool.dart';
1111
import '../utils/arg_results_utils.dart';
1212
import '../utils/assert_no_positional_args_nor_args_after_separator.dart';
13+
import '../utils/executables.dart' as exe;
1314
import '../utils/global_package_is_active_and_compatible.dart';
1415
import '../utils/logging.dart';
1516
import '../utils/process_declaration.dart';
@@ -226,5 +227,5 @@ WebdevServeExecution buildExecution(
226227
verbose: context.verbose);
227228
logSubprocessHeader(_log, 'pub ${args.join(' ')}'.trim());
228229
return WebdevServeExecution.process(
229-
ProcessDeclaration('pub', args, mode: ProcessStartMode.inheritStdio));
230+
ProcessDeclaration(exe.pub, args, mode: ProcessStartMode.inheritStdio));
230231
}

lib/src/utils/dart_dev_paths.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'package:path/path.dart' as p;
2+
3+
/// A collection of paths to files and directories constructed to be compatible
4+
/// with a given [p.Context].
5+
class DartDevPaths {
6+
final p.Context _context;
7+
8+
DartDevPaths({p.Context context}) : _context = context ?? p.context;
9+
10+
String cache([String subPath]) => _context.normalize(
11+
_context.joinAll([..._cacheParts, if (subPath != null) subPath]));
12+
13+
String get _cacheForDart => p.url.joinAll(_cacheParts);
14+
15+
final List<String> _cacheParts = ['.dart_tool', 'dart_dev'];
16+
17+
String get config => _context.joinAll(_configParts);
18+
19+
String get configForDart => p.url.joinAll(_configParts);
20+
21+
final List<String> _configParts = ['tool', 'dart_dev', 'config.dart'];
22+
23+
String get configFromRunScriptForDart => p.url.relative(
24+
p.url.absolute(configForDart),
25+
from: p.url.absolute(_cacheForDart),
26+
);
27+
28+
String get legacyConfig => _context.join('tool', 'dev.dart');
29+
30+
String get runScript => cache('run.dart');
31+
}

lib/src/utils/dart_tool_cache.dart

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
import 'dart:io';
22

3-
import 'package:path/path.dart' as p;
4-
5-
const cacheDirPath = '.dart_tool/dart_dev';
3+
import 'package:dart_dev/src/utils/dart_dev_paths.dart';
64

75
void createCacheDir({String subPath}) {
8-
var path = cacheDirPath;
9-
if (subPath != null) {
10-
path = p.join(path, subPath);
11-
}
12-
final dir = Directory(path);
6+
final dir = Directory(DartDevPaths().cache(subPath));
137
if (!dir.existsSync()) {
148
dir.createSync(recursive: true);
159
}

lib/src/utils/executables.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import 'dart:io';
2+
3+
final dart = 'dart';
4+
5+
final dartanalyzer = Platform.isWindows ? 'dartanalyzer.bat' : 'dartanalyzer';
6+
7+
final dartfmt = Platform.isWindows ? 'dartfmt.bat' : 'dartfmt';
8+
9+
final pub = Platform.isWindows ? 'pub.bat' : 'pub';

0 commit comments

Comments
 (0)