diff --git a/.github/workflows/puppy.yml b/.github/workflows/puppy.yml new file mode 100644 index 00000000..a96eb8d1 --- /dev/null +++ b/.github/workflows/puppy.yml @@ -0,0 +1,41 @@ +name: package:puppy + +permissions: read-all + +on: + pull_request: + branches: [ main ] + paths: + - '.github/workflows/puppy.yml' + - 'pkgs/puppy/**' + push: + branches: [ main ] + paths: + - '.github/workflows/puppy.yml' + - 'pkgs/puppy/**' + schedule: + - cron: '0 0 * * 0' # weekly + +defaults: + run: + working-directory: pkgs/puppy + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + sdk: [3.6, dev] + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + - uses: dart-lang/setup-dart@e630b99d28a3b71860378cafdc2a067c71107f94 + with: + sdk: ${{ matrix.sdk }} + + - run: dart pub get + - run: dart analyze --fatal-infos + - run: dart format --output=none --set-exit-if-changed . + if: ${{ matrix.sdk == 'dev' }} + # TODO: enable when there are tests! + #- run: dart test diff --git a/README.md b/README.md index aa47d0ef..9b89701c 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ This repository is home to general Dart Ecosystem tools and packages. | [corpus](pkgs/corpus/) | A tool to calculate the API usage for a package. | | | [dart_flutter_team_lints](pkgs/dart_flutter_team_lints/) | An analysis rule set used by the Dart and Flutter teams. | [![pub package](https://img.shields.io/pub/v/dart_flutter_team_lints.svg)](https://pub.dev/packages/dart_flutter_team_lints) | | [firehose](pkgs/firehose/) | A tool to automate publishing of Pub packages from GitHub actions. | [![pub package](https://img.shields.io/pub/v/firehose.svg)](https://pub.dev/packages/firehose) | +| [puppy](pkgs/puppy/) | A grab bag of CLI tools for managing Dart code. | | | [repo_manage](pkgs/repo_manage/) | Miscellaneous issue, repo, and PR query tools. | | | [sdk_triage_bot](pkgs/sdk_triage_bot/) | A triage automation tool for dart-lang/sdk issues. | | | [trebuchet](pkgs/trebuchet/) | A tool for moving existing packages into monorepos. | | diff --git a/pkgs/puppy/README.md b/pkgs/puppy/README.md new file mode 100644 index 00000000..878276f3 --- /dev/null +++ b/pkgs/puppy/README.md @@ -0,0 +1,11 @@ +Activate locally using: + +```console +cd +dart pub global activate --source=path . +``` + +### Tools + +- `for_all_package_dirs`: runs a command in every directory containing + `pubspec.yaml`. diff --git a/pkgs/puppy/analysis_options.yaml b/pkgs/puppy/analysis_options.yaml new file mode 100644 index 00000000..d978f811 --- /dev/null +++ b/pkgs/puppy/analysis_options.yaml @@ -0,0 +1 @@ +include: package:dart_flutter_team_lints/analysis_options.yaml diff --git a/pkgs/puppy/bin/for_all_package_dirs.dart b/pkgs/puppy/bin/for_all_package_dirs.dart new file mode 100755 index 00000000..e818ce3e --- /dev/null +++ b/pkgs/puppy/bin/for_all_package_dirs.dart @@ -0,0 +1,49 @@ +// 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/pubspec.yaml b/pkgs/puppy/pubspec.yaml new file mode 100644 index 00000000..6d5539d4 --- /dev/null +++ b/pkgs/puppy/pubspec.yaml @@ -0,0 +1,14 @@ +name: puppy +publish_to: none + +environment: + sdk: ^3.6.0 + +dependencies: + io: ^1.0.5 + +dev_dependencies: + dart_flutter_team_lints: ^3.0.0 + +executables: + for_all_package_dirs: