Skip to content

Commit

Permalink
[puppy] Introduce a package for misc Dart CLI tools
Browse files Browse the repository at this point in the history
First tool: for_all_package_dirs to recursively run a command in every
directory that contains pubspec.yaml
  • Loading branch information
kevmoo committed Jan 8, 2025
1 parent efe4ee4 commit bb458c2
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 0 deletions.
41 changes: 41 additions & 0 deletions .github/workflows/puppy.yml
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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. | |
Expand Down
11 changes: 11 additions & 0 deletions pkgs/puppy/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Activate locally using:

```console
cd <puppy pkg path>
dart pub global activate --source=path .
```

### Tools

- `for_all_package_dirs`: runs a command in every directory containing
`pubspec.yaml`.
1 change: 1 addition & 0 deletions pkgs/puppy/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include: package:dart_flutter_team_lints/analysis_options.yaml
49 changes: 49 additions & 0 deletions pkgs/puppy/bin/for_all_package_dirs.dart
Original file line number Diff line number Diff line change
@@ -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<void> main(List<String> 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 = <String, int>{};

Future<void> inspectDirectory(Directory dir) async {
final pubspecs = dir
.listSync()
.whereType<File>()
.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<Directory>().where((element) =>
!element.uri.pathSegments.any((element) => element.startsWith('.')))) {
await inspectDirectory(subDir);
}
}

await inspectDirectory(Directory.current);
}
14 changes: 14 additions & 0 deletions pkgs/puppy/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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:

0 comments on commit bb458c2

Please sign in to comment.