From 030feb04842a41d057314bbc8224cb39af6717c8 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 10 Jan 2025 13:12:18 -0800 Subject: [PATCH] review notes --- pkgs/puppy/README.md | 4 +- pkgs/puppy/bin/for_all_package_dirs.dart | 49 -------------- pkgs/puppy/bin/puppy.dart | 10 +++ pkgs/puppy/lib/src/map_command.dart | 86 ++++++++++++++++++++++++ pkgs/puppy/lib/src/map_command.g.dart | 34 ++++++++++ pkgs/puppy/pubspec.yaml | 6 +- 6 files changed, 137 insertions(+), 52 deletions(-) delete mode 100755 pkgs/puppy/bin/for_all_package_dirs.dart create mode 100755 pkgs/puppy/bin/puppy.dart create mode 100644 pkgs/puppy/lib/src/map_command.dart create mode 100644 pkgs/puppy/lib/src/map_command.g.dart diff --git a/pkgs/puppy/README.md b/pkgs/puppy/README.md index 878276f3..b4305165 100644 --- a/pkgs/puppy/README.md +++ b/pkgs/puppy/README.md @@ -5,7 +5,7 @@ cd dart pub global activate --source=path . ``` -### Tools +### Commands -- `for_all_package_dirs`: runs a command in every directory containing +- `run`: runs a command in every directory containing `pubspec.yaml`. diff --git a/pkgs/puppy/bin/for_all_package_dirs.dart b/pkgs/puppy/bin/for_all_package_dirs.dart deleted file mode 100755 index e818ce3e..00000000 --- a/pkgs/puppy/bin/for_all_package_dirs.dart +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:io'; - -import 'package:io/ansi.dart'; -import 'package:io/io.dart'; - -Future main(List args) async { - if (args.isEmpty) { - print('Need something to execute!'); - exitCode = ExitCode.usage.code; - return; - } - - final exe = args.first; - final extraArgs = args.skip(1).toList(); - - final exits = {}; - - Future inspectDirectory(Directory dir) async { - final pubspecs = dir - .listSync() - .whereType() - .where((element) => element.uri.pathSegments.last == 'pubspec.yaml') - .toList(); - - if (pubspecs.isNotEmpty) { - print(green.wrap(dir.path)); - final proc = await Process.start( - exe, - extraArgs, - mode: ProcessStartMode.inheritStdio, - workingDirectory: dir.path, - ); - - // TODO(kevmoo): display a summary of results on completion - exits[dir.path] = await proc.exitCode; - } - - for (var subDir in dir.listSync().whereType().where((element) => - !element.uri.pathSegments.any((element) => element.startsWith('.')))) { - await inspectDirectory(subDir); - } - } - - await inspectDirectory(Directory.current); -} diff --git a/pkgs/puppy/bin/puppy.dart b/pkgs/puppy/bin/puppy.dart new file mode 100755 index 00000000..100da2b2 --- /dev/null +++ b/pkgs/puppy/bin/puppy.dart @@ -0,0 +1,10 @@ +import 'package:args/command_runner.dart'; +import 'package:puppy/src/map_command.dart'; + +Future main(List args) async { + var runner = CommandRunner( + 'dgit', 'A dart implementation of distributed version control.') + ..addCommand(MapCommand()); + + await runner.run(args); +} diff --git a/pkgs/puppy/lib/src/map_command.dart b/pkgs/puppy/lib/src/map_command.dart new file mode 100644 index 00000000..4c74fdb4 --- /dev/null +++ b/pkgs/puppy/lib/src/map_command.dart @@ -0,0 +1,86 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:io'; + +import 'package:args/command_runner.dart'; +import 'package:build_cli_annotations/build_cli_annotations.dart'; +import 'package:io/ansi.dart'; + +part 'map_command.g.dart'; + +class MapCommand extends _$MapArgsCommand { + @override + String get description => + 'Run the provided command in each subdirectory containing ' + '`pubspec.yaml`.'; + + @override + String get name => 'map'; + + @override + Future? run() async { + await _doMap(_options); + } +} + +@CliOptions(createCommand: true) +class MapArgs { + @CliOption(abbr: 'd', help: 'Keep looking for "nested" pubspec files.') + final bool deep; + + final List rest; + + MapArgs({ + this.deep = false, + required this.rest, + }) { + if (rest.isEmpty) { + throw UsageException( + 'Missing command to invoke!', + 'puppy map [--deep] ', + ); + } + } +} + +Future _doMap(MapArgs args) async { + final exe = args.rest.first; + final extraArgs = args.rest.skip(1).toList(); + + final exits = {}; + + Future inspectDirectory(Directory dir, {required bool deep}) async { + final pubspecs = dir + .listSync() + .whereType() + .where((element) => element.uri.pathSegments.last == 'pubspec.yaml') + .toList(); + + final pubspecHere = pubspecs.isNotEmpty; + if (pubspecHere) { + print(green.wrap(dir.path)); + final proc = await Process.start( + exe, + extraArgs, + mode: ProcessStartMode.inheritStdio, + workingDirectory: dir.path, + ); + + // TODO(kevmoo): display a summary of results on completion + exits[dir.path] = await proc.exitCode; + } + + if (!pubspecHere || deep) { + for (var subDir in dir.listSync().whereType().where( + (element) => !element.uri.pathSegments + .any((element) => element.startsWith('.')))) { + await inspectDirectory(subDir, deep: deep); + } + } + } + + await inspectDirectory(Directory.current, deep: args.deep); +} diff --git a/pkgs/puppy/lib/src/map_command.g.dart b/pkgs/puppy/lib/src/map_command.g.dart new file mode 100644 index 00000000..a7d44e21 --- /dev/null +++ b/pkgs/puppy/lib/src/map_command.g.dart @@ -0,0 +1,34 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'map_command.dart'; + +// ************************************************************************** +// CliGenerator +// ************************************************************************** + +MapArgs _$parseMapArgsResult(ArgResults result) => MapArgs( + deep: result['deep'] as bool, + rest: result.rest, + ); + +ArgParser _$populateMapArgsParser(ArgParser parser) => parser + ..addFlag( + 'deep', + abbr: 'd', + help: 'Keep looking for "nested" pubspec files.', + ); + +final _$parserForMapArgs = _$populateMapArgsParser(ArgParser()); + +MapArgs parseMapArgs(List args) { + final result = _$parserForMapArgs.parse(args); + return _$parseMapArgsResult(result); +} + +abstract class _$MapArgsCommand extends Command { + _$MapArgsCommand() { + _$populateMapArgsParser(argParser); + } + + late final _options = _$parseMapArgsResult(argResults!); +} diff --git a/pkgs/puppy/pubspec.yaml b/pkgs/puppy/pubspec.yaml index 6d5539d4..26a6d9db 100644 --- a/pkgs/puppy/pubspec.yaml +++ b/pkgs/puppy/pubspec.yaml @@ -5,10 +5,14 @@ environment: sdk: ^3.6.0 dependencies: + args: ^2.6.0 + build_cli_annotations: ^2.1.0 io: ^1.0.5 dev_dependencies: + build_cli: ^2.2.4 + build_runner: ^2.4.14 dart_flutter_team_lints: ^3.0.0 executables: - for_all_package_dirs: + puppy: