Skip to content

Commit 43df7c8

Browse files
authored
Merge pull request #4 from gql-dart/info-command
implement info command
2 parents 844e52b + 6c63af2 commit 43df7c8

File tree

6 files changed

+106
-4
lines changed

6 files changed

+106
-4
lines changed

Diff for: CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.1.4
2+
3+
- implement info command to print GraphViz dor file
4+
15
## 0.1.3
26

37
- upgrade `directed_graph: ^0.1.4`

Diff for: bin/multipack.dart

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ void main(List<String> arguments) async {
4747

4848
runner.addCommand(PubCommand(orderedPackages));
4949
runner.addCommand(FmtCommand(orderedPackages));
50+
runner.addCommand(InfoCommand(orderedPackages));
5051
runner.addCommand(AnalyzeCommand(orderedPackages));
5152
runner.addCommand(ExecCommand(orderedPackages));
5253
runner.addCommand(PubspecCommand(orderedPackages));

Diff for: lib/commands.dart

+1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ import "package:meta/meta.dart";
66
export "commands/analyze.dart";
77
export "commands/exec.dart";
88
export "commands/fmt.dart";
9+
export "commands/info.dart";
910
export "commands/pub.dart";
1011
export "commands/pubspec.dart";

Diff for: lib/commands/info.dart

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import "dart:async";
2+
import "dart:math";
3+
4+
import "package:args/command_runner.dart";
5+
6+
import "package:multipack/package.dart";
7+
8+
String toHex(int color) {
9+
final colorString = color.toRadixString(16);
10+
11+
return [if (colorString.length == 1) "0", colorString].join();
12+
}
13+
14+
String getColor(String name) {
15+
final random = Random(name.hashCode);
16+
17+
final r = random.nextInt(256);
18+
final g = random.nextInt(256);
19+
final b = random.nextInt(256);
20+
21+
return [
22+
"#",
23+
toHex(r),
24+
toHex(g),
25+
toHex(b),
26+
].join();
27+
}
28+
29+
class InfoCommand extends Command<void> {
30+
@override
31+
final String name = "info";
32+
33+
@override
34+
final String description = "Show info about local packages.";
35+
36+
final List<Package> packages;
37+
38+
InfoCommand(this.packages);
39+
40+
@override
41+
FutureOr<void> run() {
42+
print("digraph packages {");
43+
print(' size="10"; ratio=fill;');
44+
45+
for (final package in packages) {
46+
print(
47+
' ${package.name} [shape="box"; color="${getColor(package.name)}"];');
48+
}
49+
50+
for (final package in packages) {
51+
package.pubspec.allDependencies.keys
52+
.where((dep) => packages.any((package) => package.name == dep))
53+
.forEach((dep) {
54+
final attrs = package.pubspec.dependencies.containsKey(dep)
55+
? 'style="filled"; color="${getColor(dep)}"'
56+
: 'style="dashed"; color="${getColor(dep)}"';
57+
print(" ${package.name} -> ${dep} [${attrs}];");
58+
});
59+
}
60+
61+
final groupedPackages =
62+
packages.fold<Map<String, List<Package>>>({}, (grouped, package) {
63+
if (!grouped.containsKey(package.namespace)) {
64+
grouped[package.namespace] = [];
65+
}
66+
67+
grouped[package.namespace].add(package);
68+
69+
return grouped;
70+
});
71+
72+
groupedPackages.forEach((namespace, packagesInGroup) {
73+
print(' subgraph "cluster ${namespace}" {');
74+
print(' label="${namespace}";');
75+
print(' color="${getColor(namespace)}";');
76+
packagesInGroup.forEach((package) {
77+
print(" ${package.name};");
78+
});
79+
print(" }");
80+
});
81+
82+
print("}");
83+
}
84+
}

Diff for: lib/package.dart

+12
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ final failurePen = AnsiPen()
3131

3232
class Package {
3333
final Directory directory;
34+
final String namespace;
3435
final String name;
3536
final PubSpec pubspec;
3637
final bool isFlutter;
3738

3839
const Package({
3940
this.directory,
41+
this.namespace,
4042
this.name,
4143
this.pubspec,
4244
this.isFlutter,
@@ -144,8 +146,18 @@ Stream<Package> findPackages(Directory root) =>
144146
(dir) async {
145147
final pubspec = await PubSpec.load(dir);
146148

149+
final dirPath = dir.path;
150+
final rootPath = root.path;
151+
152+
final rootIndex = rootPath.length;
153+
final dirIndex = dirPath.lastIndexOf(Platform.pathSeparator);
154+
147155
return Package(
148156
directory: dir,
157+
namespace: dirPath.substring(
158+
rootIndex == dirIndex ? rootIndex : rootIndex + 1,
159+
dirIndex,
160+
),
149161
name: pubspec.name,
150162
isFlutter: pubspec.allDependencies.containsKey("flutter"),
151163
pubspec: pubspec,

Diff for: pubspec.yaml

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
name: multipack
22
description: A tool for monorepo management. Link local packages and execute commands in topological order.
3-
version: 0.1.3
3+
version: 0.1.4
44
homepage: https://github.com/gql-dart/multipack
55
environment:
6-
sdk: '>=2.7.2 <3.0.0'
6+
sdk: '>=2.8.0 <3.0.0'
77
dependencies:
88
ansicolor: ^1.0.2
99
args: ^1.6.0
10-
directed_graph: ^0.1.4
10+
directed_graph: ^0.2.3
1111
meta: ^1.0.0
1212
pubspec: ^0.1.2
1313
pub_semver: ^1.4.4
1414
path: ^1.6.4
1515
dev_dependencies:
1616
gql_pedantic: ^1.0.1
17-
executables:
17+
executables:
1818
multipack: null

0 commit comments

Comments
 (0)