3
3
// BSD-style license that can be found in the LICENSE file.
4
4
5
5
import 'dart:collection' ;
6
- import 'dart:convert' ;
6
+
7
+ import 'package:path/path.dart' as p;
7
8
8
9
import '../ascii_tree.dart' as tree;
9
10
import '../command.dart' ;
@@ -52,10 +53,6 @@ class DepsCommand extends PubCommand {
52
53
argParser.addFlag ('executables' ,
53
54
negatable: false , help: 'List all available executables.' );
54
55
55
- argParser.addFlag ('json' ,
56
- negatable: false ,
57
- help: 'Output dependency information in a json format.' );
58
-
59
56
argParser.addOption ('directory' ,
60
57
abbr: 'C' , help: 'Run this in the directory<dir>.' , valueHelp: 'dir' );
61
58
}
@@ -67,98 +64,26 @@ class DepsCommand extends PubCommand {
67
64
68
65
_buffer = StringBuffer ();
69
66
70
- if (argResults['json' ]) {
71
- if (argResults.wasParsed ('dev' )) {
72
- usageException (
73
- 'Cannot combine --json and --dev.\n The json output contains the dependency type in the output.' );
74
- }
75
- if (argResults.wasParsed ('executables' )) {
76
- usageException (
77
- 'Cannot combine --json and --executables.\n The json output always lists available executables.' );
78
- }
79
- if (argResults.wasParsed ('style' )) {
80
- usageException ('Cannot combine --json and --style.' );
81
- }
82
- final visited = < String > [];
83
- final toVisit = [entrypoint.root.name];
84
- final packagesJson = < dynamic > [];
85
- while (toVisit.isNotEmpty) {
86
- final current = toVisit.removeLast ();
87
- if (visited.contains (current)) continue ;
88
- visited.add (current);
89
- final currentPackage = entrypoint.packageGraph.packages[current];
90
- final next = (current == entrypoint.root.name
91
- ? entrypoint.root.immediateDependencies
92
- : currentPackage.dependencies)
93
- .keys
94
- .toList ();
95
- final dependencyType = entrypoint.root.dependencyType (current);
96
- final kind = currentPackage == entrypoint.root
97
- ? 'root'
98
- : (dependencyType == DependencyType .direct
99
- ? 'direct'
100
- : (dependencyType == DependencyType .dev
101
- ? 'dev'
102
- : 'transitive' ));
103
- final source =
104
- entrypoint.packageGraph.lockFile.packages[current]? .source? .name ??
105
- 'root' ;
106
- packagesJson.add ({
107
- 'name' : current,
108
- 'version' : currentPackage.version.toString (),
109
- 'kind' : kind,
110
- 'source' : source,
111
- 'dependencies' : next
112
- });
113
- toVisit.addAll (next);
114
- }
115
- var executables = [
116
- for (final package in [
117
- entrypoint.root,
118
- ...entrypoint.root.immediateDependencies.keys
119
- .map ((name) => entrypoint.packageGraph.packages[name])
120
- ])
121
- ...package.executableNames.map ((name) => package == entrypoint.root
122
- ? ':$name '
123
- : (package.name == name ? name : '${package .name }:$name ' ))
124
- ];
125
-
126
- _buffer.writeln (
127
- JsonEncoder .withIndent (' ' ).convert (
128
- {
129
- 'root' : entrypoint.root.name,
130
- 'packages' : packagesJson,
131
- 'sdks' : [
132
- for (var sdk in sdks.values)
133
- if (sdk.version != null )
134
- {'name' : sdk.name, 'version' : sdk.version.toString ()}
135
- ],
136
- 'executables' : executables
137
- },
138
- ),
139
- );
67
+ if (argResults['executables' ]) {
68
+ _outputExecutables ();
140
69
} else {
141
- if (argResults['executables' ]) {
142
- _outputExecutables ();
143
- } else {
144
- for (var sdk in sdks.values) {
145
- if (! sdk.isAvailable) continue ;
146
- _buffer.writeln ("${log .bold ('${sdk .name } SDK' )} ${sdk .version }" );
147
- }
148
-
149
- _buffer.writeln (_labelPackage (entrypoint.root));
150
-
151
- switch (argResults['style' ]) {
152
- case 'compact' :
153
- _outputCompact ();
154
- break ;
155
- case 'list' :
156
- _outputList ();
157
- break ;
158
- case 'tree' :
159
- _outputTree ();
160
- break ;
161
- }
70
+ for (var sdk in sdks.values) {
71
+ if (! sdk.isAvailable) continue ;
72
+ _buffer.writeln ("${log .bold ('${sdk .name } SDK' )} ${sdk .version }" );
73
+ }
74
+
75
+ _buffer.writeln (_labelPackage (entrypoint.root));
76
+
77
+ switch (argResults['style' ]) {
78
+ case 'compact' :
79
+ _outputCompact ();
80
+ break ;
81
+ case 'list' :
82
+ _outputList ();
83
+ break ;
84
+ case 'tree' :
85
+ _outputTree ();
86
+ break ;
162
87
}
163
88
}
164
89
@@ -343,13 +268,34 @@ class DepsCommand extends PubCommand {
343
268
];
344
269
345
270
for (var package in packages) {
346
- var executables = package.executableNames ;
271
+ var executables = _getExecutablesFor ( package) ;
347
272
if (executables.isNotEmpty) {
348
273
_buffer.writeln (_formatExecutables (package.name, executables.toList ()));
349
274
}
350
275
}
351
276
}
352
277
278
+ /// Returns `true` if [path] looks like a Dart entrypoint.
279
+ bool _isDartExecutable (String path) {
280
+ try {
281
+ var unit = analysisContextManager.parse (path);
282
+ return isEntrypoint (unit);
283
+ } on AnalyzerErrorGroup {
284
+ return false ;
285
+ }
286
+ }
287
+
288
+ /// Lists all Dart files in the `bin` directory of the [package] .
289
+ ///
290
+ /// Returns file names without extensions.
291
+ Iterable <String > _getExecutablesFor (Package package) {
292
+ var packagePath = p.normalize (p.absolute (package.dir));
293
+ analysisContextManager.createContextsForDirectory (packagePath);
294
+ return package.executablePaths
295
+ .where ((e) => _isDartExecutable (p.absolute (package.dir, e)))
296
+ .map (p.basenameWithoutExtension);
297
+ }
298
+
353
299
/// Returns formatted string that lists [executables] for the [packageName] .
354
300
/// Examples:
355
301
///
0 commit comments