From 735789b9f610247608444b6dae7254ddb16a79ee Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Tue, 24 Apr 2018 15:20:05 -0700 Subject: [PATCH 1/3] Avoid manipulating executable paths as URIs --- lib/src/dart.dart | 6 +++--- lib/src/entrypoint.dart | 5 ++--- lib/src/global_packages.dart | 5 ++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/src/dart.dart b/lib/src/dart.dart index d445b20f7..7c4278b5f 100644 --- a/lib/src/dart.dart +++ b/lib/src/dart.dart @@ -51,11 +51,11 @@ class _DirectiveCollector extends GeneralizingAstVisitor { /// /// If [name] is passed, it is used to describe the executable in logs and error /// messages. -Future snapshot(Uri executableUrl, String snapshotPath, +Future snapshot(String executablePath, String snapshotPath, {Uri packagesFile, String name}) async { - name = log.bold(name ?? executableUrl.toString()); + name = log.bold(name ?? executablePath); - var args = ['--snapshot=$snapshotPath', executableUrl.toString()]; + var args = ['--snapshot=$snapshotPath', executablePath]; if (packagesFile != null) args.insert(0, "--packages=$packagesFile"); var result = await runProcess(Platform.executable, args); diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart index a05550c06..d6ec3ec57 100644 --- a/lib/src/entrypoint.dart +++ b/lib/src/entrypoint.dart @@ -286,10 +286,9 @@ class Entrypoint { var dir = p.join(_snapshotPath, package); cleanDir(dir); return waitAndPrintErrors(executables[package].map((path) { - var url = p.toUri(packageGraph.packages[package].dir); - url = url.replace(path: p.url.join(url.path, path)); + var fullPath = p.join(packageGraph.packages[package].dir, path); return dart.snapshot( - url, p.join(dir, p.url.basename(path) + '.snapshot'), + fullPath, p.join(dir, p.url.basename(path) + '.snapshot'), packagesFile: p.toUri(packagesFile), name: '$package:${p.url.basenameWithoutExtension(path)}'); })); diff --git a/lib/src/global_packages.dart b/lib/src/global_packages.dart index 173756dad..cf4b7249e 100644 --- a/lib/src/global_packages.dart +++ b/lib/src/global_packages.dart @@ -231,11 +231,10 @@ class GlobalPackages { var package = entrypoint.packageGraph.packages[packageName]; var precompiled = {}; await waitAndPrintErrors(package.executableIds.map((path) async { - var url = p.toUri(package.dir); - url = url.replace(path: p.url.join(url.path, path)); + var fullPath = p.join(package.dir, path); var basename = p.url.basename(path); var snapshotPath = p.join(binDir, '$basename.snapshot'); - await dart.snapshot(url, snapshotPath, + await dart.snapshot(fullPath, snapshotPath, packagesFile: p.toUri(_getPackagesFilePath(package.name)), name: '${package.name}:${p.url.basenameWithoutExtension(path)}'); precompiled[p.withoutExtension(basename)] = snapshotPath; From 5562fb2f57ea5eb50b0a3cdb0c111b00cb8d081d Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Tue, 24 Apr 2018 15:26:47 -0700 Subject: [PATCH 2/3] More uses of p.url --- lib/src/dart.dart | 6 +++--- lib/src/entrypoint.dart | 8 ++++---- lib/src/global_packages.dart | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/src/dart.dart b/lib/src/dart.dart index 7c4278b5f..c94fbd4ef 100644 --- a/lib/src/dart.dart +++ b/lib/src/dart.dart @@ -45,18 +45,18 @@ class _DirectiveCollector extends GeneralizingAstVisitor { /// Snapshots the Dart executable at [executableUrl] to a snapshot at /// [snapshotPath]. /// -/// If [packagesFile] is passed, it's used to resolve `package:` URIs in the +/// If [packagesFilePath] is passed, it's used to resolve `package:` URIs in the /// executable. Otherwise, a `packages/` directory or a package spec is inferred /// from the executable's location. /// /// If [name] is passed, it is used to describe the executable in logs and error /// messages. Future snapshot(String executablePath, String snapshotPath, - {Uri packagesFile, String name}) async { + {String packagesFilePath, String name}) async { name = log.bold(name ?? executablePath); var args = ['--snapshot=$snapshotPath', executablePath]; - if (packagesFile != null) args.insert(0, "--packages=$packagesFile"); + if (packagesFilePath != null) args.insert(0, "--packages=$packagesFilePath"); var result = await runProcess(Platform.executable, args); if (result.success) { diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart index d6ec3ec57..16836ca2d 100644 --- a/lib/src/entrypoint.dart +++ b/lib/src/entrypoint.dart @@ -288,9 +288,9 @@ class Entrypoint { return waitAndPrintErrors(executables[package].map((path) { var fullPath = p.join(packageGraph.packages[package].dir, path); return dart.snapshot( - fullPath, p.join(dir, p.url.basename(path) + '.snapshot'), - packagesFile: p.toUri(packagesFile), - name: '$package:${p.url.basenameWithoutExtension(path)}'); + fullPath, p.join(dir, p.basename(path) + '.snapshot'), + packagesFilePath: packagesFile, + name: '$package:${p.basenameWithoutExtension(path)}'); })); })); } @@ -352,7 +352,7 @@ class Entrypoint { // some executables do exist and some do not, the directory is corrupted and // it's good to start from scratch anyway. var executablesExist = executables.every((executable) => fileExists(p.join( - _snapshotPath, packageName, "${p.url.basename(executable)}.snapshot"))); + _snapshotPath, packageName, "${p.basename(executable)}.snapshot"))); if (!executablesExist) return executables; // Otherwise, we don't need to recompile. diff --git a/lib/src/global_packages.dart b/lib/src/global_packages.dart index cf4b7249e..8f1cf4a4a 100644 --- a/lib/src/global_packages.dart +++ b/lib/src/global_packages.dart @@ -232,11 +232,11 @@ class GlobalPackages { var precompiled = {}; await waitAndPrintErrors(package.executableIds.map((path) async { var fullPath = p.join(package.dir, path); - var basename = p.url.basename(path); + var basename = p.basename(path); var snapshotPath = p.join(binDir, '$basename.snapshot'); await dart.snapshot(fullPath, snapshotPath, - packagesFile: p.toUri(_getPackagesFilePath(package.name)), - name: '${package.name}:${p.url.basenameWithoutExtension(path)}'); + packagesFilePath: _getPackagesFilePath(package.name), + name: '${package.name}:${p.basenameWithoutExtension(path)}'); precompiled[p.withoutExtension(basename)] = snapshotPath; })); return precompiled; From 13e868cd414d3d1c1886f4529d9c2efaa96dd588 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Tue, 24 Apr 2018 16:02:05 -0700 Subject: [PATCH 3/3] Keep URIs but move path join Rename exectuableIds --- lib/src/command/deps.dart | 2 +- lib/src/dart.dart | 12 ++++++------ lib/src/entrypoint.dart | 9 ++++----- lib/src/global_packages.dart | 10 +++++----- lib/src/package.dart | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/src/command/deps.dart b/lib/src/command/deps.dart index 7e3afac3e..99a6de5ba 100644 --- a/lib/src/command/deps.dart +++ b/lib/src/command/deps.dart @@ -275,7 +275,7 @@ class DepsCommand extends PubCommand { /// Lists all Dart files in the `bin` directory of the [package]. /// /// Returns file names without extensions. - List _getExecutablesFor(Package package) => package.executableIds + List _getExecutablesFor(Package package) => package.executablePaths .where((e) => _isDartExecutable(p.absolute(package.dir, e))) .map((e) => p.basenameWithoutExtension(e)); diff --git a/lib/src/dart.dart b/lib/src/dart.dart index c94fbd4ef..d445b20f7 100644 --- a/lib/src/dart.dart +++ b/lib/src/dart.dart @@ -45,18 +45,18 @@ class _DirectiveCollector extends GeneralizingAstVisitor { /// Snapshots the Dart executable at [executableUrl] to a snapshot at /// [snapshotPath]. /// -/// If [packagesFilePath] is passed, it's used to resolve `package:` URIs in the +/// If [packagesFile] is passed, it's used to resolve `package:` URIs in the /// executable. Otherwise, a `packages/` directory or a package spec is inferred /// from the executable's location. /// /// If [name] is passed, it is used to describe the executable in logs and error /// messages. -Future snapshot(String executablePath, String snapshotPath, - {String packagesFilePath, String name}) async { - name = log.bold(name ?? executablePath); +Future snapshot(Uri executableUrl, String snapshotPath, + {Uri packagesFile, String name}) async { + name = log.bold(name ?? executableUrl.toString()); - var args = ['--snapshot=$snapshotPath', executablePath]; - if (packagesFilePath != null) args.insert(0, "--packages=$packagesFilePath"); + var args = ['--snapshot=$snapshotPath', executableUrl.toString()]; + if (packagesFile != null) args.insert(0, "--packages=$packagesFile"); var result = await runProcess(Platform.executable, args); if (result.success) { diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart index 16836ca2d..b44cc062f 100644 --- a/lib/src/entrypoint.dart +++ b/lib/src/entrypoint.dart @@ -286,10 +286,9 @@ class Entrypoint { var dir = p.join(_snapshotPath, package); cleanDir(dir); return waitAndPrintErrors(executables[package].map((path) { - var fullPath = p.join(packageGraph.packages[package].dir, path); - return dart.snapshot( - fullPath, p.join(dir, p.basename(path) + '.snapshot'), - packagesFilePath: packagesFile, + var url = p.toUri(p.join(packageGraph.packages[package].dir, path)); + return dart.snapshot(url, p.join(dir, p.basename(path) + '.snapshot'), + packagesFile: p.toUri(packagesFile), name: '$package:${p.basenameWithoutExtension(path)}'); })); })); @@ -342,7 +341,7 @@ class Entrypoint { if (!dirExists(binDir)) return []; if (packageGraph.isPackageMutable(packageName)) return []; - var executables = package.executableIds; + var executables = package.executablePaths; // If any executables don't exist, recompile all executables. // diff --git a/lib/src/global_packages.dart b/lib/src/global_packages.dart index 8f1cf4a4a..84cb087bb 100644 --- a/lib/src/global_packages.dart +++ b/lib/src/global_packages.dart @@ -230,13 +230,13 @@ class GlobalPackages { // possible. This is faster and produces better error messages. var package = entrypoint.packageGraph.packages[packageName]; var precompiled = {}; - await waitAndPrintErrors(package.executableIds.map((path) async { - var fullPath = p.join(package.dir, path); + await waitAndPrintErrors(package.executablePaths.map((path) async { + var url = p.toUri(p.join(package.dir, path)); var basename = p.basename(path); var snapshotPath = p.join(binDir, '$basename.snapshot'); - await dart.snapshot(fullPath, snapshotPath, - packagesFilePath: _getPackagesFilePath(package.name), - name: '${package.name}:${p.basenameWithoutExtension(path)}'); + await dart.snapshot(url, snapshotPath, + packagesFile: p.toUri(_getPackagesFilePath(package.name)), + name: '${package.name}:${p.url.basenameWithoutExtension(path)}'); precompiled[p.withoutExtension(basename)] = snapshotPath; })); return precompiled; diff --git a/lib/src/package.dart b/lib/src/package.dart index 254028d4a..66706f70f 100644 --- a/lib/src/package.dart +++ b/lib/src/package.dart @@ -69,7 +69,7 @@ class Package { /// Returns a list of asset ids for all Dart executables in this package's bin /// directory. - List get executableIds { + List get executablePaths { return ordered(listFiles(beneath: "bin", recursive: false)) .where((executable) => p.extension(executable) == '.dart') .map((executable) => p.relative(executable, from: dir))