OLD | NEW |
1 library pub.executable; | 1 library pub.executable; |
2 import 'dart:async'; | 2 import 'dart:async'; |
3 import 'dart:io'; | 3 import 'dart:io'; |
4 import 'package:barback/barback.dart'; | 4 import 'package:barback/barback.dart'; |
5 import 'package:path/path.dart' as p; | 5 import 'package:path/path.dart' as p; |
6 import 'package:stack_trace/stack_trace.dart'; | 6 import 'package:stack_trace/stack_trace.dart'; |
7 import 'barback/asset_environment.dart'; | 7 import 'barback/asset_environment.dart'; |
8 import 'entrypoint.dart'; | 8 import 'entrypoint.dart'; |
9 import 'exit_codes.dart' as exit_codes; | 9 import 'exit_codes.dart' as exit_codes; |
10 import 'io.dart'; | 10 import 'io.dart'; |
11 import 'log.dart' as log; | 11 import 'log.dart' as log; |
12 import 'utils.dart'; | 12 import 'utils.dart'; |
13 Future<int> runExecutable(Entrypoint entrypoint, String package, | 13 Future<int> runExecutable(Entrypoint entrypoint, String package, |
14 String executable, Iterable<String> args, {bool isGlobal: false, | 14 String executable, Iterable<String> args, {bool isGlobal: false, |
15 BarbackMode mode}) { | 15 BarbackMode mode}) { |
16 final completer0 = new Completer(); | 16 final completer0 = new Completer(); |
17 scheduleMicrotask(() { | 17 scheduleMicrotask(() { |
18 try { | 18 try { |
19 join0() { | 19 join0() { |
20 join1() { | 20 join1() { |
21 join2() { | 21 join2() { |
22 var localSnapshotPath = | |
23 p.join(".pub", "bin", package, "${executable}.dart.snapshot"); | |
24 join3() { | 22 join3() { |
25 var rootDir = "bin"; | 23 var localSnapshotPath = |
26 var parts = p.split(executable); | 24 p.join(".pub", "bin", package, "${executable}.dart.snapshot"); |
27 join4() { | 25 join4() { |
28 AssetEnvironment.create( | 26 var rootDir = "bin"; |
29 entrypoint, | 27 var parts = p.split(executable); |
30 mode, | 28 join5() { |
31 useDart2JS: false).then((x0) { | 29 var assetPath = "${p.url.joinAll(p.split(executable))}.dart"; |
32 try { | 30 var id = new AssetId(package, assetPath); |
33 var environment = x0; | 31 AssetEnvironment.create( |
34 environment.barback.errors.listen(((error) { | 32 entrypoint, |
35 log.error(log.red("Build error:\n$error")); | 33 mode, |
36 })); | 34 useDart2JS: false, |
37 var server; | 35 entrypoints: [id]).then((x0) { |
38 join5() { | 36 try { |
39 var assetPath = | 37 var environment = x0; |
40 "${p.url.joinAll(p.split(executable))}.dart"; | 38 environment.barback.errors.listen(((error) { |
41 var id = new AssetId(server.package, assetPath); | 39 log.error(log.red("Build error:\n$error")); |
42 completer0.complete( | 40 })); |
43 environment.barback.getAssetById(id).then(((_) { | 41 var server; |
44 final completer0 = new Completer(); | 42 join6() { |
45 scheduleMicrotask(() { | 43 completer0.complete( |
| 44 environment.barback.getAssetById(id).then(((_) { |
| 45 final completer0 = new Completer(); |
| 46 scheduleMicrotask(() { |
| 47 try { |
| 48 var vmArgs = []; |
| 49 vmArgs.add("--checked"); |
| 50 var relativePath = |
| 51 p.url.relative(assetPath, from: p.url.joinAll(
p.split(server.rootDirectory))); |
| 52 vmArgs.add( |
| 53 server.url.resolve(relativePath).toString()); |
| 54 vmArgs.addAll(args); |
| 55 Process.start( |
| 56 Platform.executable, |
| 57 vmArgs).then((x0) { |
| 58 try { |
| 59 var process = x0; |
| 60 process.stderr.listen(stderr.add); |
| 61 process.stdout.listen(stdout.add); |
| 62 stdin.listen(process.stdin.add); |
| 63 completer0.complete(process.exitCode); |
| 64 } catch (e0) { |
| 65 completer0.completeError(e0); |
| 66 } |
| 67 }, onError: (e1) { |
| 68 completer0.completeError(e1); |
| 69 }); |
| 70 } catch (e2) { |
| 71 completer0.completeError(e2); |
| 72 } |
| 73 }); |
| 74 return completer0.future; |
| 75 })).catchError(((error, stackTrace) { |
| 76 if (error is! AssetNotFoundException) throw error; |
| 77 var message = |
| 78 "Could not find ${log.bold(executable + ".dart")}"
; |
| 79 if (package != entrypoint.root.name) { |
| 80 message += |
| 81 " in package ${log.bold(server.package)}"; |
| 82 } |
| 83 log.error("$message."); |
| 84 log.fine(new Chain.forTrace(stackTrace)); |
| 85 return exit_codes.NO_INPUT; |
| 86 }))); |
| 87 } |
| 88 if (package == entrypoint.root.name) { |
| 89 environment.serveDirectory(rootDir).then((x1) { |
46 try { | 90 try { |
47 var vmArgs = []; | 91 server = x1; |
48 vmArgs.add("--checked"); | 92 join6(); |
49 var relativePath = | 93 } catch (e1) { |
50 p.url.relative(assetPath, from: p.url.joinAll(p.
split(server.rootDirectory))); | 94 completer0.completeError(e1); |
51 vmArgs.add( | |
52 server.url.resolve(relativePath).toString()); | |
53 vmArgs.addAll(args); | |
54 Process.start( | |
55 Platform.executable, | |
56 vmArgs).then((x0) { | |
57 try { | |
58 var process = x0; | |
59 process.stderr.listen(stderr.add); | |
60 process.stdout.listen(stdout.add); | |
61 stdin.listen(process.stdin.add); | |
62 completer0.complete(process.exitCode); | |
63 } catch (e0) { | |
64 completer0.completeError(e0); | |
65 } | |
66 }, onError: (e1) { | |
67 completer0.completeError(e1); | |
68 }); | |
69 } catch (e2) { | |
70 completer0.completeError(e2); | |
71 } | 95 } |
| 96 }, onError: (e2) { |
| 97 completer0.completeError(e2); |
72 }); | 98 }); |
73 return completer0.future; | 99 } else { |
74 })).catchError(((error, stackTrace) { | |
75 if (error is! AssetNotFoundException) throw error; | |
76 var message = | |
77 "Could not find ${log.bold(executable + ".dart")}"; | |
78 if (package != entrypoint.root.name) { | |
79 message += " in package ${log.bold(server.package)}"; | |
80 } | |
81 log.error("$message."); | |
82 log.fine(new Chain.forTrace(stackTrace)); | |
83 return exit_codes.NO_INPUT; | |
84 }))); | |
85 } | |
86 if (package == entrypoint.root.name) { | |
87 environment.serveDirectory(rootDir).then((x1) { | |
88 try { | |
89 server = x1; | |
90 join5(); | |
91 } catch (e1) { | |
92 completer0.completeError(e1); | |
93 } | |
94 }, onError: (e2) { | |
95 completer0.completeError(e2); | |
96 }); | |
97 } else { | |
98 var dep = | |
99 entrypoint.root.immediateDependencies.firstWhere( | |
100 ((dep) => dep.name == package), | |
101 orElse: (() => null)); | |
102 join6() { | |
103 environment.servePackageBinDirectory( | 100 environment.servePackageBinDirectory( |
104 package).then((x2) { | 101 package).then((x2) { |
105 try { | 102 try { |
106 server = x2; | 103 server = x2; |
107 join5(); | 104 join6(); |
108 } catch (e3) { | 105 } catch (e3) { |
109 completer0.completeError(e3); | 106 completer0.completeError(e3); |
110 } | 107 } |
111 }, onError: (e4) { | 108 }, onError: (e4) { |
112 completer0.completeError(e4); | 109 completer0.completeError(e4); |
113 }); | 110 }); |
114 } | 111 } |
115 if (dep == null) { | 112 } catch (e0) { |
116 join7() { | 113 completer0.completeError(e0); |
117 join6(); | |
118 } | |
119 if (environment.graph.packages.containsKey(package)) { | |
120 dataError( | |
121 'Package "${package}" is not an immediate dependen
cy.\n' | |
122 'Cannot run executables in transitive dependen
cies.'); | |
123 join7(); | |
124 } else { | |
125 dataError( | |
126 'Could not find package "${package}". Did you forg
et to ' 'add a dependency?'); | |
127 join7(); | |
128 } | |
129 } else { | |
130 join6(); | |
131 } | |
132 } | 114 } |
133 } catch (e0) { | 115 }, onError: (e5) { |
134 completer0.completeError(e0); | 116 completer0.completeError(e5); |
135 } | 117 }); |
136 }, onError: (e5) { | 118 } |
137 completer0.completeError(e5); | 119 if (parts.length > 1) { |
138 }); | 120 assert(!isGlobal && package == entrypoint.root.name); |
| 121 rootDir = parts.first; |
| 122 join5(); |
| 123 } else { |
| 124 executable = p.join("bin", executable); |
| 125 join5(); |
| 126 } |
139 } | 127 } |
140 if (parts.length > 1) { | 128 if (!isGlobal && |
141 assert(!isGlobal && package == entrypoint.root.name); | 129 fileExists(localSnapshotPath) && |
142 rootDir = parts.first; | 130 mode == BarbackMode.RELEASE) { |
143 join4(); | 131 completer0.complete( |
| 132 _runCachedExecutable(entrypoint, localSnapshotPath, args)); |
144 } else { | 133 } else { |
145 executable = p.join("bin", executable); | |
146 join4(); | 134 join4(); |
147 } | 135 } |
148 } | 136 } |
149 if (!isGlobal && | 137 if (p.extension(executable) == ".dart") { |
150 fileExists(localSnapshotPath) && | 138 executable = p.withoutExtension(executable); |
151 mode == BarbackMode.RELEASE) { | 139 join3(); |
152 completer0.complete( | |
153 _runCachedExecutable(entrypoint, localSnapshotPath, args)); | |
154 } else { | 140 } else { |
155 join3(); | 141 join3(); |
156 } | 142 } |
157 } | 143 } |
158 if (p.extension(executable) == ".dart") { | 144 if (log.verbosity == log.Verbosity.NORMAL) { |
159 executable = p.withoutExtension(executable); | 145 log.verbosity = log.Verbosity.WARNING; |
160 join2(); | 146 join2(); |
161 } else { | 147 } else { |
162 join2(); | 148 join2(); |
163 } | 149 } |
164 } | 150 } |
165 if (log.verbosity == log.Verbosity.NORMAL) { | 151 if (entrypoint.root.name != package && |
166 log.verbosity = log.Verbosity.WARNING; | 152 !entrypoint.root.immediateDependencies.any(((dep) => dep.name == pac
kage))) { |
167 join1(); | 153 entrypoint.loadPackageGraph().then((x3) { |
| 154 try { |
| 155 var graph = x3; |
| 156 join7() { |
| 157 join1(); |
| 158 } |
| 159 if (graph.packages.containsKey(package)) { |
| 160 dataError( |
| 161 'Package "${package}" is not an immediate dependency.\n' |
| 162 'Cannot run executables in transitive dependencies.'); |
| 163 join7(); |
| 164 } else { |
| 165 dataError( |
| 166 'Could not find package "${package}". Did you forget to add
a ' 'dependency?'); |
| 167 join7(); |
| 168 } |
| 169 } catch (e6) { |
| 170 completer0.completeError(e6); |
| 171 } |
| 172 }, onError: (e7) { |
| 173 completer0.completeError(e7); |
| 174 }); |
168 } else { | 175 } else { |
169 join1(); | 176 join1(); |
170 } | 177 } |
171 } | 178 } |
172 if (mode == null) { | 179 if (mode == null) { |
173 mode = BarbackMode.RELEASE; | 180 mode = BarbackMode.RELEASE; |
174 join0(); | 181 join0(); |
175 } else { | 182 } else { |
176 join0(); | 183 join0(); |
177 } | 184 } |
178 } catch (e6) { | 185 } catch (e8) { |
179 completer0.completeError(e6); | 186 completer0.completeError(e8); |
180 } | 187 } |
181 }); | 188 }); |
182 return completer0.future; | 189 return completer0.future; |
183 } | 190 } |
184 Future<int> runSnapshot(String path, Iterable<String> args, {recompile(), | 191 Future<int> runSnapshot(String path, Iterable<String> args, {recompile(), |
185 bool checked: false}) { | 192 bool checked: false}) { |
186 final completer0 = new Completer(); | 193 final completer0 = new Completer(); |
187 scheduleMicrotask(() { | 194 scheduleMicrotask(() { |
188 try { | 195 try { |
189 var vmArgs = [path]..addAll(args); | 196 var vmArgs = [path]..addAll(args); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 }); | 270 }); |
264 return completer0.future; | 271 return completer0.future; |
265 } | 272 } |
266 Future<int> _runCachedExecutable(Entrypoint entrypoint, String snapshotPath, | 273 Future<int> _runCachedExecutable(Entrypoint entrypoint, String snapshotPath, |
267 List<String> args) { | 274 List<String> args) { |
268 return runSnapshot(snapshotPath, args, checked: true, recompile: () { | 275 return runSnapshot(snapshotPath, args, checked: true, recompile: () { |
269 log.fine("Precompiled executable is out of date."); | 276 log.fine("Precompiled executable is out of date."); |
270 return entrypoint.precompileExecutables(); | 277 return entrypoint.precompileExecutables(); |
271 }); | 278 }); |
272 } | 279 } |
OLD | NEW |