From f57d669786a41a9defdf7b07e991ec1c9250ccbe Mon Sep 17 00:00:00 2001 From: Gary Roumanis Date: Mon, 28 Jan 2019 14:17:11 -0800 Subject: [PATCH] Various Windows fixes --- build_daemon/CHANGELOG.md | 6 ++++++ build_daemon/lib/constants.dart | 21 +++++++++++++-------- build_daemon/lib/src/daemon.dart | 9 ++++++--- build_daemon/pubspec.yaml | 2 +- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/build_daemon/CHANGELOG.md b/build_daemon/CHANGELOG.md index 05eaee6d3..3e910911c 100644 --- a/build_daemon/CHANGELOG.md +++ b/build_daemon/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.2.1 + +- Resolve issues with running on Windows. + - Close the lock file prior to deleting it. + - Properly join paths and escape the workspace. + ## 0.2.0 - Support custom build results. diff --git a/build_daemon/lib/constants.dart b/build_daemon/lib/constants.dart index b5dacd55b..2b45c5c80 100644 --- a/build_daemon/lib/constants.dart +++ b/build_daemon/lib/constants.dart @@ -3,33 +3,38 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:io'; +import 'package:path/path.dart' as p; const readyToConnectLog = 'READY TO CONNECT'; const versionSkew = 'DIFFERENT RUNNING VERSION'; const optionsSkew = 'DIFFERENT OPTIONS'; // TODO(grouma) - use pubspec version when this is open sourced. -const currentVersion = '3.0.0'; +const currentVersion = '4.0.0'; var _username = Platform.environment['USER'] ?? ''; String daemonWorkspace(String workingDirectory) { - var prefix = '${Directory.systemTemp.path}'; - if (_username.isNotEmpty) prefix += '/$_username'; - return '$prefix/dart_build_daemon/${workingDirectory.replaceAll("/", "_")}'; + var segments = [Directory.systemTemp.path]; + if (_username.isNotEmpty) segments.add(_username); + segments.add(workingDirectory + .replaceAll('/', '_') + .replaceAll(':', '_') + .replaceAll('\\', '_')); + return p.joinAll(segments); } /// Used to ensure that only one instance of this daemon is running at a time. String lockFilePath(String workingDirectory) => - '${daemonWorkspace(workingDirectory)}/.dart_build_lock'; + p.join(daemonWorkspace(workingDirectory), '.dart_build_lock'); /// Used to signal to clients on what port the running daemon is listening. String portFilePath(String workingDirectory) => - '${daemonWorkspace(workingDirectory)}/.dart_build_daemon_port'; + p.join(daemonWorkspace(workingDirectory), '.dart_build_daemon_port'); /// Used to signal to clients the current version of the build daemon. String versionFilePath(String workingDirectory) => - '${daemonWorkspace(workingDirectory)}/.dart_build_daemon_version'; + p.join(daemonWorkspace(workingDirectory), '.dart_build_daemon_version'); /// Used to signal to clients the current set of options of the build daemon. String optionsFilePath(String workingDirectory) => - '${daemonWorkspace(workingDirectory)}/.dart_build_daemon_options'; + p.join(daemonWorkspace(workingDirectory), '.dart_build_daemon_options'); diff --git a/build_daemon/lib/src/daemon.dart b/build_daemon/lib/src/daemon.dart index a11b5a943..1f998d1b8 100644 --- a/build_daemon/lib/src/daemon.dart +++ b/build_daemon/lib/src/daemon.dart @@ -39,6 +39,7 @@ class Daemon { Server _server; StreamSubscription _sub; + RandomAccessFile _lock; Daemon(this._workingDirectory); @@ -67,9 +68,9 @@ class Daemon { bool tryGetLock() { try { _createDaemonWorkspace(); - File(lockFilePath(_workingDirectory)) - .openSync(mode: FileMode.write) - .lockSync(); + _lock = + File(lockFilePath(_workingDirectory)).openSync(mode: FileMode.write); + _lock.lockSync(); return true; } on FileSystemException { return false; @@ -79,6 +80,8 @@ class Daemon { Future _cleanUp() async { await _server?.stop(); await _sub?.cancel(); + // We need to close the lock prior to deleting the file. + _lock?.closeSync(); var workspace = Directory(daemonWorkspace(_workingDirectory)); if (workspace.existsSync()) { workspace.deleteSync(recursive: true); diff --git a/build_daemon/pubspec.yaml b/build_daemon/pubspec.yaml index 158854b3a..433a33577 100644 --- a/build_daemon/pubspec.yaml +++ b/build_daemon/pubspec.yaml @@ -1,5 +1,5 @@ name: build_daemon -version: 0.2.0 +version: 0.2.1 description: A daemon for running Dart builds. author: Dart Team homepage: https://github.com/dart-lang/build/tree/master/build_daemon