chore: Move cutler to build_engine repo (#1314)
Moved to build_engine in shorebirdtech/build_engine#27.
This commit is contained in:
@@ -38,10 +38,6 @@ jobs:
|
||||
- ./.github/workflows/main.yaml
|
||||
- ./.github/actions/dart_package/action.yaml
|
||||
- packages/artifact_proxy/**
|
||||
cutler:
|
||||
- ./.github/workflows/main.yaml
|
||||
- ./.github/actions/dart_package/action.yaml
|
||||
- packages/cutler/**
|
||||
discord_gcp_alerts:
|
||||
- ./.github/workflows/main.yaml
|
||||
- ./.github/actions/dart_package/action.yaml
|
||||
@@ -115,7 +111,7 @@ jobs:
|
||||
with:
|
||||
codecov_token: ${{ secrets.CODECOV_TOKEN }}
|
||||
working_directory: packages/${{ matrix.package }}
|
||||
min_coverage: ${{ matrix.package == 'cutler' && '10' || '100' }}
|
||||
min_coverage: 100
|
||||
|
||||
build_redis:
|
||||
needs: changes
|
||||
|
||||
@@ -23,7 +23,6 @@ This repository is a monorepo containing the following packages:
|
||||
| [shorebird_cli](packages/shorebird_cli/README.md) | Command-line which allows developers to interact with various Shorebird services |
|
||||
| [shorebird_code_push_client](packages/shorebird_code_push_client/README.md) | Dart library which allows Dart applications to interact with the ShoreBird CodePush API |
|
||||
| [shorebird_code_push_protocol](packages/shorebird_code_push_protocol/README.md) | Dart library which contains common interfaces used by Shorebird CodePush |
|
||||
| [cutler](packages/cutler/README.md) | A tool for managing Flutter forks |
|
||||
| [discord_gcp_alerts](packages/discord_gcp_alerts/README.md) | Dart server which forwards GCP alerts to Discord |
|
||||
| [jwt](packages/jwt/README.md) | Dart library for verifying Json Web Tokens |
|
||||
| [redis_client](packages/redis_client/README.md) | Dart library for interacting with Redis |
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# https://dart.dev/guides/libraries/private-files
|
||||
# Created by `dart pub`
|
||||
.dart_tool/
|
||||
build/
|
||||
coverage/
|
||||
@@ -1,203 +0,0 @@
|
||||
`cutler` intends to replaces some of this, but not all of it.
|
||||
Keeping these docs until `cutler` is fully functional.
|
||||
|
||||
`dart run cutler versions` is able to print out all of the hashes in the forked
|
||||
repos for a given Shorebird hash (including any Shorebird channel or release
|
||||
tag).
|
||||
|
||||
Example:
|
||||
```
|
||||
% dart run cutler versions
|
||||
Building package executable...
|
||||
Built cutler:cutler.
|
||||
Using /Users/eseidel/Documents/GitHub as checkouts root.
|
||||
✓ Checkouts updated! (15.9s)
|
||||
Shorebird @ origin/stable
|
||||
flutter 012153de178d4a51cd6f9adc792ad63ae3cfb1b3 (8 ahead)
|
||||
engine 5a1c263ce5313c8f5e93a11dd2a3af0e19d90262 (54 ahead)
|
||||
dart 37f38201922b071c5494e35fe09b56336f03a4f6 (13 ahead)
|
||||
buildroot 320eae0a60e36365e90b4380f5eb0b3fd4392f67 (1 ahead)
|
||||
|
||||
Upstream
|
||||
flutter 2524052335ec76bb03e04ede244b071f1b86d190 (3.13.3)
|
||||
engine b8d35810e91ab8fc39ba5e7a41bff6f697e8e3a8 (3.13.3)
|
||||
dart efd81da467c5cfeaa39652bd865ce91830a66ab7 (3.1.1)
|
||||
buildroot 6e71c38443c0bf9d8954c87bf69bb4e019f44f94
|
||||
```
|
||||
|
||||
## Repository structure
|
||||
|
||||
We maintain forks of:
|
||||
* flutter/flutter
|
||||
* flutter/engine
|
||||
* flutter/buildroot
|
||||
* dart-lang/sdk
|
||||
|
||||
We keep our forked changes on the `shorebird/dev` branch of each repo which we
|
||||
rebase periodically on top of the latest stable from the upstream repos.
|
||||
|
||||
When Flutter makes a release, we rebase our `shorebird/dev` branches onto
|
||||
the branch points for Flutter's release branches. We then create our own
|
||||
release branches for the Shorebird release (e.g. flutter_release/3.7.10).
|
||||
|
||||
The only reason we need to create branches is to keep our forked commits alive.
|
||||
You don't directly check out these branches (unless you plan to make a hotfix)
|
||||
but instead Shorebird will pull them using its `flutter.version` file, etc.
|
||||
|
||||
We keep channel branches (e.g. `stable`) in the `shorebird` repo but
|
||||
do not do so in the other repos.
|
||||
|
||||
The forked repos have branches corresponding to a Flutter release but do not
|
||||
keep branches corresponding to Shorebird or Flutter channels.
|
||||
|
||||
For example, when updating to the Flutter 3.7.10 release, we created the
|
||||
following branches:
|
||||
* flutter/flutter: `flutter_release/3.7.10`
|
||||
* flutter/engine: `flutter_release/3.7.10`
|
||||
* flutter/buildroot: `flutter_release/3.7.10`
|
||||
* dart-lang/sdk: `flutter_release/3.7.10`
|
||||
* shorebird: no branch or tag, just a commit to the `main` branch which
|
||||
will eventually get pushed to the `stable` branch for Shorebird.
|
||||
|
||||
It's rare that we will ever need to add commits to one of these branches,
|
||||
since changes to our fork are rare. We currently do not try to back-port
|
||||
any Shorebird changes to older Flutter revisions, rather we just update
|
||||
to the latest Flutter release and include our new fixes there.
|
||||
https://github.com/shorebirdtech/shorebird/issues/1100
|
||||
|
||||
## Keeping our fork up to date
|
||||
|
||||
You need checkouts of all the various repos in the same directory.
|
||||
|
||||
Currently the tool assumes you're using our internal repository `_shorebird`
|
||||
to check out `shorebird`. Example:
|
||||
```
|
||||
cd $HOME/Documents/GitHub
|
||||
git clone https://github.com/shorebirdtech/_shorebird
|
||||
```
|
||||
|
||||
To check out the engine, you should follow:
|
||||
https://github.com/shorebirdtech/updater/blob/main/BUILDING_ENGINE.md
|
||||
which will result in an `engine` directory in the same directory as `_shorebird`.
|
||||
|
||||
Run `cutler` to get the git commands you need.
|
||||
|
||||
`cutler` has a set of fallback paths it will search to find your checkouts root
|
||||
if you checked out `_shorebird` into the same directory as `engine`, it should
|
||||
find it.
|
||||
|
||||
|
||||
The steps to update our repos:
|
||||
|
||||
1. Rebase buildroot on top of the new buildroot hash, e.g.
|
||||
```
|
||||
git rebase --onto f24f62fa5381c0e415b6ca2000600fc0600c11c8 8747bce41d0dc6d9dc45c4d1b46d2100bb9ee688 7383548fa2306b5d53979ac5e9d176b35258811b
|
||||
```
|
||||
2. Save the commit id from that rebase -- you'll need it to edit the DEPS file in
|
||||
the engine repo. In this example it was "d6c410f19de5947de40ce110c1e768c887870072".
|
||||
|
||||
3. Rebase the engine on top of the new engine hash, e.g.
|
||||
```
|
||||
git rebase --onto 3.10.0-1.5.pre 3.7.12 c415419390e4751ddfa3110e0808e7abb3d45a18
|
||||
```
|
||||
If there are conflicts, you'll need to resolve them. If the conflict
|
||||
is in the DEPS file, you can take it as an opportunity to insert the new
|
||||
buildroot hash.
|
||||
|
||||
4. Save the commit id from that rebase -- you'll need it to edit the engine.version
|
||||
file in the flutter repo. In this example it was "94bc1218b84cc0199068f8788cda96e3128784a0".
|
||||
|
||||
5. Rebase the flutter repo on top of the new flutter hash, e.g.
|
||||
```
|
||||
git rebase --onto 3.10.0-1.5.pre 3.7.12 83305b5088e6fe327fb3334a73ff190828d85713
|
||||
```
|
||||
This might have conflicts, if so you'll need to resolve them. If the conflict
|
||||
is in the DEPS file, you can take it as an opportunity to insert the new
|
||||
engine hash.
|
||||
|
||||
6. Save the commit id from that rebase -- you'll need it to edit the flutter.version
|
||||
file in the shorebird repo. In this example it was "f498c3913890e7a022596029c7f07f467b0889da".
|
||||
|
||||
7. Update the flutter.version file in the shorebird repo to the new flutter
|
||||
hash, e.g.
|
||||
```
|
||||
echo 'f498c3913890e7a022596029c7f07f467b0889da' > bin/internal/flutter.version
|
||||
commit -a -m "Update flutter version to 3.10.0-1.5.pre"
|
||||
```
|
||||
|
||||
8. Now that we've prepared these versions it should be possible to build the
|
||||
engine and test our work!
|
||||
`gclient sync` is only needed if buildroot (`src`) changed.
|
||||
```
|
||||
cd $HOME/Documents/GitHub
|
||||
cd engine
|
||||
gclient sync
|
||||
cd ..
|
||||
./build_engine/build_engine/build.sh $HOME/Documents/GitHub/engine
|
||||
```
|
||||
build.sh currently requires an absolute path to the engine directory or it fails
|
||||
with a cryptic error message crashing in `cargo ndk build`.
|
||||
|
||||
Building will take up to 45 mins on a M2 machine (it builds the engine 3 times)
|
||||
if it's a clean build.
|
||||
|
||||
We don't currently have any integration tests, but we can test manually with an
|
||||
app:
|
||||
```
|
||||
shorebird run --local-engine-src-path=$HOME/Documents/GitHub/engine/src --local-engine android_release_arm64
|
||||
```
|
||||
|
||||
If things look good now we need to tag and push our changes to the git repos
|
||||
we touched earlier.
|
||||
|
||||
9. Tag the buildroot repo with the new buildroot hash, e.g.
|
||||
```
|
||||
cd $HOME/Documents/GitHub/engine/src
|
||||
git tag -a -m "shorebird-3.10.0-1.5.pre" shorebird-3.10.0-1.5.pre d6c410f19de5947de40ce110c1e768c887870072
|
||||
git push origin shorebird-3.10.0-1.5.pre
|
||||
```
|
||||
|
||||
10. Tag the engine repo with the new engine hash, e.g.
|
||||
```
|
||||
cd $HOME/Documents/GitHub/engine/src/flutter
|
||||
git tag -a -m "shorebird-3.10.0-1.5.pre" shorebird-3.10.0-1.5.pre 94bc1218b84cc0199068f8788cda96e3128784a0
|
||||
git push origin shorebird-3.10.0-1.5.pre
|
||||
```
|
||||
|
||||
11. Tag the flutter repo with the new flutter hash, e.g.
|
||||
```
|
||||
cd $HOME/Documents/GitHub/flutter
|
||||
git tag -a -m "shorebird-3.10.0-1.5.pre" shorebird-3.10.0-1.5.pre f498c3913890e7a022596029c7f07f467b0889da
|
||||
git push origin shorebird-3.10.0-1.5.pre
|
||||
```
|
||||
|
||||
12. Sync our tags with the upstream (https://github.com/flutter/flutter):
|
||||
```
|
||||
git fetch --tags upstream
|
||||
git push --tags
|
||||
```
|
||||
|
||||
13. If there were changes to the `patch` binary in the `updater` library we
|
||||
will need to trigger github actions before we can publish the new version of
|
||||
the shorebird engine.
|
||||
|
||||
14. Before we can publish the new version of Shorebird, we need to build the
|
||||
engine for all the platforms we support. We do that by running the
|
||||
`build_and_upload.sh` script in the build_engine repo.
|
||||
|
||||
```
|
||||
./build_engine/build_engine/build_and_upload.sh ./engine 978a56f2d97f9ce24a2b6bc22c9bbceaaba0343c
|
||||
```
|
||||
|
||||
That script should be run in the cloud, but right now I've not figured that out
|
||||
yet, so we run it locally on an arm64 Mac.
|
||||
|
||||
15. Once we've built all artifacts the final step is to push the new version
|
||||
of shorebird to the appropriate branch. e.g.
|
||||
(untested)
|
||||
```
|
||||
cd $HOME/Documents/GitHub/_shorebird/shorebird
|
||||
git tag -a -m "shorebird-3.10.0-1.5.pre" shorebird-3.10.0-1.5.pre $VERSION
|
||||
git push origin shorebird-3.10.0-1.5.pre
|
||||
git push origin/beta shorebird-3.10.0-1.5.pre
|
||||
```
|
||||
@@ -1,70 +0,0 @@
|
||||
# Cutler
|
||||
|
||||
A tool for keeping our fork of Flutter up-to-date with the primary Flutter.
|
||||
|
||||
> "Someone who makes or sells cutlery is a cutler." - Wikipedia
|
||||
>
|
||||
> "Forks are considered cutlery, right?" - Me
|
||||
|
||||
Cutler has two subcommands:
|
||||
* `rebase` for updating our fork of Flutter
|
||||
* `print-versions` for printing out the versions of a given Shorebird hash
|
||||
|
||||
## Prerequisites
|
||||
|
||||
A directory containing git checkouts of:
|
||||
- `shorebird` (this repo)
|
||||
- [Our fork of `flutter`](https://github.com/shorebirdtech/flutter)
|
||||
- NOTE: you will need to add the primary Flutter repo as an upstream:
|
||||
`git remote add upstream https://github.com/flutter/flutter`
|
||||
|
||||
## Usage
|
||||
|
||||
Typical usage, where `root` is the directory containing the git checkouts:
|
||||
|
||||
```bash
|
||||
dart run cutler rebase --root=$HOME/Documents/GitHub --dry-run
|
||||
```
|
||||
|
||||
> **📝 NOTE:**
|
||||
> If you're running `cutler` repeatedly, you might also use `--no-update` after
|
||||
> the first run to avoid waiting to try and update git repos.
|
||||
|
||||
You can also see what the current stable changes would look like applied to
|
||||
another Flutter channel with `--flutter-channel`, e.g.:
|
||||
```
|
||||
dart run cutler rebase --root=$HOME/Documents/GitHub --dry-run --flutter-channel=beta
|
||||
```
|
||||
|
||||
`--dry-run` will show you the changes it plans to make. Actually making the
|
||||
changes might work, but hasn't been tested yet.
|
||||
|
||||
Example invocation, exploring porting a 3.7.12 based fork onto 3.10 (beta):
|
||||
```
|
||||
% dart run cutler rebase --root=$HOME/Documents/GitHub --dry-run --no-update --flutter-channel=beta
|
||||
Building package executable...
|
||||
Built cutler:cutler.
|
||||
Shorebird stable:
|
||||
flutter 83305b5088e6fe327fb3334a73ff190828d85713
|
||||
engine c415419390e4751ddfa3110e0808e7abb3d45a18
|
||||
buildroot 7383548fa2306b5d53979ac5e9d176b35258811b
|
||||
Forkpoints:
|
||||
flutter 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf (3.7.12)
|
||||
engine 1a65d409c7a1438a34d21b60bf30a6fd5db59314 (3.7.12)
|
||||
buildroot 8747bce41d0dc6d9dc45c4d1b46d2100bb9ee688
|
||||
Upstream beta:
|
||||
flutter b1c77b7ed32346fe829c0ca97bd85d19290d54ae (3.10.0-1.5.pre)
|
||||
engine 50e509c2bd0d7788feb675e38321cc5711c8d2d6 (3.10.0-1.5.pre)
|
||||
buildroot f24f62fa5381c0e415b6ca2000600fc0600c11c8
|
||||
Rebasing buildroot...
|
||||
git rebase --onto f24f62fa5381c0e415b6ca2000600fc0600c11c8 8747bce41d0dc6d9dc45c4d1b46d2100bb9ee688 7383548fa2306b5d53979ac5e9d176b35258811b
|
||||
Rebasing engine...
|
||||
git rebase --onto 3.10.0-1.5.pre 3.7.12 c415419390e4751ddfa3110e0808e7abb3d45a18
|
||||
Rebasing flutter...
|
||||
git rebase --onto 3.10.0-1.5.pre 3.7.12 83305b5088e6fe327fb3334a73ff190828d85713
|
||||
Updating engine DEPS...
|
||||
Would have changed DEPS lines:
|
||||
( 'src': 'https://github.com/shorebirdtech/buildroot.git' + '@' + 'new-buildroot-hash',)
|
||||
Updating shorebird flutter version...
|
||||
Change flutter.version: new-flutter-hash from 83305b5088e6fe327fb3334a73ff190828d85713
|
||||
```
|
||||
@@ -1 +0,0 @@
|
||||
include: package:very_good_analysis/analysis_options.5.1.0.yaml
|
||||
@@ -1,12 +0,0 @@
|
||||
import 'package:cutler/cutler.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:scoped/scoped.dart';
|
||||
|
||||
void main(List<String> args) {
|
||||
runScoped(
|
||||
() => Cutler().run(args),
|
||||
values: {
|
||||
loggerRef,
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -1,271 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:cutler/model.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
/// This file provides the git extensions to our model objects for Cutler.
|
||||
/// That lets the models be pure data objects, and keeps the command-running
|
||||
/// code separate. Unsure if this is a good design or not.
|
||||
|
||||
/// Runs a command and returns the result.
|
||||
ProcessResult runCommandInner(
|
||||
String executable,
|
||||
List<String> arguments, {
|
||||
String? workingDirectory,
|
||||
}) {
|
||||
if (workingDirectory != null && !Directory(workingDirectory).existsSync()) {
|
||||
throw Exception('Directory $workingDirectory does not exist.');
|
||||
}
|
||||
|
||||
final workingDirectoryString = workingDirectory == null ||
|
||||
p.equals(workingDirectory, Directory.current.path)
|
||||
? ''
|
||||
: ' (in $workingDirectory)';
|
||||
logger.detail("$executable ${arguments.join(' ')}$workingDirectoryString");
|
||||
|
||||
return Process.runSync(
|
||||
executable,
|
||||
arguments,
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
}
|
||||
|
||||
/// Runs a command and returns stdout, trimmed.
|
||||
String runCommand(
|
||||
String executable,
|
||||
List<String> arguments, {
|
||||
String? workingDirectory,
|
||||
}) {
|
||||
final result = runCommandInner(
|
||||
executable,
|
||||
arguments,
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
if (result.exitCode != 0) {
|
||||
throw Exception(
|
||||
'Failed to run $executable $arguments: ${result.stdout} ${result.stderr}',
|
||||
);
|
||||
}
|
||||
return result.stdout.toString().trim();
|
||||
}
|
||||
|
||||
/// Represents all the checkouts cutler knows about.
|
||||
class Checkouts {
|
||||
/// Constructs a new [Checkouts] object with a given [root] directory.
|
||||
Checkouts(this.root) {
|
||||
for (final repo in Repo.values) {
|
||||
_checkouts[repo] = Checkout(repo, root);
|
||||
}
|
||||
}
|
||||
|
||||
/// The root directory for all checkouts.
|
||||
final String root;
|
||||
|
||||
/// The checkouts.
|
||||
final _checkouts = <Repo, Checkout>{};
|
||||
|
||||
/// Returns an iterable of all checkouts.
|
||||
Iterable<Checkout> get values => _checkouts.values;
|
||||
|
||||
/// Returns a [Checkout] for a given [repo].
|
||||
Checkout operator [](Repo repo) => _checkouts[repo]!;
|
||||
|
||||
/// Returns a [Checkout] for Flutter.
|
||||
Checkout get flutter => _checkouts[Repo.flutter]!;
|
||||
|
||||
/// Returns a [Checkout] for Engine.
|
||||
Checkout get engine => _checkouts[Repo.engine]!;
|
||||
|
||||
/// Returns a [Checkout] for Dart.
|
||||
Checkout get dart => _checkouts[Repo.dart]!;
|
||||
|
||||
/// Returns a [Checkout] for Buildroot.
|
||||
Checkout get buildroot => _checkouts[Repo.buildroot]!;
|
||||
|
||||
/// Returns a [Checkout] for Shorebird.
|
||||
Checkout get shorebird => _checkouts[Repo.shorebird]!;
|
||||
}
|
||||
|
||||
/// Extension methods for [Repo] to do actual `git` actions.
|
||||
class Checkout {
|
||||
/// Constructs a new [Checkout] for a given [repo].
|
||||
Checkout(this.repo, String checkoutsRoot) : _checkoutsRoot = checkoutsRoot;
|
||||
|
||||
/// The repo this checkout is for.
|
||||
final Repo repo;
|
||||
|
||||
/// The root directory for all checkouts.
|
||||
final String _checkoutsRoot;
|
||||
|
||||
/// The name of this repo.
|
||||
String get name => repo.name;
|
||||
|
||||
/// Updates this repo.
|
||||
void fetchAll() {
|
||||
runCommand(
|
||||
'git',
|
||||
['fetch', '--all', '--tags'],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
}
|
||||
|
||||
/// Returns a [Version] for the given [commitish].
|
||||
Version versionFrom(String commitish, {bool lookupTags = true}) {
|
||||
final hash = runCommand(
|
||||
'git',
|
||||
['rev-parse', commitish],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
return Version(
|
||||
hash: hash,
|
||||
repo: repo,
|
||||
aliases: lookupTags ? getTagsFor(hash) : [],
|
||||
);
|
||||
}
|
||||
|
||||
/// Returns a [Version] for the given [branch] in the given [remote].
|
||||
Version remoteBranch({required String branch, required String remote}) {
|
||||
final output = runCommand(
|
||||
'git',
|
||||
['ls-remote', '--refs', remote, branch],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
final hash = output.split('\t').first;
|
||||
final name = output.split('\t').last;
|
||||
return Version(
|
||||
hash: hash,
|
||||
repo: repo,
|
||||
aliases: [name],
|
||||
);
|
||||
}
|
||||
|
||||
/// Returns a [Version] for the given [tag] in the given [remote].
|
||||
Version remoteTag({
|
||||
required String remote,
|
||||
required String tag,
|
||||
}) {
|
||||
final tags = remoteTags(remote: remote, pattern: tag);
|
||||
if (tags.isEmpty) {
|
||||
throw Exception('No tags found for $tag in $remote');
|
||||
}
|
||||
if (tags.length > 1) {
|
||||
throw Exception('Multiple tags found for $tag in $remote');
|
||||
}
|
||||
return tags.first;
|
||||
}
|
||||
|
||||
/// Returns a list of Versions for the given [pattern] in the given [remote].
|
||||
Iterable<Version> remoteTags({
|
||||
required String remote,
|
||||
String? pattern,
|
||||
}) {
|
||||
final args = ['ls-remote', '--tags', remote];
|
||||
if (pattern != null) {
|
||||
args.add(pattern);
|
||||
}
|
||||
final output = runCommand('git', args, workingDirectory: workingDirectory);
|
||||
// split lines
|
||||
final lines = output.split('\n');
|
||||
return lines.map<Version>((line) {
|
||||
final hash = line.split('\t').first;
|
||||
final name = line.split('\t').last;
|
||||
return Version(
|
||||
hash: hash,
|
||||
repo: repo,
|
||||
aliases: [name],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/// Returns true if [ancestor] is an ancestor of [descendant] in this repo.
|
||||
bool isAncestor({required String ancestor, required String descendant}) {
|
||||
final result = runCommandInner(
|
||||
'git',
|
||||
['merge-base', '--is-ancestor', ancestor, descendant],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
return result.exitCode == 0;
|
||||
}
|
||||
|
||||
/// Returns a count of commits between two commits in this repo.
|
||||
int countCommits({required String from, required String to}) {
|
||||
final output = runCommand(
|
||||
'git',
|
||||
['rev-list', '--count', '$from..$to'],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
return int.parse(output);
|
||||
}
|
||||
|
||||
/// Returns the working directory for this repo.
|
||||
String get workingDirectory => '$_checkoutsRoot/${repo.path}';
|
||||
|
||||
/// Returns the latest commit for a given [branch] in this repo.
|
||||
String getLatestCommit(String branch) {
|
||||
return runCommand(
|
||||
'git',
|
||||
['log', '-1', '--pretty=%H', branch],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
}
|
||||
|
||||
/// Returns the tags for a given [commit] in this repo.
|
||||
List<String> getTagsFor(String commit) {
|
||||
final output = runCommand(
|
||||
'git',
|
||||
['tag', '--points-at', commit],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
if (output.isEmpty) {
|
||||
return [];
|
||||
}
|
||||
return output.split('\n');
|
||||
}
|
||||
|
||||
/// Returns the fork point as a [Version] for this repo given a [forkBranch].
|
||||
Version getForkPoint(String forkBranch) {
|
||||
final describeString = runCommand(
|
||||
'git',
|
||||
['describe', '--tags', forkBranch],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
final tag = describeString.split('-').first;
|
||||
return versionFrom(tag);
|
||||
}
|
||||
|
||||
/// Returns the contents of a file at a given [path] in this repo at a given
|
||||
/// [commit].
|
||||
String contentsAtPath(String commit, String path) {
|
||||
return runCommand(
|
||||
'git',
|
||||
['show', '$commit:$path'],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
}
|
||||
|
||||
/// Writes [contents] to a file at a given [path] in this repo.
|
||||
void writeFile(String path, String contents) {
|
||||
File(p.join(workingDirectory, path)).writeAsStringSync(contents);
|
||||
}
|
||||
|
||||
/// Commits to this repo with a given [message].
|
||||
void commit(String message) {
|
||||
runCommand(
|
||||
'git',
|
||||
['commit', '-a', '-m', message],
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
}
|
||||
|
||||
/// Returns a [Version] object representing the current HEAD of this repo.
|
||||
Version localHead() {
|
||||
return versionFrom(
|
||||
runCommand(
|
||||
'git',
|
||||
['rev-parse', 'HEAD'],
|
||||
workingDirectory: workingDirectory,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
import 'package:args/command_runner.dart';
|
||||
import 'package:cutler/checkout.dart';
|
||||
import 'package:cutler/config.dart';
|
||||
import 'package:cutler/cutler.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
|
||||
/// Base class for Cutler subcommands.
|
||||
abstract class CutlerCommand extends Command<int> {
|
||||
/// Constructs a new [CutlerCommand].
|
||||
CutlerCommand();
|
||||
|
||||
/// The global config, set during argument parsing.
|
||||
Config get config => (runner! as Cutler).config;
|
||||
|
||||
/// The checkout objects
|
||||
late final Checkouts checkouts;
|
||||
|
||||
/// The Flutter checkout.
|
||||
Checkout get flutter => checkouts.flutter;
|
||||
|
||||
/// The Engine checkout.
|
||||
Checkout get engine => checkouts.engine;
|
||||
|
||||
/// The Shorebird checkout.
|
||||
Checkout get shorebird => checkouts.shorebird;
|
||||
|
||||
/// The Buildroot checkout.
|
||||
Checkout get buildroot => checkouts.buildroot;
|
||||
|
||||
/// The Dart checkout.
|
||||
Checkout get dart => checkouts.dart;
|
||||
|
||||
/// Update the repos if needed.
|
||||
void updateReposIfNeeded(Config config) {
|
||||
if (!config.doUpdate) {
|
||||
return;
|
||||
}
|
||||
final progress = logger.progress('Updating checkouts...');
|
||||
for (final checkout in checkouts.values) {
|
||||
progress.update('Updating ${checkout.name}');
|
||||
checkout.fetchAll();
|
||||
}
|
||||
progress.complete('Checkouts updated!');
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export 'rebase_command.dart';
|
||||
export 'validate_command.dart';
|
||||
export 'versions_command.dart';
|
||||
@@ -1,201 +0,0 @@
|
||||
import 'package:cutler/checkout.dart';
|
||||
import 'package:cutler/commands/base.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:cutler/model.dart';
|
||||
import 'package:cutler/versions.dart';
|
||||
import 'package:io/io.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
/// This isn't truly a VersionSet since it may not be a consistent
|
||||
/// set of versions built into a Flutter release, rather it's just whatever
|
||||
/// our current HEAD is across our fork repos.
|
||||
VersionSet getHeadVersions(Checkouts checkouts, String forkBranch) {
|
||||
return VersionSet(
|
||||
engine: checkouts.engine.versionFrom(forkBranch),
|
||||
flutter: checkouts.flutter.versionFrom(forkBranch),
|
||||
buildroot: checkouts.buildroot.versionFrom(forkBranch),
|
||||
dart: checkouts.dart.versionFrom(forkBranch),
|
||||
);
|
||||
}
|
||||
|
||||
/// Holds the state about a rebase operation.
|
||||
class RebaseContext {
|
||||
/// Constructs a new [RebaseContext].
|
||||
RebaseContext(this.upstream, this.forkpoint, this.dev, this.devBranch);
|
||||
|
||||
/// The VersionSet of the upstream Flutter we're rebasing to.
|
||||
final VersionSet upstream;
|
||||
|
||||
/// The VersionSet of the Flutter forkpoint we're rebasing from.
|
||||
final VersionSet forkpoint;
|
||||
|
||||
/// The VersionSet of the current HEAD of our fork.
|
||||
final VersionSet dev;
|
||||
|
||||
/// The name of the branches we're rebasing.
|
||||
// FIXME(eseidel): This should move onto Repo.
|
||||
final String devBranch;
|
||||
|
||||
/// Returns the fully qualified branch name for `shorebird/dev`.
|
||||
String get fullyQualifiedBranch => 'origin/$devBranch';
|
||||
|
||||
/// Print the commands needed to rebase `shorebird/dev` to a new revision.
|
||||
void printRebase(Repo repo) {
|
||||
final path = repo.path;
|
||||
final upstreamRef = upstream[repo].ref;
|
||||
final forkpointRef = forkpoint[repo].ref;
|
||||
if (upstreamRef == forkpointRef) {
|
||||
logger
|
||||
..info('# ${repo.name} is already at $upstreamRef')
|
||||
..info('');
|
||||
return;
|
||||
}
|
||||
logger
|
||||
..info('# ${repo.name}')
|
||||
..info('git -C $path fetch --all --tags')
|
||||
..info('git -C $path rebase --onto $upstreamRef '
|
||||
'$forkpointRef $fullyQualifiedBranch')
|
||||
..info('# Handle conflicts');
|
||||
}
|
||||
|
||||
/// Returns true if we need to push `shorebird/dev` to a new revision.
|
||||
bool needsPush(Repo repo) {
|
||||
// Only need to push if we did a rebase (or we changed a dependency).
|
||||
if (upstream[repo].ref != forkpoint[repo].ref) {
|
||||
return true;
|
||||
}
|
||||
return repo.dependencies.any(needsPush);
|
||||
}
|
||||
|
||||
/// Execute the rebase operation.
|
||||
void printCommands() {
|
||||
// Print the commands needed to rebase
|
||||
printRebase(Repo.buildroot);
|
||||
printRebase(Repo.dart);
|
||||
printRebase(Repo.engine);
|
||||
printRebase(Repo.flutter);
|
||||
|
||||
final flutterVersionName = upstream.flutter.aliases.first;
|
||||
|
||||
if (needsPush(Repo.buildroot)) {
|
||||
// If this changes it will inevitably have conflicts to resolve anyway.
|
||||
logger.warn('Need to update buildroot version.');
|
||||
}
|
||||
if (needsPush(Repo.dart)) {
|
||||
// If this changes it will inevitably have conflicts to resolve anyway.
|
||||
logger.warn('Need to update dart version.');
|
||||
}
|
||||
if (needsPush(Repo.engine)) {
|
||||
final versionFilePath =
|
||||
p.join(Repo.flutter.path, Paths.flutterEngineVersion.path);
|
||||
logger
|
||||
..info('git -C ${Repo.engine.path} rev-parse HEAD > $versionFilePath')
|
||||
..info(
|
||||
'git -C ${Repo.flutter.path} commit -a '
|
||||
'-m "Update engine for $flutterVersionName"',
|
||||
)
|
||||
..info('');
|
||||
}
|
||||
if (needsPush(Repo.flutter)) {
|
||||
final versionFilePath =
|
||||
p.join(Repo.shorebird.path, Paths.shorebirdFlutterVersion.path);
|
||||
logger
|
||||
..info('git -C ${Repo.flutter.path} rev-parse HEAD > $versionFilePath')
|
||||
..info(
|
||||
'git -C ${Repo.shorebird.path} commit -a '
|
||||
'-m "Update flutter for $flutterVersionName"',
|
||||
)
|
||||
..info('');
|
||||
}
|
||||
|
||||
final forks = [
|
||||
Repo.buildroot,
|
||||
Repo.dart,
|
||||
Repo.engine,
|
||||
Repo.flutter,
|
||||
];
|
||||
for (final repo in forks) {
|
||||
if (needsPush(repo)) {
|
||||
final path = repo.path;
|
||||
final releaseBranch = 'flutter_release/$flutterVersionName';
|
||||
logger
|
||||
..info('git -C $path push origin -f HEAD:$devBranch')
|
||||
..info('git -C $path push --tags')
|
||||
..info('git -C $path push origin -f $devBranch:$releaseBranch')
|
||||
..info('');
|
||||
}
|
||||
}
|
||||
|
||||
logger
|
||||
..info('# Trigger build_engine action on GHA before pushing shorebird')
|
||||
// We just push `main` for Shorebird, since we don't have a `dev` branch.
|
||||
..info('git -C ${Repo.shorebird.path} push');
|
||||
}
|
||||
}
|
||||
|
||||
/// Print the versions a given Shorebird or Flutter hash depends on.
|
||||
class RebaseCommand extends CutlerCommand {
|
||||
/// Constructs a new [RebaseCommand].
|
||||
RebaseCommand();
|
||||
@override
|
||||
final name = 'rebase';
|
||||
@override
|
||||
final description =
|
||||
'Print the commands needed to rebase `shorebird/dev` to a new revision.';
|
||||
|
||||
@override
|
||||
int run() {
|
||||
checkouts = Checkouts(config.checkoutsRoot);
|
||||
updateReposIfNeeded(config);
|
||||
|
||||
// Figure out our current versions, use `shorebird/dev` as our main branch
|
||||
// This isn't necessarily a self-consistent set of versions.
|
||||
const devBranch = 'shorebird/dev';
|
||||
final dev = getHeadVersions(checkouts, 'origin/$devBranch');
|
||||
printVersions(checkouts, dev);
|
||||
|
||||
// Check if the VersionSet described by our Flutter fork actually matches
|
||||
// what our HEAD is in our `shorebird/dev` branches. This check isn't
|
||||
// necessary, but seems like a good sanity check to make sure that we're
|
||||
// not surprised by this script including new commits in its resulting
|
||||
// VersionSet which were not previously included.
|
||||
final flutterVersions = getFlutterVersions(checkouts, dev.flutter.hash);
|
||||
if (flutterVersions != dev) {
|
||||
logger.warn('shorebirdtech/flutter:HEAD version set does not match '
|
||||
'the latest `$devBranch` version set, this means this script '
|
||||
'will include new commits in its resulting VersionSet which were '
|
||||
'not previously included in the Flutter described by '
|
||||
'shorebirdtech/flutter:HEAD.');
|
||||
printVersions(checkouts, flutterVersions);
|
||||
}
|
||||
|
||||
// Compute the forkpoint of our `shorebird/dev` branches. This is done
|
||||
// based only on our Flutter fork. Another way to do this might be
|
||||
// to walk backwards from `shorebird/dev` until we find a commit which
|
||||
// was not authored by a Shorebird committer.
|
||||
// We can't just compare
|
||||
// `shorebird/dev` to `upstream/stable` because `upstream/stable` may
|
||||
// not be based on the same branch, since `stable` for Flutter is branched
|
||||
// and updated on the branch, rather than being a tag on main.
|
||||
final flutterForkpoint = flutter.getForkPoint(dev.flutter.hash);
|
||||
final flutterHash = flutterForkpoint.hash;
|
||||
final forkpoint = getFlutterVersions(checkouts, flutterHash);
|
||||
logger.info('Forkpoint:');
|
||||
printVersions(checkouts, forkpoint);
|
||||
|
||||
// Figure out the versions we want to rebase to match upstream.
|
||||
const upstreamBranch = 'upstream/stable';
|
||||
final upstream = getFlutterVersions(checkouts, upstreamBranch);
|
||||
if (forkpoint == upstream) {
|
||||
logger.info('forkpoint is current with $upstreamBranch');
|
||||
return ExitCode.success.code;
|
||||
} else {
|
||||
logger.info('forkpoint is behind $upstreamBranch');
|
||||
printVersions(checkouts, upstream);
|
||||
}
|
||||
|
||||
RebaseContext(upstream, forkpoint, dev, devBranch).printCommands();
|
||||
|
||||
return ExitCode.success.code;
|
||||
}
|
||||
}
|
||||
@@ -1,151 +0,0 @@
|
||||
import 'package:cutler/checkout.dart';
|
||||
import 'package:cutler/commands/base.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:cutler/model.dart';
|
||||
import 'package:cutler/versions.dart';
|
||||
import 'package:io/io.dart';
|
||||
import 'package:version/version.dart' as semver;
|
||||
|
||||
/// Check that a tag matches its upstream.
|
||||
bool ensureTagMatch(Checkout checkout, String tag) {
|
||||
final origin = checkout.remoteTag(tag: tag, remote: 'origin');
|
||||
final upstream = checkout.remoteTag(tag: tag, remote: 'upstream');
|
||||
final paddedName = checkout.name.padRight(10);
|
||||
if (origin != upstream) {
|
||||
logger.err('❌ $paddedName tag $origin does not match upstream $upstream');
|
||||
return false;
|
||||
}
|
||||
logger.info('✅ $paddedName ${origin.ref} matches upstream $upstream');
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Check for a flutter_release/$[flutterVersionName] branch in all of our fork
|
||||
/// repositories and that our Flutter forkpoint is included in the release
|
||||
/// branch.
|
||||
bool ensureReleaseBranchesIncludeForkpoint(
|
||||
Checkouts checkouts,
|
||||
String flutterVersionName,
|
||||
) {
|
||||
final forkpoint = getFlutterVersions(checkouts, flutterVersionName);
|
||||
final releaseBranch = 'flutter_release/$flutterVersionName';
|
||||
final forks = [
|
||||
Repo.buildroot,
|
||||
Repo.dart,
|
||||
Repo.engine,
|
||||
Repo.flutter,
|
||||
];
|
||||
for (final repo in forks) {
|
||||
final checkout = checkouts[repo];
|
||||
final remote =
|
||||
checkout.remoteBranch(branch: releaseBranch, remote: 'origin');
|
||||
final paddedName = checkout.name.padRight(10);
|
||||
|
||||
// Check that the versions at flutter_release/$version include the
|
||||
// expected flutter forkpoint hash.
|
||||
final forkpointVersion = forkpoint[repo];
|
||||
if (!checkout.isAncestor(
|
||||
ancestor: forkpointVersion.hash,
|
||||
descendant: remote.hash,
|
||||
)) {
|
||||
logger.err(
|
||||
'❌ $paddedName $releaseBranch does not include '
|
||||
'forkpoint $forkpointVersion',
|
||||
);
|
||||
return false;
|
||||
}
|
||||
logger.info('✅ $paddedName correctly branched');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Validate that a Shorebird release for a given [flutterVersionName]
|
||||
/// exists and is consistent with its Flutter release.
|
||||
bool validateRelease(Checkouts checkouts, String flutterVersionName) {
|
||||
// Check that our flutter fork has the expected tag.
|
||||
if (!ensureTagMatch(checkouts.flutter, flutterVersionName)) {
|
||||
return false;
|
||||
}
|
||||
// Check that the engine has the expected tag.
|
||||
if (!ensureTagMatch(checkouts.engine, flutterVersionName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check for flutter_release/$version in all of our forks
|
||||
// and that our flutter forkpoint is included in the release branch.
|
||||
if (!ensureReleaseBranchesIncludeForkpoint(
|
||||
checkouts,
|
||||
flutterVersionName,
|
||||
)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Return all Flutter versions that are tagged in the upstream Flutter repo.
|
||||
/// Does not include pre-releases.
|
||||
/// Returns in descending order (latest release first).
|
||||
Iterable<String> allFlutterVersions(Checkout flutter) {
|
||||
final versionTags = flutter.remoteTags(remote: 'upstream');
|
||||
final semvers = <semver.Version>[];
|
||||
for (final tag in versionTags) {
|
||||
// e.g. refs/tags/v1.9.7-hotfix.4
|
||||
final tagName = tag.ref;
|
||||
final versionName = tagName.split('/').last;
|
||||
// ignore old versions
|
||||
if (versionName[0] != '3') {
|
||||
continue;
|
||||
}
|
||||
final version = semver.Version.parse(versionName);
|
||||
logger.info('Found flutter tag $version');
|
||||
if (version.isPreRelease) {
|
||||
continue;
|
||||
}
|
||||
semvers.add(version);
|
||||
}
|
||||
semvers.sort();
|
||||
// Default sort is ascending, we want descending so call reversed.
|
||||
return semvers.reversed.map((version) => version.toString());
|
||||
}
|
||||
|
||||
/// Validate that a Shorebird release is consistent with its Flutter release.
|
||||
class ValidateCommand extends CutlerCommand {
|
||||
/// Constructs a new [ValidateCommand].
|
||||
ValidateCommand() {
|
||||
argParser.addFlag(
|
||||
'all',
|
||||
help: 'Validate all Flutter releases.',
|
||||
);
|
||||
}
|
||||
@override
|
||||
final name = 'validate';
|
||||
@override
|
||||
final description =
|
||||
'Validate that a Shorebird release is consistent with its Flutter '
|
||||
'release.';
|
||||
|
||||
@override
|
||||
int run() {
|
||||
checkouts = Checkouts(config.checkoutsRoot);
|
||||
|
||||
// If they passed --all, validate all Flutter releases.
|
||||
// Otherwise, validate the versions they passed.
|
||||
final versions = argResults!['all'] as bool
|
||||
? allFlutterVersions(checkouts.flutter)
|
||||
: argResults!.rest;
|
||||
|
||||
if (versions.isEmpty) {
|
||||
logger
|
||||
..err('No versions to validate.')
|
||||
..info(argParser.usage);
|
||||
return ExitCode.usage.code;
|
||||
}
|
||||
|
||||
for (final version in versions) {
|
||||
logger.info('Validating $version');
|
||||
if (!validateRelease(checkouts, version)) {
|
||||
return ExitCode.software.code;
|
||||
}
|
||||
}
|
||||
return ExitCode.success.code;
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
import 'package:cutler/checkout.dart';
|
||||
import 'package:cutler/commands/base.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:cutler/model.dart';
|
||||
import 'package:cutler/versions.dart';
|
||||
import 'package:io/io.dart';
|
||||
|
||||
/// Print the versions a given Shorebird or Flutter hash depends on.
|
||||
class VersionsCommand extends CutlerCommand {
|
||||
/// Constructs a new [VersionsCommand].
|
||||
VersionsCommand() {
|
||||
argParser.addOption(
|
||||
'repo',
|
||||
abbr: 'r',
|
||||
help: 'Repo the hash belongs to.',
|
||||
allowed: ['shorebird', 'flutter'],
|
||||
defaultsTo: 'shorebird',
|
||||
);
|
||||
}
|
||||
@override
|
||||
final name = 'versions';
|
||||
@override
|
||||
final description =
|
||||
'Print the versions a Shorebird or Flutter release hash depends on.';
|
||||
|
||||
@override
|
||||
int run() {
|
||||
checkouts = Checkouts(config.checkoutsRoot);
|
||||
|
||||
final repoName = argResults!['repo'] as String;
|
||||
final repo = Repo.values.firstWhere((r) => r.name == repoName);
|
||||
final isShorebird = repo.name == 'shorebird';
|
||||
late final String hash;
|
||||
if (argResults!.rest.isEmpty) {
|
||||
hash = isShorebird ? 'origin/stable' : 'upstream/stable';
|
||||
} else {
|
||||
hash = argResults!.rest.first;
|
||||
}
|
||||
|
||||
updateReposIfNeeded(config);
|
||||
|
||||
if (!isShorebird) {
|
||||
final flutterVersions = getFlutterVersions(checkouts, hash);
|
||||
logger.info('Flutter $hash:');
|
||||
printVersions(checkouts, flutterVersions, indent: 2);
|
||||
return ExitCode.success.code;
|
||||
}
|
||||
|
||||
final shorebirdFlutter =
|
||||
shorebird.contentsAtPath(hash, 'bin/internal/flutter.version');
|
||||
final shorebirdVersions = getFlutterVersions(checkouts, shorebirdFlutter);
|
||||
final flutterForkpoint =
|
||||
flutter.getForkPoint(shorebirdVersions.flutter.hash);
|
||||
final flutterHash = flutterForkpoint.hash;
|
||||
final flutterVersions = getFlutterVersions(checkouts, flutterHash);
|
||||
|
||||
logger.info('Shorebird @ $hash');
|
||||
printVersions(
|
||||
checkouts,
|
||||
shorebirdVersions,
|
||||
indent: 2,
|
||||
upstream: flutterVersions,
|
||||
);
|
||||
logger.info('Upstream');
|
||||
printVersions(
|
||||
checkouts,
|
||||
flutterVersions,
|
||||
indent: 2,
|
||||
trailingNewline: false,
|
||||
);
|
||||
|
||||
return ExitCode.success.code;
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
// https://github.com/dart-lang/sdk/issues/18466
|
||||
// https://github.com/dart-lang/path/issues/117#issuecomment-1034313012
|
||||
/// Expands a path that may contain a user directory (`~`). If [env] is
|
||||
/// provided, it will be used instead of [Platform.environment].
|
||||
String expandUser(String path, {Map<String, String>? env}) {
|
||||
// This is not "well written", but eventually I guess we should
|
||||
// write one and publish it if Dart doesn't add an equivalent method.
|
||||
// If we're in CMD or PowerShell, we need to expand %USERPROFILE%. If we're
|
||||
// in WSL, we need to expand $HOME.
|
||||
// This should handle ~ and ~user.
|
||||
final environment = env ?? Platform.environment;
|
||||
if (path.startsWith('~')) {
|
||||
final home = environment['HOME'];
|
||||
if (home == null) {
|
||||
throw Exception('Failed to expand $path');
|
||||
}
|
||||
return path.replaceFirst('~', home);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
// This behavior belongs in the Dart SDK somewhere.
|
||||
/// Find the package root for the current running script.
|
||||
String findPackageRoot({String? scriptPath}) {
|
||||
final path = scriptPath ?? Platform.script.path;
|
||||
// e.g. `dart run bin/cutler.dart`
|
||||
if (path.endsWith('.dart')) {
|
||||
final binPath = p.dirname(path);
|
||||
return p.dirname(binPath);
|
||||
}
|
||||
// `dart run` pre-compiles into a snapshot and then runs, e.g.
|
||||
// .../packages/cutler/.dart_tool/pub/bin/cutler/cutler.dart-3.0.2.snapshot
|
||||
if (path.endsWith('.snapshot') && path.contains('.dart_tool')) {
|
||||
return path.split('.dart_tool').first;
|
||||
}
|
||||
throw UnimplementedError('Could not find package root: $path');
|
||||
}
|
||||
|
||||
// Config is basically just our typed ArgResults held as a global.
|
||||
/// Global configuration object for Cutler.
|
||||
class Config {
|
||||
/// Constructs a new [Config].
|
||||
Config({
|
||||
required this.checkoutsRoot,
|
||||
required this.dryRun,
|
||||
required this.doUpdate,
|
||||
required this.flutterChannel,
|
||||
});
|
||||
|
||||
/// The root directory where checkouts can be found.
|
||||
final String checkoutsRoot;
|
||||
|
||||
/// Whether to perform a dry run.
|
||||
final bool dryRun;
|
||||
|
||||
/// Whether to update checkouts.
|
||||
final bool doUpdate;
|
||||
|
||||
/// The Flutter channel to use.
|
||||
final String flutterChannel;
|
||||
|
||||
/// The name of the release branch for Shorebird.
|
||||
final String shorebirdReleaseBranch = 'origin/stable';
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:args/args.dart';
|
||||
import 'package:args/command_runner.dart';
|
||||
import 'package:cutler/commands/commands.dart';
|
||||
import 'package:cutler/config.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:cutler/model.dart';
|
||||
import 'package:mason_logger/mason_logger.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
/// The main Cutler command runner.
|
||||
class Cutler extends CommandRunner<int> {
|
||||
/// Constructs a new [Cutler] command runner.
|
||||
Cutler() : super('cutler', 'A tool for maintaining forks of Flutter.') {
|
||||
addCommand(VersionsCommand());
|
||||
addCommand(RebaseCommand());
|
||||
addCommand(ValidateCommand());
|
||||
|
||||
argParser
|
||||
..addFlag('verbose', abbr: 'v')
|
||||
..addOption(
|
||||
'root',
|
||||
help: 'Directory in which to find checkouts.',
|
||||
)
|
||||
..addOption(
|
||||
'flutter-channel',
|
||||
defaultsTo: 'stable',
|
||||
help: 'Upstream channel to propose rebasing onto.',
|
||||
)
|
||||
..addFlag('dry-run', defaultsTo: true, help: 'Do not actually run git.')
|
||||
..addFlag('update', defaultsTo: true, help: 'Update checkouts.');
|
||||
}
|
||||
|
||||
/// Global config set during arg parsing.
|
||||
late Config config;
|
||||
|
||||
/// Lists directories missing from the proposed root directory.
|
||||
Iterable<String> missingDirectories(String rootDir) {
|
||||
return Repo.values.map((repo) => '$rootDir/${repo.path}').where(
|
||||
(path) => !Directory(path).existsSync(),
|
||||
);
|
||||
}
|
||||
|
||||
/// Find a valid root directory for checkouts.
|
||||
String fallbackRootDir() {
|
||||
final cutlerRoot = findPackageRoot();
|
||||
final packagesDir = p.dirname(cutlerRoot);
|
||||
final shorebirdDir = p.dirname(packagesDir);
|
||||
final fallbackDirectories = <String>[
|
||||
Directory.current.path,
|
||||
p.dirname(shorebirdDir),
|
||||
// Internal checkouts use a _shorebird wrapper directory.
|
||||
p.dirname(p.dirname(shorebirdDir)),
|
||||
];
|
||||
for (final directory in fallbackDirectories) {
|
||||
if (missingDirectories(directory).isEmpty) {
|
||||
logger.info('Using $directory as checkouts root.');
|
||||
return directory;
|
||||
}
|
||||
}
|
||||
logger.err('Failed to find a valid checkouts root, tried:\n'
|
||||
'${fallbackDirectories.join('\n')}');
|
||||
return ''; // Returning an invalid directory will cause validation to fail.
|
||||
}
|
||||
|
||||
@override
|
||||
ArgResults parse(Iterable<String> args) {
|
||||
final results = super.parse(args);
|
||||
|
||||
final rootDir = results['root'] as String? ?? fallbackRootDir();
|
||||
|
||||
final missingDirs = missingDirectories(rootDir);
|
||||
if (missingDirs.isNotEmpty) {
|
||||
logger
|
||||
..err('Could not find a valid checkouts root.')
|
||||
..err('--root must be a directory containing the '
|
||||
'following:\n${Repo.values.map((r) => r.path).join('\n')}')
|
||||
..err('Missing directories:\n${missingDirs.join('\n')}');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
config = Config(
|
||||
checkoutsRoot: expandUser(rootDir),
|
||||
dryRun: results['dry-run'] as bool,
|
||||
doUpdate: results['update'] as bool,
|
||||
flutterChannel: results['flutter-channel'] as String,
|
||||
);
|
||||
|
||||
if (results['verbose'] as bool) {
|
||||
logger.level = Level.verbose;
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
import 'package:mason_logger/mason_logger.dart';
|
||||
import 'package:scoped/scoped.dart';
|
||||
|
||||
/// A reference to a [Logger] instance.
|
||||
final loggerRef = create(Logger.new);
|
||||
|
||||
/// The [Logger] instance available in the current zone.
|
||||
Logger get logger => read(loggerRef);
|
||||
@@ -1,204 +0,0 @@
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
/// Configuration information for each of our repos.
|
||||
enum Repo {
|
||||
/// Repo configuration representing the Shorebird repo.
|
||||
shorebird(
|
||||
name: 'shorebird',
|
||||
path: '_shorebird/shorebird',
|
||||
url: 'https://github.com/shorebirdtech/shorebird.git',
|
||||
// TODO(eseidel): There is no upstream for Shorebird, this should be null.
|
||||
upstreamBranch: 'origin/main',
|
||||
directDependencies: [Repo.flutter],
|
||||
),
|
||||
|
||||
/// Repo configuration representing the Flutter repo.
|
||||
flutter(
|
||||
name: 'flutter',
|
||||
path: 'flutter',
|
||||
url: 'https://github.com/shorebirdtech/flutter.git',
|
||||
upstreamBranch: 'upstream/stable',
|
||||
directDependencies: [Repo.engine],
|
||||
),
|
||||
|
||||
/// Repo configuration representing the engine repo.
|
||||
engine(
|
||||
name: 'engine',
|
||||
path: 'engine/src/flutter',
|
||||
url: 'https://github.com/shorebirdtech/engine.git',
|
||||
upstreamBranch: 'upstream/master',
|
||||
directDependencies: [Repo.dart, Repo.buildroot],
|
||||
),
|
||||
|
||||
/// Repo configuration representing the dart-lang/sdk repo.
|
||||
dart(
|
||||
name: 'dart',
|
||||
path: 'engine/src/third_party/dart',
|
||||
url: 'https://github.com/shorebirdtech/dart-sdk.git',
|
||||
upstreamBranch: 'upstream/master',
|
||||
directDependencies: [],
|
||||
),
|
||||
|
||||
/// Repo configuration representing the buildroot repo.
|
||||
buildroot(
|
||||
name: 'buildroot',
|
||||
path: 'engine/src',
|
||||
url: 'https://github.com/shorebirdtech/builddoor.git',
|
||||
upstreamBranch: 'upstream/master',
|
||||
directDependencies: [],
|
||||
);
|
||||
|
||||
const Repo({
|
||||
required this.name,
|
||||
required this.path,
|
||||
required this.url,
|
||||
required this.upstreamBranch,
|
||||
required this.directDependencies,
|
||||
});
|
||||
|
||||
/// Returns the name (e.g. 'engine') of the repo.
|
||||
final String name;
|
||||
|
||||
/// Returns the path (e.g. 'engine/src/flutter') of the repo.
|
||||
final String path;
|
||||
|
||||
/// Returns the URL the repo is cloned from.
|
||||
final String url;
|
||||
|
||||
/// Returns the name of the upstream branch.
|
||||
final String upstreamBranch;
|
||||
|
||||
/// Returns the direct dependencies of the repo.
|
||||
final List<Repo> directDependencies;
|
||||
|
||||
/// Returns the transitive dependencies of a given repo.
|
||||
Iterable<Repo> get dependencies {
|
||||
final deps = <Repo>{};
|
||||
for (final dep in directDependencies) {
|
||||
deps
|
||||
..add(dep)
|
||||
..addAll(dep.dependencies);
|
||||
}
|
||||
return deps;
|
||||
}
|
||||
}
|
||||
|
||||
/// Paths to version files in each repo.
|
||||
enum Paths {
|
||||
/// Path to the engine DEPS file in the engine repo.
|
||||
engineDEPS('DEPS'),
|
||||
|
||||
/// Path to the flutter engine version file in the flutter repo.
|
||||
flutterEngineVersion('bin/internal/engine.version'),
|
||||
|
||||
/// Path to the flutter version file in the shorebird repo.
|
||||
shorebirdFlutterVersion('bin/internal/flutter.version');
|
||||
|
||||
const Paths(this.path);
|
||||
|
||||
/// Returns the path (e.g. 'DEPS') of the file.
|
||||
final String path;
|
||||
}
|
||||
|
||||
/// An object to pair a [hash] with a [repo].
|
||||
@immutable
|
||||
class Version {
|
||||
/// Constructs a new [Version] object for a given [hash] and [repo]
|
||||
/// with optionally provided [aliases] for the hash (typically tag names).
|
||||
const Version({
|
||||
required this.hash,
|
||||
required this.repo,
|
||||
this.aliases = const [],
|
||||
});
|
||||
|
||||
/// The hash of the version.
|
||||
final String hash;
|
||||
|
||||
/// Aliases for the hash (typically tag names).
|
||||
final List<String> aliases;
|
||||
|
||||
/// The repo the version is from.
|
||||
final Repo repo;
|
||||
|
||||
/// Returns the first alias for the hash, or the hash if there are no aliases.
|
||||
String get ref => aliases.isEmpty ? hash : aliases.first;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
final aliasesString = aliases.isEmpty ? '' : " (${aliases.join(', ')})";
|
||||
return '$hash$aliasesString';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other is! Version) {
|
||||
return false;
|
||||
}
|
||||
return other.hash == hash && other.repo == repo;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hashAll([hash, repo]);
|
||||
}
|
||||
|
||||
/// An object to hold a set of versions that make up a Flutter release.
|
||||
@immutable
|
||||
class VersionSet {
|
||||
/// Constructs a new [VersionSet] with a given [engine], [flutter], and
|
||||
/// [buildroot] version.
|
||||
const VersionSet({
|
||||
required this.engine,
|
||||
required this.flutter,
|
||||
required this.buildroot,
|
||||
required this.dart,
|
||||
});
|
||||
|
||||
/// The engine version.
|
||||
final Version engine;
|
||||
|
||||
/// The flutter version.
|
||||
final Version flutter;
|
||||
|
||||
/// The dart version.
|
||||
final Version dart;
|
||||
|
||||
/// The buildroot version.
|
||||
final Version buildroot;
|
||||
|
||||
/// Returns the version for a given [repo].
|
||||
Version operator [](Repo repo) => {
|
||||
Repo.engine: engine,
|
||||
Repo.flutter: flutter,
|
||||
Repo.buildroot: buildroot,
|
||||
Repo.dart: dart,
|
||||
}[repo]!;
|
||||
|
||||
/// Copies the VersionSet replacing any provided values.
|
||||
VersionSet copyWith({
|
||||
Version? engine,
|
||||
Version? flutter,
|
||||
Version? buildroot,
|
||||
Version? dart,
|
||||
}) {
|
||||
return VersionSet(
|
||||
engine: engine ?? this.engine,
|
||||
flutter: flutter ?? this.flutter,
|
||||
buildroot: buildroot ?? this.buildroot,
|
||||
dart: dart ?? this.dart,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other is! VersionSet) {
|
||||
return false;
|
||||
}
|
||||
return other.engine == engine &&
|
||||
other.flutter == flutter &&
|
||||
other.buildroot == buildroot &&
|
||||
other.dart == dart;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hashAll([engine, flutter, buildroot, dart]);
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:cutler/checkout.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:cutler/model.dart';
|
||||
|
||||
/// Print VersionSet [versions] to stdout at a given [indent] level.
|
||||
void printVersions(
|
||||
Checkouts checkouts,
|
||||
VersionSet versions, {
|
||||
int indent = 0,
|
||||
VersionSet? upstream,
|
||||
bool trailingNewline = true,
|
||||
}) {
|
||||
final repos = [
|
||||
Repo.flutter,
|
||||
Repo.engine,
|
||||
Repo.dart,
|
||||
Repo.buildroot,
|
||||
];
|
||||
for (final repo in repos) {
|
||||
final checkout = checkouts[repo];
|
||||
final string = "${' ' * indent}${repo.name.padRight(9)} ${versions[repo]}";
|
||||
// Include number of commits ahead of upstream.
|
||||
if (upstream != null) {
|
||||
final upstreamVersion = upstream[repo];
|
||||
final commitCount = checkout.countCommits(
|
||||
from: upstreamVersion.ref,
|
||||
to: versions[repo].ref,
|
||||
);
|
||||
final commitsString = commitCount != 0 ? ' ($commitCount ahead)' : '';
|
||||
logger.info('$string$commitsString');
|
||||
} else {
|
||||
logger.info(string);
|
||||
}
|
||||
}
|
||||
if (trailingNewline) {
|
||||
logger.info('');
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns a [VersionSet] for Flutter for a given [flutterHash].
|
||||
/// e.g. `flutterHash` might be `origin/stable` or `v1.22.0-12.1.pre`.
|
||||
/// and this would return the set of versions (engine and buildroot) that
|
||||
/// Flutter depends on for that release.
|
||||
VersionSet getFlutterVersions(Checkouts checkouts, String flutterHash) {
|
||||
final flutter = checkouts.flutter;
|
||||
final engine = checkouts.engine;
|
||||
final buildroot = checkouts.buildroot;
|
||||
final dart = checkouts.dart;
|
||||
final engineHash =
|
||||
flutter.contentsAtPath(flutterHash, 'bin/internal/engine.version').trim();
|
||||
final depsContents = engine.contentsAtPath(engineHash, Paths.engineDEPS.path);
|
||||
final buildrootHash = parseBuildrootRevision(depsContents);
|
||||
final dartHash = parseDartRevision(depsContents);
|
||||
return VersionSet(
|
||||
engine: engine.versionFrom(engineHash),
|
||||
flutter: flutter.versionFrom(flutterHash),
|
||||
buildroot: buildroot.versionFrom(buildrootHash),
|
||||
dart: dart.versionFrom(dartHash),
|
||||
);
|
||||
}
|
||||
|
||||
/// Parses the given DEPS file contents and returns the buildroot revision.
|
||||
String parseBuildrootRevision(String depsContents) {
|
||||
final lines = depsContents.split('\n');
|
||||
// Example:
|
||||
// 'src': 'https://github.com/flutter/buildroot.git' + '@' + '059d155b4d452efd9c4427c45cddfd9445144869',
|
||||
final buildrootLine =
|
||||
lines.firstWhereOrNull((line) => line.contains("'src': "));
|
||||
if (buildrootLine == null) {
|
||||
throw Exception('Failed to find buildroot revision in DEPS file');
|
||||
}
|
||||
final regexp = RegExp('([0-9a-f]{40})');
|
||||
final match = regexp.firstMatch(buildrootLine);
|
||||
if (match == null) {
|
||||
throw Exception('Failed to parse buildroot revision from $buildrootLine');
|
||||
}
|
||||
return match.group(0)!;
|
||||
}
|
||||
|
||||
/// Parses the given DEPS file contents and returns the dart-lang/sdk revision.
|
||||
String parseDartRevision(String depsContents) {
|
||||
final lines = depsContents.split('\n');
|
||||
// Example:
|
||||
// 'dart_sdk_revision': 'ce926bc6dcf649bd31a396e4e3961196115727cd',
|
||||
// In our fork we use dart_sdk_revision, not dart_revision, since the former
|
||||
// points to our fork of the Dart SDK and the latter points to some base
|
||||
// revision for dart.googlesource.com/sdk.
|
||||
// For upstream we use 'dart_revision'.
|
||||
final dartLine = lines
|
||||
.firstWhereOrNull((line) => line.contains("'dart_sdk_revision': ")) ??
|
||||
lines.firstWhere((line) => line.contains("'dart_revision': "));
|
||||
final regexp = RegExp('([0-9a-f]{40})');
|
||||
final match = regexp.firstMatch(dartLine);
|
||||
if (match == null) {
|
||||
throw Exception('Failed to parse dart revision from $dartLine');
|
||||
}
|
||||
return match.group(0)!;
|
||||
}
|
||||
@@ -1,420 +0,0 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "64.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.2.0"
|
||||
args:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: args
|
||||
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.11.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
collection:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: collection
|
||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.18.0"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
coverage:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: coverage
|
||||
sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.6.3"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: frontend_server_client
|
||||
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_multi_server
|
||||
sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
io:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: io
|
||||
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.7"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
mason_logger:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: mason_logger
|
||||
sha256: "5d2819827d53bf0178637b64c090be546b1801550fa0af7b2780fa7e3ad7b4b7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.9"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.16"
|
||||
meta:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: meta
|
||||
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
mocktail:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: mocktail
|
||||
sha256: "9503969a7c2c78c7292022c70c0289ed6241df7a9ba720010c0b215af29a5a58"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
node_preamble:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: node_preamble
|
||||
sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
path:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: path
|
||||
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.3"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pool
|
||||
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
scoped:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "../scoped"
|
||||
relative: true
|
||||
source: path
|
||||
version: "0.1.0+1"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
shelf_packages_handler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_packages_handler
|
||||
sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
shelf_static:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_static
|
||||
sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
source_map_stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_map_stack_trace
|
||||
sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
source_maps:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_maps
|
||||
sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.10.12"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.1"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
test:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: test
|
||||
sha256: "9b0dd8e36af4a5b1569029949d50a52cb2a2a2fdaa20cebb96e6603b9ae241f9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.24.6"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.1"
|
||||
test_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_core
|
||||
sha256: "4bef837e56375537055fdbbbf6dd458b1859881f4c7e6da936158f77d61ab265"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.6"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
version:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: version
|
||||
sha256: "3d4140128e6ea10d83da32fef2fa4003fccbf6852217bb854845802f04191f94"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
very_good_analysis:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: very_good_analysis
|
||||
sha256: "9ae7f3a3bd5764fb021b335ca28a34f040cd0ab6eec00a1b213b445dae58a4b8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.0"
|
||||
vm_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "11.10.0"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket_channel
|
||||
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
webkit_inspection_protocol:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webkit_inspection_protocol
|
||||
sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.7"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.0.0 <4.0.0"
|
||||
@@ -1,24 +0,0 @@
|
||||
name: cutler
|
||||
description: A tool for managing Flutter forks.
|
||||
version: 1.0.0
|
||||
repository: https://github.com/shorebirdtech/shorebird
|
||||
publish_to: none
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0 <4.0.0'
|
||||
|
||||
dev_dependencies:
|
||||
test: ^1.21.0
|
||||
very_good_analysis: ^5.1.0
|
||||
|
||||
dependencies:
|
||||
args: ^2.4.0
|
||||
collection: ^1.18.0
|
||||
io: ^1.0.4
|
||||
mason_logger: ^0.2.9
|
||||
meta: ^1.9.1
|
||||
mocktail: ^1.0.0
|
||||
path: ^1.8.3
|
||||
scoped:
|
||||
path: ../scoped
|
||||
version: ^3.0.2
|
||||
@@ -1,105 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cutler/checkout.dart';
|
||||
import 'package:cutler/logger.dart';
|
||||
import 'package:cutler/model.dart';
|
||||
import 'package:mason_logger/mason_logger.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
import 'package:scoped/scoped.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
class _MockLogger extends Mock implements Logger {}
|
||||
|
||||
void main() {
|
||||
test('runCommand', () {
|
||||
final dartPath = Platform.executable;
|
||||
expect(
|
||||
() => runCommand(dartPath, [], workingDirectory: 'DOES_NOT_EXIST'),
|
||||
throwsA(isA<Exception>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('runCommand with git', () {
|
||||
final systemTemp = Directory.systemTemp;
|
||||
final temp = systemTemp.createTempSync();
|
||||
// Should this use something like:
|
||||
// https://pub.dev/packages/process_run?
|
||||
// or https://dcli.onepub.dev/dcli-api/calling-apps#which
|
||||
const gitPath = 'git';
|
||||
final result = runScoped(
|
||||
() {
|
||||
return runCommand(gitPath, ['init'], workingDirectory: temp.path);
|
||||
},
|
||||
values: {
|
||||
loggerRef.overrideWith(_MockLogger.new),
|
||||
},
|
||||
);
|
||||
expect(result, contains('Initialized empty Git repository'));
|
||||
});
|
||||
|
||||
test('Checkouts', () {
|
||||
final checkouts = Checkouts('ROOT');
|
||||
expect(checkouts.dart.name, 'dart');
|
||||
expect(checkouts.engine.name, 'engine');
|
||||
expect(checkouts.flutter.name, 'flutter');
|
||||
expect(checkouts.buildroot.name, 'buildroot');
|
||||
expect(checkouts.shorebird.name, 'shorebird');
|
||||
expect(checkouts.values.length, 5);
|
||||
expect(checkouts.buildroot.workingDirectory, 'ROOT/engine/src');
|
||||
expect(checkouts.engine.workingDirectory, 'ROOT/engine/src/flutter');
|
||||
expect(checkouts.dart.workingDirectory, 'ROOT/engine/src/third_party/dart');
|
||||
expect(checkouts.flutter.workingDirectory, 'ROOT/flutter');
|
||||
expect(checkouts.shorebird.workingDirectory, 'ROOT/_shorebird/shorebird');
|
||||
});
|
||||
|
||||
Directory setupCheckouts() {
|
||||
final systemTemp = Directory.systemTemp;
|
||||
final checkoutsRoot = systemTemp.createTempSync();
|
||||
for (final repo in Repo.values) {
|
||||
final dir = Directory('${checkoutsRoot.path}/${repo.path}')
|
||||
..createSync(recursive: true);
|
||||
runCommand('git', ['init'], workingDirectory: dir.path);
|
||||
final checkout = Checkout(repo, checkoutsRoot.path)
|
||||
..writeFile('NAME', repo.name);
|
||||
runCommand('git', ['add', 'NAME'], workingDirectory: dir.path);
|
||||
// Git requires user.email user.name to be set before committing.
|
||||
runCommand(
|
||||
'git',
|
||||
['config', 'user.email', 'test@shorebird.dev'],
|
||||
workingDirectory: dir.path,
|
||||
);
|
||||
runCommand(
|
||||
'git',
|
||||
['config', 'user.name', 'Cutler Checkout Test'],
|
||||
workingDirectory: dir.path,
|
||||
);
|
||||
checkout.commit('Test commit');
|
||||
}
|
||||
return checkoutsRoot;
|
||||
}
|
||||
|
||||
test('Checkouts real git commands', () {
|
||||
runScoped(
|
||||
() {
|
||||
final root = setupCheckouts();
|
||||
final checkouts = Checkouts(root.path);
|
||||
expect(checkouts.dart.contentsAtPath('HEAD', 'NAME'), 'dart');
|
||||
expect(checkouts.engine.contentsAtPath('HEAD', 'NAME'), 'engine');
|
||||
expect(checkouts.flutter.contentsAtPath('HEAD', 'NAME'), 'flutter');
|
||||
expect(checkouts.buildroot.contentsAtPath('HEAD', 'NAME'), 'buildroot');
|
||||
expect(checkouts.shorebird.contentsAtPath('HEAD', 'NAME'), 'shorebird');
|
||||
|
||||
// Should not throw.
|
||||
checkouts.dart.fetchAll();
|
||||
expect(checkouts.dart.getTagsFor('HEAD'), equals([]));
|
||||
expect(
|
||||
checkouts.dart.getLatestCommit('HEAD'),
|
||||
equals(checkouts.dart.localHead().hash),
|
||||
);
|
||||
},
|
||||
values: {
|
||||
loggerRef.overrideWith(_MockLogger.new),
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
import 'package:cutler/config.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('expandUser', () {
|
||||
final path = expandUser('~/foo/bar', env: {'HOME': '/home/user'});
|
||||
expect(path, endsWith('/home/user/foo/bar'));
|
||||
|
||||
// HOME is not set.
|
||||
expect(() => expandUser('~/foo/bar', env: {}), throwsA(isA<Exception>()));
|
||||
});
|
||||
|
||||
test('packageRootFromScriptPath', () {
|
||||
// Using Platform.script.path inside a test is sometimes a
|
||||
// .dill file (from package test) or sometimes a snapshot
|
||||
// e.g. from very_good test.
|
||||
expect(findPackageRoot(scriptPath: '/foo/bar/bin/baz.dart'), '/foo/bar');
|
||||
expect(
|
||||
findPackageRoot(
|
||||
scriptPath:
|
||||
'/src/foo/.dart_tool/pub/bin/cutler/cutler.dart-3.0.2.snapshot',
|
||||
),
|
||||
'/src/foo/',
|
||||
);
|
||||
expect(
|
||||
() => findPackageRoot(scriptPath: '/invalid'),
|
||||
throwsA(isA<UnimplementedError>()),
|
||||
);
|
||||
});
|
||||
}
|
||||
Vendored
-965
@@ -1,965 +0,0 @@
|
||||
# Example DEPS file from Flutter Engine
|
||||
# Used to test our DEPS parsing regex.
|
||||
|
||||
# The dependencies referenced by the Flutter Engine.
|
||||
#
|
||||
# This file is referenced by the .gclient file at the root of the checkout.
|
||||
# To preview changes to the dependencies, update this file and run
|
||||
# `gclient sync`.
|
||||
#
|
||||
# When adding a new dependency, please update the top-level .gitignore file
|
||||
# to list the dependency's destination directory.
|
||||
|
||||
vars = {
|
||||
'chromium_git': 'https://chromium.googlesource.com',
|
||||
'swiftshader_git': 'https://swiftshader.googlesource.com',
|
||||
'dart_git': 'https://dart.googlesource.com',
|
||||
'flutter_git': 'https://flutter.googlesource.com',
|
||||
'fuchsia_git': 'https://fuchsia.googlesource.com',
|
||||
'github_git': 'https://github.com',
|
||||
'skia_git': 'https://skia.googlesource.com',
|
||||
'llvm_git': 'https://llvm.googlesource.com',
|
||||
# OCMock is for testing only so there is no google clone
|
||||
'ocmock_git': 'https://github.com/erikdoe/ocmock.git',
|
||||
'skia_revision': '0d31aa1f49cb8cfd790c44d92a9a023839524865',
|
||||
|
||||
'updater_git': 'https://github.com/shorebirdtech/updater.git',
|
||||
'updater_rev': '226df7d08dd7899e5cad6b597f2405708e8560d4',
|
||||
|
||||
# WARNING: DO NOT EDIT canvaskit_cipd_instance MANUALLY
|
||||
# See `lib/web_ui/README.md` for how to roll CanvasKit to a new version.
|
||||
'canvaskit_cipd_instance': '61aeJQ9laGfEFF_Vlc_u0MCkqB6xb2hAYHRBxKH-Uw4C',
|
||||
|
||||
# Do not download the Emscripten SDK by default.
|
||||
# This prevents us from downloading the Emscripten toolchain for builds
|
||||
# which do not build for the web. This toolchain is needed to build CanvasKit
|
||||
# for the web engine.
|
||||
'download_emsdk': False,
|
||||
|
||||
# For experimental features some dependencies may only be avaialable in the master/main
|
||||
# channels. This variable is being set when CI is checking out the repository.
|
||||
'release_candidate': False,
|
||||
|
||||
|
||||
# As Dart does, we use Fuchsia's GN and Clang toolchain. These revision
|
||||
# should be kept up to date with the revisions pulled by Dart.
|
||||
# The list of revisions for these tools comes from Fuchsia, here:
|
||||
# https://fuchsia.googlesource.com/integration/+/HEAD/toolchain
|
||||
# If there are problems with the toolchain, contact fuchsia-toolchain@.
|
||||
'clang_version': 'git_revision:20d06c833d833ef6b2d0f519cc4a7998d49a2803',
|
||||
|
||||
# When updating the Dart revision, ensure that all entries that are
|
||||
# dependencies of Dart are also updated to match the entries in the
|
||||
# Dart SDK's DEPS file for that revision of Dart. The DEPS file for
|
||||
# Dart is: https://github.com/dart-lang/sdk/blob/main/DEPS
|
||||
# You can use //tools/dart/create_updated_flutter_deps.py to produce
|
||||
# updated revision list of existing dependencies.
|
||||
'dart_revision': '7a6514d1377175decd3a886fe4190fbbebddac3a',
|
||||
|
||||
# WARNING: DO NOT EDIT MANUALLY
|
||||
# The lines between blank lines above and below are generated by a script. See create_updated_flutter_deps.py
|
||||
'dart_binaryen_rev': 'b9b5f162ca8bf5b899ff0f0351491d7d403d7ed9',
|
||||
'dart_boringssl_gen_rev': 'ced85ef0a00bbca77ce5a91261a5f2ae61b1e62f',
|
||||
'dart_boringssl_rev': '87f316d7748268eb56f2dc147bd593254ae93198',
|
||||
'dart_browser_launcher_rev': 'ba4e02851d2e3d5b2889c6b44f6189baea584ce1',
|
||||
'dart_clock_rev': '93d9f56106fdba330bc8fade194038a5561ec730',
|
||||
'dart_collection_rev': '9db854d03529ccf8d0d665868ded65a4c1403c0f',
|
||||
'dart_devtools_rev': '026f0adf03725fbab24d601ac74c811808f258e5',
|
||||
'dart_libprotobuf_rev': '24487dd1045c7f3d64a21f38a3f0c06cc4cf2edb',
|
||||
'dart_perfetto_rev': 'b8da07095979310818f0efde2ef3c69ea70d62c5',
|
||||
'dart_protobuf_gn_rev': 'f872f05cb0378eef9a7a2609076929f0f35b4141',
|
||||
'dart_protobuf_rev': 'b90a4c44d56075eb23ee38ae56ce0febfd7f280f',
|
||||
'dart_pub_rev': '3e2c92a8bb74935302de52b80b870bf66963756d',
|
||||
'dart_root_certificates_rev': '692f6d6488af68e0121317a9c2c9eb393eb0ee50',
|
||||
'dart_watcher_rev': '00aa79b0ff5562c9dafb0525891e2e69c51be06d',
|
||||
'dart_webdev_rev': 'e887316c2352524baaf3b2e5aadd15ba0773edf6',
|
||||
'dart_webkit_inspection_protocol_rev': '8401098ace995e4dcd9855a2741c2dacccaa780b',
|
||||
'dart_yaml_edit_rev': '386fd331f206e0cb1d081cd76a4fe92fe016c99d',
|
||||
'dart_zlib_rev': '27c2f474b71d0d20764f86f60ef8b00da1a16cda',
|
||||
|
||||
'ocmock_rev': 'c4ec0e3a7a9f56cfdbd0aa01f4f97bb4b75c5ef8', # v3.7.1
|
||||
|
||||
# Download a prebuilt Dart SDK by default
|
||||
'download_dart_sdk': True,
|
||||
|
||||
# Checkout Android dependencies only on platforms where we build for Android targets.
|
||||
'download_android_deps': 'host_os == "mac" or (host_os == "linux" and host_cpu == "x64")',
|
||||
|
||||
# Checkout Windows dependencies only if we are building on Windows.
|
||||
'download_windows_deps' : 'host_os == "win"',
|
||||
|
||||
# Checkout Linux dependencies only when building on Linux.
|
||||
'download_linux_deps': 'host_os == "linux"',
|
||||
|
||||
# Downloads the fuchsia SDK as listed in fuchsia_sdk_path var. This variable
|
||||
# is currently only used for the Fuchsia LSC process and is not intended for
|
||||
# local development.
|
||||
'download_fuchsia_sdk': False,
|
||||
'fuchsia_sdk_path': '',
|
||||
|
||||
# An LLVM backend needs LLVM binaries and headers. To avoid build time
|
||||
# increases we can use prebuilts. We don't want to download this on every
|
||||
# CQ/CI bot nor do we want the average Dart developer to incur that cost.
|
||||
# So by default we will not download prebuilts. This varible is needed in
|
||||
# the flutter engine to ensure that Dart gn has access to it as well.
|
||||
"checkout_llvm": False,
|
||||
|
||||
# Setup Git hooks by default.
|
||||
"setup_githooks": True,
|
||||
|
||||
# Upstream URLs for third party dependencies, used in
|
||||
# determining common ancestor commit for vulnerability scanning
|
||||
# prefixed with 'upstream_' in order to be identified by parsing tool.
|
||||
# The vulnerabiity database being used in this scan can be browsed
|
||||
# using this UI https://osv.dev/list
|
||||
# If a new dependency needs to be added, the upstream (non-mirrored)
|
||||
# git URL for that dependency should be added to this list
|
||||
# with the key-value pair being:
|
||||
# 'upstream_[dep name from last slash and before .git in URL]':'[git URL]'
|
||||
# example:
|
||||
"upstream_abseil-cpp": "https://github.com/abseil/abseil-cpp.git",
|
||||
"upstream_angle": "https://github.com/google/angle.git",
|
||||
"upstream_archive": "https://github.com/brendan-duncan/archive.git",
|
||||
"upstream_args": "https://github.com/dart-lang/args.git",
|
||||
"upstream_async": "https://github.com/dart-lang/async.git",
|
||||
"upstream_bazel_worker": "https://github.com/dart-lang/bazel_worker.git",
|
||||
"upstream_benchmark": "https://github.com/google/benchmark.git",
|
||||
"upstream_boolean_selector": "https://github.com/dart-lang/boolean_selector.git",
|
||||
"upstream_boringssl_gen": "https://github.com/dart-lang/boringssl_gen.git",
|
||||
"upstream_boringssl": "https://github.com/openssl/openssl.git",
|
||||
"upstream_browser_launcher": "https://github.com/dart-lang/browser_launcher.git",
|
||||
"upstream_buildroot": "https://github.com/flutter/buildroot.git",
|
||||
"upstream_cli_util": "https://github.com/dart-lang/cli_util.git",
|
||||
"upstream_clock": "https://github.com/dart-lang/clock.git",
|
||||
"upstream_collection": "https://github.com/dart-lang/collection.git",
|
||||
"upstream_colorama": "https://github.com/tartley/colorama.git",
|
||||
"upstream_convert": "https://github.com/dart-lang/convert.git",
|
||||
"upstream_crypto": "https://github.com/dart-lang/crypto.git",
|
||||
"upstream_csslib": "https://github.com/dart-lang/csslib.git",
|
||||
"upstream_dart_style": "https://github.com/dart-lang/dart_style.git",
|
||||
"upstream_dartdoc": "https://github.com/dart-lang/dartdoc.git",
|
||||
"upstream_equatable": "https://github.com/felangel/equatable.git",
|
||||
"upstream_ffi": "https://github.com/dart-lang/ffi.git",
|
||||
"upstream_file": "https://github.com/google/file.dart.git",
|
||||
"upstream_fixnum": "https://github.com/dart-lang/fixnum.git",
|
||||
"upstream_flatbuffers": "https://github.com/google/flatbuffers.git",
|
||||
"upstream_fontconfig": "https://gitlab.freedesktop.org/fontconfig/fontconfig.git",
|
||||
"upstream_freetype2": "https://gitlab.freedesktop.org/freetype/freetype.git",
|
||||
"upstream_gcloud": "https://github.com/dart-lang/gcloud.git",
|
||||
"upstream_glfw": "https://github.com/glfw/glfw.git",
|
||||
"upstream_glob": "https://github.com/dart-lang/glob.git",
|
||||
"upstream_googleapis": "https://github.com/google/googleapis.dart.git",
|
||||
"upstream_googletest": "https://github.com/google/googletest.git",
|
||||
"upstream_gtest-parallel": "https://github.com/google/gtest-parallel.git",
|
||||
"upstream_harfbuzz": "https://github.com/harfbuzz/harfbuzz.git",
|
||||
"upstream_html": "https://github.com/dart-lang/html.git",
|
||||
"upstream_http_multi_server": "https://github.com/dart-lang/http_multi_server.git",
|
||||
"upstream_http_parser": "https://github.com/dart-lang/http_parser.git",
|
||||
"upstream_http": "https://github.com/dart-lang/http.git",
|
||||
"upstream_icu": "https://github.com/unicode-org/icu.git",
|
||||
"upstream_intl": "https://github.com/dart-lang/intl.git",
|
||||
"upstream_imgui": "https://github.com/ocornut/imgui.git",
|
||||
"upstream_inja": "https://github.com/pantor/inja.git",
|
||||
"upstream_json": "https://github.com/nlohmann/json.git",
|
||||
"upstream_json_rpc_2": "https://github.com/dart-lang/json_rpc_2.git",
|
||||
"upstream_libcxx": "https://github.com/llvm-mirror/libcxx.git",
|
||||
"upstream_libcxxabi": "https://github.com/llvm-mirror/libcxxabi.git",
|
||||
"upstream_libexpat": "https://github.com/libexpat/libexpat.git",
|
||||
"upstream_libjpeg-turbo": "https://github.com/libjpeg-turbo/libjpeg-turbo.git",
|
||||
"upstream_libpng": "https://github.com/glennrp/libpng.git",
|
||||
"upstream_libtess2": "https://github.com/memononen/libtess2.git",
|
||||
"upstream_libwebp": "https://chromium.googlesource.com/webm/libwebp.git",
|
||||
"upstream_libxml": "https://gitlab.gnome.org/GNOME/libxml2.git",
|
||||
"upstream_linter": "https://github.com/dart-lang/linter.git",
|
||||
"upstream_logging": "https://github.com/dart-lang/logging.git",
|
||||
"upstream_markdown": "https://github.com/dart-lang/markdown.git",
|
||||
"upstream_matcher": "https://github.com/dart-lang/matcher.git",
|
||||
"upstream_mime": "https://github.com/dart-lang/mime.git",
|
||||
"upstream_mockito": "https://github.com/dart-lang/mockito.git",
|
||||
"upstream_oauth2": "https://github.com/dart-lang/oauth2.git",
|
||||
"upstream_ocmock": "https://github.com/erikdoe/ocmock.git",
|
||||
"upstream_package_config": "https://github.com/dart-lang/package_config.git",
|
||||
"upstream_packages": "https://github.com/flutter/packages.git",
|
||||
"upstream_path": "https://github.com/dart-lang/path.git",
|
||||
"upstream_platform": "https://github.com/google/platform.dart.git",
|
||||
"upstream_pool": "https://github.com/dart-lang/pool.git",
|
||||
"upstream_process_runner": "https://github.com/google/process_runner.git",
|
||||
"upstream_process": "https://github.com/google/process.dart.git",
|
||||
"upstream_protobuf": "https://github.com/google/protobuf.dart.git",
|
||||
"upstream_pub_semver": "https://github.com/dart-lang/pub_semver.git",
|
||||
"upstream_pub": "https://github.com/dart-lang/pub.git",
|
||||
"upstream_pyyaml": "https://github.com/yaml/pyyaml.git",
|
||||
"upstream_quiver-dart": "https://github.com/google/quiver-dart.git",
|
||||
"upstream_rapidjson": "https://github.com/Tencent/rapidjson.git",
|
||||
"upstream_root_certificates": "https://github.com/dart-lang/root_certificates.git",
|
||||
"upstream_sdk": "https://github.com/dart-lang/sdk.git",
|
||||
"upstream_shaderc": "https://github.com/google/shaderc.git",
|
||||
"upstream_shelf": "https://github.com/dart-lang/shelf.git",
|
||||
"upstream_skia": "https://skia.googlesource.com/skia.git",
|
||||
"upstream_source_map_stack_trace": "https://github.com/dart-lang/source_map_stack_trace.git",
|
||||
"upstream_source_maps": "https://github.com/dart-lang/source_maps.git",
|
||||
"upstream_source_span": "https://github.com/dart-lang/source_span.git",
|
||||
"upstream_sqlite": "https://github.com/sqlite/sqlite.git",
|
||||
"upstream_sse": "https://github.com/dart-lang/sse.git",
|
||||
"upstream_stack_trace": "https://github.com/dart-lang/stack_trace.git",
|
||||
"upstream_stream_channel": "https://github.com/dart-lang/stream_channel.git",
|
||||
"upstream_string_scanner": "https://github.com/dart-lang/string_scanner.git",
|
||||
"upstream_SwiftShader": "https://swiftshader.googlesource.com/SwiftShader.git",
|
||||
"upstream_term_glyph": "https://github.com/dart-lang/term_glyph.git",
|
||||
"upstream_test_reflective_loader": "https://github.com/dart-lang/test_reflective_loader.git",
|
||||
"upstream_test": "https://github.com/dart-lang/test.git",
|
||||
"upstream_tinygltf": "https://github.com/syoyo/tinygltf.git",
|
||||
"upstream_typed_data": "https://github.com/dart-lang/typed_data.git",
|
||||
"upstream_usage": "https://github.com/dart-lang/usage.git",
|
||||
"upstream_vector_math": "https://github.com/google/vector_math.dart.git",
|
||||
"upstream_Vulkan-Headers": "https://github.com/KhronosGroup/Vulkan-Headers.git",
|
||||
"upstream_VulkanMemoryAllocator": "https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git",
|
||||
"upstream_watcher": "https://github.com/dart-lang/watcher.git",
|
||||
"upstream_web_socket_channel": "https://github.com/dart-lang/web_socket_channel.git",
|
||||
"upstream_webdev": "https://github.com/dart-lang/webdev.git",
|
||||
"upstream_webkit_inspection_protocol": "https://github.com/google/webkit_inspection_protocol.dart.git",
|
||||
"upstream_wuffs-mirror-release-c": "https://github.com/google/wuffs-mirror-release-c.git",
|
||||
"upstream_yaml_edit": "https://github.com/dart-lang/yaml_edit.git",
|
||||
"upstream_yaml": "https://github.com/dart-lang/yaml.git",
|
||||
"upstream_yapf": "https://github.com/google/yapf.git",
|
||||
"upstream_zlib": "https://github.com/madler/zlib.git",
|
||||
}
|
||||
|
||||
gclient_gn_args_file = 'src/third_party/dart/build/config/gclient_args.gni'
|
||||
gclient_gn_args = [
|
||||
'checkout_llvm'
|
||||
]
|
||||
|
||||
# Only these hosts are allowed for dependencies in this DEPS file.
|
||||
# If you need to add a new host, contact chrome infrastructure team.
|
||||
allowed_hosts = [
|
||||
'boringssl.googlesource.com',
|
||||
'chrome-infra-packages.appspot.com',
|
||||
'chromium.googlesource.com',
|
||||
'dart.googlesource.com',
|
||||
'flutter.googlesource.com',
|
||||
'fuchsia.googlesource.com',
|
||||
'llvm.googlesource.com',
|
||||
'skia.googlesource.com',
|
||||
'swiftshader.googlesource.com',
|
||||
]
|
||||
|
||||
deps = {
|
||||
'src': 'https://github.com/shorebirdtech/buildroot.git' + '@' + 'd6c410f19de5947de40ce110c1e768c887870072',
|
||||
|
||||
# Fuchsia compatibility
|
||||
#
|
||||
# The dependencies in this section should match the layout in the Fuchsia gn
|
||||
# build. Eventually, we'll manage these dependencies together with Fuchsia
|
||||
# and not have to specific hashes.
|
||||
|
||||
'src/third_party/rapidjson':
|
||||
Var('fuchsia_git') + '/third_party/rapidjson' + '@' + 'ef3564c5c8824989393b87df25355baf35ff544b',
|
||||
|
||||
'src/third_party/harfbuzz':
|
||||
Var('flutter_git') + '/third_party/harfbuzz' + '@' + '8e1629fbcf9c5b86f5574232dd271496fabaffaf',
|
||||
|
||||
'src/third_party/libcxx':
|
||||
Var('llvm_git') + '/llvm-project/libcxx' + '@' + '44079a4cc04cdeffb9cfe8067bfb3c276fb2bab0',
|
||||
|
||||
'src/third_party/libcxxabi':
|
||||
Var('llvm_git') + '/llvm-project/libcxxabi' + '@' + '2ce528fb5e0f92e57c97ec3ff53b75359d33af12',
|
||||
|
||||
'src/third_party/glfw':
|
||||
Var('fuchsia_git') + '/third_party/glfw' + '@' + 'dd8a678a66f1967372e5a5e3deac41ebf65ee127',
|
||||
|
||||
'src/third_party/shaderc':
|
||||
Var('github_git') + '/google/shaderc.git' + '@' + '7ea834ecc59258a5c13c3d3e6fa0582bdde7c543',
|
||||
|
||||
'src/third_party/vulkan-deps':
|
||||
Var('chromium_git') + '/vulkan-deps' + '@' + 'a56166d59ebdb0208a7301d267460773df1a1adc',
|
||||
|
||||
'src/third_party/flatbuffers':
|
||||
Var('github_git') + '/google/flatbuffers.git' + '@' + '0a80646371179f8a7a5c1f42c31ee1d44dcf6709',
|
||||
|
||||
'src/third_party/icu':
|
||||
Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '7698bff409f232537fb6e621a430500c0a81682f',
|
||||
|
||||
'src/third_party/khronos':
|
||||
Var('chromium_git') + '/chromium/src/third_party/khronos.git' + '@' + '676d544d2b8f48903b7da9fceffaa534a5613978',
|
||||
|
||||
'src/third_party/gtest-parallel':
|
||||
Var('chromium_git') + '/external/github.com/google/gtest-parallel' + '@' + '38191e2733d7cbaeaef6a3f1a942ddeb38a2ad14',
|
||||
|
||||
'src/third_party/benchmark':
|
||||
Var('github_git') + '/google/benchmark' + '@' + '431abd149fd76a072f821913c0340137cc755f36',
|
||||
|
||||
'src/third_party/googletest':
|
||||
Var('github_git') + '/google/googletest' + '@' + '054a986a8513149e8374fc669a5fe40117ca6b41',
|
||||
|
||||
'src/third_party/boringssl':
|
||||
Var('github_git') + '/dart-lang/boringssl_gen.git' + '@' + Var('dart_boringssl_gen_rev'),
|
||||
|
||||
'src/third_party/yapf':
|
||||
Var('github_git') + '/google/yapf' + '@' + '212c5b5ad8e172d2d914ae454c121c89cccbcb35',
|
||||
|
||||
'src/third_party/boringssl/src':
|
||||
'https://boringssl.googlesource.com/boringssl.git' + '@' + Var('dart_boringssl_rev'),
|
||||
|
||||
'src/third_party/perfetto':
|
||||
Var('fuchsia_git') + "/third_party/android.googlesource.com/platform/external/perfetto"
|
||||
+ '@' + Var('dart_perfetto_rev'),
|
||||
|
||||
'src/third_party/protobuf':
|
||||
Var('fuchsia_git') + '/third_party/protobuf' + '@' + Var('dart_libprotobuf_rev'),
|
||||
|
||||
'src/build/secondary/third_party/protobuf':
|
||||
Var('fuchsia_git') + '/protobuf-gn' + '@' + Var('dart_protobuf_gn_rev'),
|
||||
|
||||
'src/third_party/dart':
|
||||
Var('dart_git') + '/sdk.git' + '@' + Var('dart_revision'),
|
||||
|
||||
# WARNING: Unused Dart dependencies in the list below till "WARNING:" marker are removed automatically - see create_updated_flutter_deps.py.
|
||||
|
||||
'src/third_party/dart/third_party/binaryen/src':
|
||||
Var('chromium_git') + '/external/github.com/WebAssembly/binaryen.git@b9b5f162ca8bf5b899ff0f0351491d7d403d7ed9',
|
||||
|
||||
'src/third_party/dart/third_party/devtools':
|
||||
{'packages': [{'version': 'git_revision:026f0adf03725fbab24d601ac74c811808f258e5', 'package': 'dart/third_party/flutter/devtools'}], 'dep_type': 'cipd'},
|
||||
|
||||
'src/third_party/dart/third_party/pkg/args':
|
||||
Var('dart_git') + '/args.git@5ac2ba1d93f037c7aee2975703bf071f88597a76',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/async':
|
||||
Var('dart_git') + '/async.git@012781315e0f4659bc8d7806352e350e8fff8048',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/bazel_worker':
|
||||
Var('dart_git') + '/bazel_worker.git@d5f88375b41def124aa65be1d4da8a2c9e82e076',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/boolean_selector':
|
||||
Var('dart_git') + '/boolean_selector.git@28dc03d893e5ac4141b48d8e7ef80eacb04de071',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/browser_launcher':
|
||||
Var('dart_git') + '/browser_launcher.git' + '@' + Var('dart_browser_launcher_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/cli_util':
|
||||
Var('dart_git') + '/cli_util.git@6c318c29c4ad0efcbe2e847dd5cebac1e379c8f5',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/clock':
|
||||
Var('dart_git') + '/clock.git' + '@' + Var('dart_clock_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/collection':
|
||||
Var('dart_git') + '/collection.git' + '@' + Var('dart_collection_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/convert':
|
||||
Var('dart_git') + '/convert.git@8812e4034235bf90e89eea7635e10512a35d62e6',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/crypto':
|
||||
Var('dart_git') + '/crypto.git@8a03816370b2f856ab52bf302472a7bf1286094d',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/csslib':
|
||||
Var('dart_git') + '/csslib.git@5836863a4e73da8fb88b9a65901eb653339b1196',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/dart_style':
|
||||
Var('dart_git') + '/dart_style.git@33efb2560c62b7b7bf330009cd757495b0e1456a',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/dartdoc':
|
||||
Var('dart_git') + '/dartdoc.git@1a7952b13858ed307185a28f9b4ea861c0abb1c5',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/ffi':
|
||||
Var('dart_git') + '/ffi.git@04fa38ab45cb2957f9059e03031b53906c2c4385',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/file':
|
||||
Var('dart_git') + '/external/github.com/google/file.dart@72a67c33f90bfb7e10057e286e06d2fe3baa4d98',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/fixnum':
|
||||
Var('dart_git') + '/fixnum.git@92ec336bbd0d03e02be0208483bdfaf68b4b6b7c',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/glob':
|
||||
Var('dart_git') + '/glob.git@eaa878b6af1ec7f7deeab0d2f9e830a7a7da2a8c',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/html':
|
||||
Var('dart_git') + '/html.git@57b747d7052aba08901adb366ffb2836facaa04d',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/http':
|
||||
Var('dart_git') + '/http.git@ffb44388762716f8d93aaa8541f8c5f2de159b71',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/http_multi_server':
|
||||
Var('dart_git') + '/http_multi_server.git@e0b5d357890eb09f0a7b3d26ddf643dee6977c4b',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/http_parser':
|
||||
Var('dart_git') + '/http_parser.git@bbe37dd228ec59f58a73df4b328ef747757165c7',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/intl':
|
||||
Var('dart_git') + '/intl.git@a958db01c90d041f0cd357d1732ae9813b620ee0',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/json_rpc_2':
|
||||
Var('dart_git') + '/json_rpc_2.git@5da270592006e4d43fd5a6ac736829f955881240',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/linter':
|
||||
Var('dart_git') + '/linter.git@c0942721fcc1feeff278f95626cb5d27a654301e',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/logging':
|
||||
Var('dart_git') + '/logging.git@787030a2b3d0d5d53ce57f1c7dc74f27ecb07b0b',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/markdown':
|
||||
Var('dart_git') + '/markdown.git@d437c85188806fe2bfa4f3616159300ba9dc6d2a',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/matcher':
|
||||
Var('dart_git') + '/matcher.git@cb6b68c603d2c57a51bbddfff08fa211bba7dcd3',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/mime':
|
||||
Var('dart_git') + '/mime.git@2d8496df6a6e851816610c3f99eae0d9663f54c4',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/mockito':
|
||||
Var('dart_git') + '/mockito.git@28e8eda2ef16f2e9c5e2e8fef48a834afd33ce44',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/package_config':
|
||||
Var('dart_git') + '/package_config.git@7e09db12e968482ef81e309de3ce233463b4cd7e',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/path':
|
||||
Var('dart_git') + '/path.git@23e33194c4073c0fdd818a70dd944afd5ad206e6',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/pool':
|
||||
Var('dart_git') + '/pool.git@650e5d3eff10529c65ef45b5fcb4bca270c7ea8f',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/protobuf':
|
||||
Var('dart_git') + '/protobuf.git' + '@' + Var('dart_protobuf_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/pub':
|
||||
Var('dart_git') + '/pub.git' + '@' + Var('dart_pub_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/pub_semver':
|
||||
Var('dart_git') + '/pub_semver.git@860e3d825ff7ff9f3422091fe5948f5fd0fb0dcd',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/shelf':
|
||||
Var('dart_git') + '/shelf.git@9a792b49f07bd9d310d83cd103035cc60a9956af',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/source_map_stack_trace':
|
||||
Var('dart_git') + '/source_map_stack_trace.git@08a81a81710fe1442a705c5761bccf3280940a9c',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/source_maps':
|
||||
Var('dart_git') + '/source_maps.git@0a4b030b381996c203f054f4f3f93cd256fec83a',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/source_span':
|
||||
Var('dart_git') + '/source_span.git@b739fbf161e0b3058d6fda6f95953b359afdd0fb',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/sse':
|
||||
Var('dart_git') + '/sse.git@11e83a0810c06b6f468ca8f50117ab97fcf9c92e',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/stack_trace':
|
||||
Var('dart_git') + '/stack_trace.git@9c1b1c506053e98602957b79f45930b31ffdba29',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/stream_channel':
|
||||
Var('dart_git') + '/stream_channel.git@74646ea6d87cf3b3ef5b08656b2afd326e4e5beb',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/string_scanner':
|
||||
Var('dart_git') + '/string_scanner.git@f7a656fdaaab069fc6f8c9d34d3205ce6100dfb1',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/term_glyph':
|
||||
Var('dart_git') + '/term_glyph.git@f6856e264f8f88309be36a7eed6defce2ab38b24',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/test':
|
||||
Var('dart_git') + '/test.git@8ea42987b0fee4a31ec97c101d0c66a461bf18f3',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/test_reflective_loader':
|
||||
Var('dart_git') + '/test_reflective_loader.git@a85a930ad3736f93b96f6cc104d3576c1ae19e0e',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/tools':
|
||||
Var('dart_git') + '/tools.git@0304fbbb42989abd9ab6bbdfad26d830c96a7574',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/typed_data':
|
||||
Var('dart_git') + '/typed_data.git@d85363d2efb333afce07ec409a529ec32986e1a2',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/usage':
|
||||
Var('dart_git') + '/usage.git@0698711985b332432ce9a901bbbd3b1ed227b090',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/watcher':
|
||||
Var('dart_git') + '/watcher.git' + '@' + Var('dart_watcher_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/web_socket_channel':
|
||||
Var('dart_git') + '/web_socket_channel.git@40eb2360e10595c2eab33cf61439c45708eb8d29',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/webdev':
|
||||
Var('dart_git') + '/webdev.git' + '@' + Var('dart_webdev_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/webkit_inspection_protocol':
|
||||
Var('dart_git') + '/external/github.com/google/webkit_inspection_protocol.dart.git' + '@' + Var('dart_webkit_inspection_protocol_rev'),
|
||||
|
||||
'src/third_party/dart/third_party/pkg/yaml':
|
||||
Var('dart_git') + '/yaml.git@56dfaf4fb021ac1c0f1a469e7c8e71ea4f7add2f',
|
||||
|
||||
'src/third_party/dart/third_party/pkg/yaml_edit':
|
||||
Var('dart_git') + '/yaml_edit.git' + '@' + Var('dart_yaml_edit_rev'),
|
||||
|
||||
'src/third_party/dart/tools/sdks':
|
||||
{'packages': [{'version': 'version:3.0.0-369.0.dev', 'package': 'dart/dart-sdk/${{platform}}'}], 'dep_type': 'cipd'},
|
||||
|
||||
# WARNING: end of dart dependencies list that is cleaned up automatically - see create_updated_flutter_deps.py.
|
||||
|
||||
# Prebuilt Dart SDK of the same revision as the Dart SDK source checkout
|
||||
'src/flutter/prebuilts/linux-x64/dart-sdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/dart-sdk/linux-amd64',
|
||||
'version': 'git_revision:'+Var('dart_revision')
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': 'host_os == "linux" and download_dart_sdk'
|
||||
},
|
||||
'src/flutter/prebuilts/linux-arm64/dart-sdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/dart-sdk/linux-arm64',
|
||||
'version': 'git_revision:'+Var('dart_revision')
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': 'host_os == "linux" and download_dart_sdk'
|
||||
},
|
||||
'src/flutter/prebuilts/macos-x64/dart-sdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/dart-sdk/mac-amd64',
|
||||
'version': 'git_revision:'+Var('dart_revision')
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': 'host_os == "mac" and download_dart_sdk'
|
||||
},
|
||||
'src/flutter/prebuilts/macos-arm64/dart-sdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/dart-sdk/mac-arm64',
|
||||
'version': 'git_revision:'+Var('dart_revision')
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': 'host_os == "mac" and download_dart_sdk'
|
||||
},
|
||||
'src/flutter/prebuilts/windows-x64/dart-sdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/dart-sdk/windows-amd64',
|
||||
'version': 'git_revision:'+Var('dart_revision')
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': 'host_os == "win" and download_dart_sdk'
|
||||
},
|
||||
'src/flutter/prebuilts/windows-arm64/dart-sdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/dart-sdk/windows-arm64',
|
||||
'version': 'git_revision:'+Var('dart_revision')
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': 'host_os == "win" and download_dart_sdk and not release_candidate'
|
||||
},
|
||||
|
||||
'src/third_party/colorama/src':
|
||||
Var('chromium_git') + '/external/colorama.git' + '@' + '799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8',
|
||||
|
||||
'src/third_party/expat':
|
||||
Var('chromium_git') + '/external/github.com/libexpat/libexpat.git' + '@' + '654d2de0da85662fcc7644a7acd7c2dd2cfb21f0',
|
||||
|
||||
'src/third_party/freetype2':
|
||||
Var('flutter_git') + '/third_party/freetype2' + '@' + '3bea2761290a1cbe7d8f75c1c5a7ad727f826a66',
|
||||
|
||||
'src/third_party/root_certificates':
|
||||
Var('dart_git') + '/root_certificates.git' + '@' + Var('dart_root_certificates_rev'),
|
||||
|
||||
'src/third_party/skia':
|
||||
Var('skia_git') + '/skia.git' + '@' + Var('skia_revision'),
|
||||
|
||||
'src/third_party/ocmock':
|
||||
Var('ocmock_git') + '@' + Var('ocmock_rev'),
|
||||
|
||||
'src/third_party/updater':
|
||||
Var('updater_git') + '@' + Var('updater_rev'),
|
||||
|
||||
'src/third_party/libjpeg-turbo':
|
||||
Var('fuchsia_git') + '/third_party/libjpeg-turbo' + '@' + '0fb821f3b2e570b2783a94ccd9a2fb1f4916ae9f',
|
||||
|
||||
'src/third_party/libpng':
|
||||
Var('flutter_git') + '/third_party/libpng' + '@' + '9187b6e12756317f6d44fc669ac11dfc262bd192',
|
||||
|
||||
'src/third_party/libwebp':
|
||||
Var('chromium_git') + '/webm/libwebp.git' + '@' + '7dfde712a477e420968732161539011e0fd446cf', # 1.2.0
|
||||
|
||||
'src/third_party/wuffs':
|
||||
Var('skia_git') + '/external/github.com/google/wuffs-mirror-release-c.git' + '@' + '600cd96cf47788ee3a74b40a6028b035c9fd6a61',
|
||||
|
||||
'src/third_party/fontconfig/src':
|
||||
Var('chromium_git') + '/external/fontconfig.git' + '@' + 'c336b8471877371f0190ba06f7547c54e2b890ba',
|
||||
|
||||
'src/third_party/fontconfig':
|
||||
Var('flutter_git') + '/third_party/fontconfig' + '@' + '81c83d510ae3aa75589435ce32a5de05139aacb0',
|
||||
|
||||
'src/third_party/libxml':
|
||||
Var('flutter_git') + '/third_party/libxml' + '@' + 'a143e452b5fc7d872813eeadc8db421694058098',
|
||||
|
||||
'src/third_party/zlib':
|
||||
Var('chromium_git') + '/chromium/src/third_party/zlib.git' + '@' + Var('dart_zlib_rev'),
|
||||
|
||||
'src/third_party/inja':
|
||||
Var('flutter_git') + '/third_party/inja' + '@' + '88bd6112575a80d004e551c98cf956f88ff4d445',
|
||||
|
||||
'src/third_party/libtess2':
|
||||
Var('flutter_git') + '/third_party/libtess2' + '@' + '725e5e08ec8751477565f1d603fd7eb9058c277c',
|
||||
|
||||
'src/third_party/sqlite':
|
||||
Var('flutter_git') + '/third_party/sqlite' + '@' + '0f61bd2023ba94423b4e4c8cfb1a23de1fe6a21c',
|
||||
|
||||
'src/third_party/pyyaml':
|
||||
Var('fuchsia_git') + '/third_party/pyyaml.git' + '@' + '25e97546488eee166b1abb229a27856cecd8b7ac',
|
||||
|
||||
# Upstream Khronos Vulkan Headers are part of vulkan-deps
|
||||
# Downstream Fuchsia Vulkan Headers (v1.2.198)
|
||||
'src/third_party/fuchsia-vulkan':
|
||||
Var('fuchsia_git') + '/third_party/Vulkan-Headers.git' + '@' + '32640ad82ef648768c706c9bf828b77123a09bc2',
|
||||
|
||||
'src/third_party/swiftshader':
|
||||
Var('swiftshader_git') + '/SwiftShader.git' + '@' + '5f9ed9b16931c7155171d31f75004f73f0a3abc8',
|
||||
|
||||
'src/third_party/angle':
|
||||
Var('chromium_git') + '/angle/angle.git' + '@' + '32175d8a6dc185dd850e5c9988f208085c9c0d80',
|
||||
|
||||
'src/third_party/vulkan_memory_allocator':
|
||||
Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator' + '@' + '7de5cc00de50e71a3aab22dea52fbb7ff4efceb6',
|
||||
|
||||
'src/third_party/abseil-cpp':
|
||||
Var('flutter_git') + '/third_party/abseil-cpp.git' + '@' + '61833f2c057a2b1993d871e8c51156aed1dd4354',
|
||||
|
||||
# Dart packages
|
||||
'src/third_party/pkg/archive':
|
||||
Var('github_git') + '/brendan-duncan/archive.git' + '@' + '9de7a0544457c6aba755ccb65abb41b0dc1db70d', # 3.1.2
|
||||
|
||||
'src/third_party/pkg/equatable':
|
||||
Var('github_git') + '/felangel/equatable.git' + '@' + '0ba67c72db8bed75877fc1caafa74112ee0bd921', # 2.0.2
|
||||
|
||||
'src/third_party/pkg/file':
|
||||
Var('dart_git') + '/external/github.com/google/file.dart.git' + '@' + 'b2e31cb6ef40b223701dbfa0b907fe58468484d7', # 6.1.4
|
||||
|
||||
'src/third_party/pkg/flutter_packages':
|
||||
Var('github_git') + '/flutter/packages.git' + '@' + '25454e63851fe7933f04d025606e68c1eac4fe0f', # various
|
||||
|
||||
'src/third_party/pkg/gcloud':
|
||||
Var('github_git') + '/dart-lang/gcloud.git' + '@' + 'a5276b85c4714378e84b1fb478b8feeeb686ac26', # 0.8.6-dev
|
||||
|
||||
'src/third_party/pkg/googleapis':
|
||||
Var('github_git') + '/google/googleapis.dart.git' + '@' + '526011f56d98eab183cc6075ee1392e8303e43e2', # various
|
||||
|
||||
'src/third_party/pkg/platform':
|
||||
Var('github_git') + '/google/platform.dart.git' + '@' + '1ffad63428bbd1b3ecaa15926bacfb724023648c', # 3.1.0
|
||||
|
||||
'src/third_party/pkg/process':
|
||||
Var('github_git') + '/google/process.dart.git' + '@' + '0c9aeac86dcc4e3a6cf760b76fed507107e244d5', # 4.2.1
|
||||
|
||||
'src/third_party/pkg/process_runner':
|
||||
Var('github_git') + '/google/process_runner.git' + '@' + 'd632ea0bfd814d779fcc53a361ed33eaf3620a0b', # 4.0.1
|
||||
|
||||
'src/third_party/pkg/quiver':
|
||||
Var('github_git') + '/google/quiver-dart.git' + '@' + '90b92bee895e507d435012356a8b5c5f17eafa52', # 3.2.1
|
||||
|
||||
'src/third_party/pkg/vector_math':
|
||||
Var('dart_git') + '/external/github.com/google/vector_math.dart.git' + '@' + '0a5fd95449083d404df9768bc1b321b88a7d2eef', # 2.1.0
|
||||
|
||||
'src/third_party/imgui':
|
||||
Var('github_git') + '/ocornut/imgui.git' + '@' + '3ea0fad204e994d669f79ed29dcaf61cd5cb571d',
|
||||
|
||||
'src/third_party/tinygltf':
|
||||
Var('github_git') + '/syoyo/tinygltf.git' + '@' + '9bb5806df4055ac973b970ba5b3e27ce27d98148',
|
||||
|
||||
'src/third_party/json':
|
||||
Var('github_git') + '/nlohmann/json.git' + '@' + '17d9eacd248f58b73f4d1be518ef649fe2295642',
|
||||
|
||||
'src/third_party/gradle': {
|
||||
'packages': [
|
||||
{
|
||||
'version': 'version:7.0.2',
|
||||
'package': 'flutter/gradle'
|
||||
}
|
||||
],
|
||||
'condition': 'download_android_deps',
|
||||
'dep_type': 'cipd'
|
||||
},
|
||||
|
||||
'src/third_party/android_tools/trace_to_text': {
|
||||
'packages': [
|
||||
{
|
||||
# 25.0 downloads for both mac-amd64 and mac-arm64
|
||||
# 26.1 is not found with either platform
|
||||
# 27.1 is the latest release of perfetto
|
||||
'version': 'git_tag:v25.0',
|
||||
'package': 'perfetto/trace_to_text/${{platform}}'
|
||||
}
|
||||
],
|
||||
'condition': 'download_android_deps',
|
||||
'dep_type': 'cipd'
|
||||
},
|
||||
|
||||
'src/third_party/android_tools/google-java-format': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/android/google-java-format',
|
||||
'version': 'version:1.7-1'
|
||||
}
|
||||
],
|
||||
# We want to be able to format these as part of CI, and the CI step that
|
||||
# checks formatting runs without downloading the rest of the Android build
|
||||
# tooling. Therefore unlike all the other Android-related tools, we want to
|
||||
# download this every time.
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/third_party/android_tools': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/android/sdk/all/${{platform}}',
|
||||
'version': 'version:33v6'
|
||||
}
|
||||
],
|
||||
'condition': 'download_android_deps',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/third_party/android_embedding_dependencies': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/android/embedding_bundle',
|
||||
'version': 'last_updated:2021-11-23T12:31:07-0800'
|
||||
}
|
||||
],
|
||||
'condition': 'download_android_deps',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/third_party/web_dependencies': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/web/canvaskit_bundle',
|
||||
'version': Var('canvaskit_cipd_instance')
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/third_party/java/openjdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'flutter/java/openjdk/${{platform}}',
|
||||
'version': 'version:11'
|
||||
}
|
||||
],
|
||||
'condition': 'download_android_deps',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/flutter/third_party/gn': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'gn/gn/${{platform}}',
|
||||
'version': 'git_revision:b79031308cc878488202beb99883ec1f2efd9a6d'
|
||||
},
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
'src/flutter/third_party/ninja': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'infra/3pp/tools/ninja/${{platform}}',
|
||||
'version': 'version:2@1.11.1.chromium.4',
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/buildtools/emsdk': {
|
||||
'url': Var('skia_git') + '/external/github.com/emscripten-core/emsdk.git' + '@' + 'fc645b7626ebf86530dbd82fbece74d457e7ae07',
|
||||
'condition': 'download_emsdk',
|
||||
},
|
||||
|
||||
# Clang on mac and linux are expected to typically be the same revision.
|
||||
# They are separated out so that the autoroller can more easily manage them.
|
||||
'src/buildtools/mac-x64/clang': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/third_party/clang/mac-amd64',
|
||||
'version': Var('clang_version'),
|
||||
}
|
||||
],
|
||||
'condition': 'host_os == "mac"', # On ARM64 Macs too because Goma doesn't support the host-arm64 toolchain.
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/buildtools/mac-arm64/clang': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/third_party/clang/mac-arm64',
|
||||
'version': Var('clang_version'),
|
||||
}
|
||||
],
|
||||
'condition': 'host_os == "mac" and host_cpu == "arm64"',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/buildtools/linux-x64/clang': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/third_party/clang/linux-amd64',
|
||||
'version': Var('clang_version'),
|
||||
}
|
||||
],
|
||||
'condition': 'host_os == "linux" and host_cpu == "x64"',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/buildtools/linux-arm64/clang': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/third_party/clang/linux-arm64',
|
||||
'version': Var('clang_version'),
|
||||
}
|
||||
],
|
||||
'condition': 'host_os == "linux" and host_cpu == "arm64"',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
'src/buildtools/windows-x64/clang': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/third_party/clang/windows-amd64',
|
||||
'version': Var('clang_version'),
|
||||
}
|
||||
],
|
||||
'condition': 'download_windows_deps',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
|
||||
# Get the SDK from https://chrome-infra-packages.appspot.com/p/fuchsia/sdk/core at the 'latest' tag
|
||||
# Get the toolchain from https://chrome-infra-packages.appspot.com/p/fuchsia/clang at the 'goma' tag
|
||||
|
||||
'src/fuchsia/sdk/mac': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/sdk/core/mac-amd64',
|
||||
'version': 'f16HBH4MJdaKy7HlfDR0naUyEH1SZ0DUJINh2WDEYaYC'
|
||||
}
|
||||
],
|
||||
'condition': 'host_os == "mac" and not download_fuchsia_sdk',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
'src/fuchsia/sdk/linux': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/sdk/core/linux-amd64',
|
||||
'version': 'rQKj0gZPJNATiErM86LM5BALaHqREfrozRBvIuYO9u0C'
|
||||
}
|
||||
],
|
||||
'condition': 'host_os == "linux" and not download_fuchsia_sdk',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
}
|
||||
|
||||
recursedeps = [
|
||||
'src/third_party/vulkan-deps',
|
||||
]
|
||||
|
||||
hooks = [
|
||||
{
|
||||
# Generate the Dart SDK's .dart_tool/package_confg.json file.
|
||||
'name': 'Generate .dart_tool/package_confg.json',
|
||||
'pattern': '.',
|
||||
'action': ['python3', 'src/third_party/dart/tools/generate_package_config.py'],
|
||||
},
|
||||
{
|
||||
# Generate the sdk/version file.
|
||||
'name': 'Generate sdk/version',
|
||||
'pattern': '.',
|
||||
'action': ['python3', 'src/third_party/dart/tools/generate_sdk_version_file.py'],
|
||||
},
|
||||
{
|
||||
# Update the Windows toolchain if necessary.
|
||||
'name': 'win_toolchain',
|
||||
'condition': 'download_windows_deps',
|
||||
'pattern': '.',
|
||||
'action': ['python3', 'src/build/vs_toolchain.py', 'update'],
|
||||
},
|
||||
{
|
||||
# Ensure that we don't accidentally reference any .pyc files whose
|
||||
# corresponding .py files have already been deleted.
|
||||
'name': 'remove_stale_pyc_files',
|
||||
'pattern': 'src/tools/.*\\.py',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/tools/remove_stale_pyc_files.py',
|
||||
'src/tools',
|
||||
],
|
||||
},
|
||||
{
|
||||
'name': 'dia_dll',
|
||||
'pattern': '.',
|
||||
'condition': 'download_windows_deps',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/flutter/tools/dia_dll.py',
|
||||
],
|
||||
},
|
||||
{
|
||||
'name': 'linux_sysroot_x64',
|
||||
'pattern': '.',
|
||||
'condition': 'download_linux_deps',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/build/linux/sysroot_scripts/install-sysroot.py',
|
||||
'--arch=x64'],
|
||||
},
|
||||
{
|
||||
'name': 'linux_sysroot_arm64',
|
||||
'pattern': '.',
|
||||
'condition': 'download_linux_deps',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/build/linux/sysroot_scripts/install-sysroot.py',
|
||||
'--arch=arm64'],
|
||||
},
|
||||
{
|
||||
'name': 'pub get --offline',
|
||||
'pattern': '.',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/flutter/tools/pub_get_offline.py',
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'Download Fuchsia SDK',
|
||||
'pattern': '.',
|
||||
'condition': 'download_fuchsia_sdk',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/flutter/tools/download_fuchsia_sdk.py',
|
||||
'--fail-loudly',
|
||||
'--verbose',
|
||||
'--host-os',
|
||||
Var('host_os'),
|
||||
'--fuchsia-sdk-path',
|
||||
Var('fuchsia_sdk_path'),
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'Activate Emscripten SDK',
|
||||
'pattern': '.',
|
||||
'condition': 'download_emsdk',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/flutter/tools/activate_emsdk.py',
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'Setup githooks',
|
||||
'pattern': '.',
|
||||
'condition': 'setup_githooks',
|
||||
'action': [
|
||||
'python3',
|
||||
'src/flutter/tools/githooks/setup.py',
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -1,121 +0,0 @@
|
||||
import 'package:cutler/model.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('Version', () {
|
||||
const one = Version(
|
||||
repo: Repo.flutter,
|
||||
hash: 'abc123',
|
||||
);
|
||||
const two = Version(
|
||||
repo: Repo.flutter,
|
||||
hash: 'abc123',
|
||||
aliases: ['foo', 'bar'],
|
||||
);
|
||||
const three = Version(
|
||||
repo: Repo.flutter,
|
||||
hash: 'def456',
|
||||
);
|
||||
expect(one, equals(two));
|
||||
expect(one, isNot(equals(three)));
|
||||
expect(one.hashCode, equals(two.hashCode));
|
||||
expect(one.hashCode, isNot(equals(three.hashCode)));
|
||||
|
||||
expect(one.ref, equals('abc123'));
|
||||
expect(two.ref, equals('foo'));
|
||||
expect(three.ref, equals('def456'));
|
||||
|
||||
expect(one.toString(), equals('abc123'));
|
||||
expect(two.toString(), equals('abc123 (foo, bar)'));
|
||||
expect(three.toString(), equals('def456'));
|
||||
});
|
||||
|
||||
test('VersionSet', () {
|
||||
const one = VersionSet(
|
||||
engine: Version(
|
||||
repo: Repo.engine,
|
||||
hash: 'e1',
|
||||
),
|
||||
flutter: Version(
|
||||
repo: Repo.flutter,
|
||||
hash: 'f1',
|
||||
),
|
||||
buildroot: Version(
|
||||
repo: Repo.buildroot,
|
||||
hash: 'b1',
|
||||
),
|
||||
dart: Version(
|
||||
repo: Repo.dart,
|
||||
hash: 'd1',
|
||||
),
|
||||
);
|
||||
final two = one.copyWith(
|
||||
engine: const Version(
|
||||
repo: Repo.engine,
|
||||
hash: 'e2',
|
||||
),
|
||||
flutter: const Version(
|
||||
repo: Repo.flutter,
|
||||
hash: 'f2',
|
||||
),
|
||||
buildroot: const Version(
|
||||
repo: Repo.buildroot,
|
||||
hash: 'b2',
|
||||
),
|
||||
dart: const Version(
|
||||
repo: Repo.dart,
|
||||
hash: 'd2',
|
||||
),
|
||||
);
|
||||
expect(one, isNot(equals(two)));
|
||||
expect(one.hashCode, isNot(equals(two.hashCode)));
|
||||
expect(
|
||||
one[Repo.engine],
|
||||
equals(const Version(repo: Repo.engine, hash: 'e1')),
|
||||
);
|
||||
expect(
|
||||
one[Repo.flutter],
|
||||
equals(const Version(repo: Repo.flutter, hash: 'f1')),
|
||||
);
|
||||
expect(
|
||||
one[Repo.buildroot],
|
||||
equals(const Version(repo: Repo.buildroot, hash: 'b1')),
|
||||
);
|
||||
expect(one[Repo.dart], equals(const Version(repo: Repo.dart, hash: 'd1')));
|
||||
expect(
|
||||
two[Repo.engine],
|
||||
equals(const Version(repo: Repo.engine, hash: 'e2')),
|
||||
);
|
||||
expect(
|
||||
two[Repo.flutter],
|
||||
equals(const Version(repo: Repo.flutter, hash: 'f2')),
|
||||
);
|
||||
expect(
|
||||
two[Repo.buildroot],
|
||||
equals(const Version(repo: Repo.buildroot, hash: 'b2')),
|
||||
);
|
||||
expect(two[Repo.dart], equals(const Version(repo: Repo.dart, hash: 'd2')));
|
||||
final three = one.copyWith();
|
||||
expect(one, equals(three));
|
||||
expect(one.hashCode, equals(three.hashCode));
|
||||
});
|
||||
|
||||
test('Repo', () {
|
||||
expect(Repo.engine.name, equals('engine'));
|
||||
expect(Repo.engine.path, equals('engine/src/flutter'));
|
||||
expect(Repo.engine.directDependencies, equals({Repo.dart, Repo.buildroot}));
|
||||
expect(Repo.engine.dependencies, equals({Repo.dart, Repo.buildroot}));
|
||||
|
||||
expect(Repo.dart.name, equals('dart'));
|
||||
expect(Repo.dart.path, equals('engine/src/third_party/dart'));
|
||||
expect(Repo.dart.directDependencies, isEmpty);
|
||||
expect(Repo.dart.dependencies, isEmpty);
|
||||
|
||||
expect(Repo.shorebird.name, equals('shorebird'));
|
||||
expect(Repo.shorebird.directDependencies, equals({Repo.flutter}));
|
||||
expect(
|
||||
Repo.shorebird.dependencies,
|
||||
equals({Repo.flutter, Repo.engine, Repo.dart, Repo.buildroot}),
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cutler/versions.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('parseBuildrootVersion', () {
|
||||
final depsContents = File('test/fixtures/DEPS').readAsStringSync();
|
||||
final buildrootHash = parseBuildrootRevision(depsContents);
|
||||
expect(buildrootHash, 'd6c410f19de5947de40ce110c1e768c887870072');
|
||||
expect(() => parseBuildrootRevision(''), throwsException);
|
||||
expect(
|
||||
() => parseBuildrootRevision(
|
||||
"'src': 'https://github.com/flutter/buildroot.git'",
|
||||
),
|
||||
throwsException,
|
||||
);
|
||||
});
|
||||
test('parseDartVersion', () {
|
||||
final depsContents = File('test/fixtures/DEPS').readAsStringSync();
|
||||
final dartHash = parseDartRevision(depsContents);
|
||||
expect(dartHash, '7a6514d1377175decd3a886fe4190fbbebddac3a');
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user