From 0bf09b7c9aeb051810b032787bbb1dd107667b1b Mon Sep 17 00:00:00 2001 From: Dillon Nys <24740863+dnys1@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:48:36 -0700 Subject: [PATCH] refactor(aft): Remove libgit2dart dependency (#3562) * refactor(aft): Remove `libgit2dart` dependency * chore(repo): Remove `libgit2dart` submodule * ci: Remove `libgit2dart` patches * chore(repo): Remove `libgit2` references from READMEs --- .github/workflows/aft.yaml | 7 +- .github/workflows/dart_dart2js.yaml | 6 +- .github/workflows/dart_ddc.yaml | 6 +- .github/workflows/dart_native.yaml | 6 +- .github/workflows/dart_vm.yaml | 6 +- .github/workflows/generate_workflows.yaml | 6 +- .github/workflows/smoke_test.yaml | 2 - .gitmodules | 3 - CONTRIBUTING.md | 1 - packages/aft/README.md | 14 -- packages/aft/external/libgit2dart | 1 - packages/aft/external/libgit2dart.patch | 29 ---- .../aft/lib/src/changelog/commit_message.dart | 21 +++ .../aft/lib/src/commands/amplify_command.dart | 6 +- .../generate/generate_goldens_command.dart | 14 +- .../src/commands/version_bump_command.dart | 6 +- packages/aft/lib/src/git.dart | 65 +++++++++ packages/aft/lib/src/repo.dart | 125 +++++++----------- packages/aft/pubspec.yaml | 7 +- packages/aft/test/e2e_test.dart | 37 +++--- packages/aft/workflow.yaml | 7 +- packages/aws_sdk/smoke_test/workflow.yaml | 2 - pubspec.yaml | 1 - 23 files changed, 178 insertions(+), 200 deletions(-) delete mode 160000 packages/aft/external/libgit2dart delete mode 100644 packages/aft/external/libgit2dart.patch create mode 100644 packages/aft/lib/src/git.dart diff --git a/.github/workflows/aft.yaml b/.github/workflows/aft.yaml index 8db1cdf5d3..f265ba0dff 100644 --- a/.github/workflows/aft.yaml +++ b/.github/workflows/aft.yaml @@ -40,12 +40,7 @@ jobs: - name: Get Packages working-directory: packages/aft - run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd external/libgit2dart; git apply ../libgit2dart.patch ) - dart pub upgrade - mkdir linux - cp external/libgit2dart/linux/*.so linux + run: dart pub upgrade - name: Save Repo State working-directory: packages/aft diff --git a/.github/workflows/dart_dart2js.yaml b/.github/workflows/dart_dart2js.yaml index e50d9045c9..3c242d5d93 100644 --- a/.github/workflows/dart_dart2js.yaml +++ b/.github/workflows/dart_dart2js.yaml @@ -54,11 +54,7 @@ jobs: - name: Setup aft shell: bash # Run in bash regardless of platform - run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd packages/aft/external/libgit2dart; git apply ../libgit2dart.patch ) - dart pub global activate -spath packages/aft - ( cd packages/aft/external/libgit2dart; git reset --hard HEAD ) + run: dart pub global activate -spath packages/aft - name: Setup Firefox if: ${{ matrix.browser == 'firefox' }} diff --git a/.github/workflows/dart_ddc.yaml b/.github/workflows/dart_ddc.yaml index 22383d30a8..5f3ffd4f6d 100644 --- a/.github/workflows/dart_ddc.yaml +++ b/.github/workflows/dart_ddc.yaml @@ -54,11 +54,7 @@ jobs: - name: Setup aft shell: bash # Run in bash regardless of platform - run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd packages/aft/external/libgit2dart; git apply ../libgit2dart.patch ) - dart pub global activate -spath packages/aft - ( cd packages/aft/external/libgit2dart; git reset --hard HEAD ) + run: dart pub global activate -spath packages/aft - name: Setup Firefox if: ${{ matrix.browser == 'firefox' }} diff --git a/.github/workflows/dart_native.yaml b/.github/workflows/dart_native.yaml index 9d98e9ebf7..5953fe90cf 100644 --- a/.github/workflows/dart_native.yaml +++ b/.github/workflows/dart_native.yaml @@ -54,11 +54,7 @@ jobs: - name: Setup aft shell: bash # Run in bash regardless of platform - run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd packages/aft/external/libgit2dart; git apply ../libgit2dart.patch ) - dart pub global activate -spath packages/aft - ( cd packages/aft/external/libgit2dart; git reset --hard HEAD ) + run: dart pub global activate -spath packages/aft # This is needed to support running tests which depend on db_common. - name: Install SQLite diff --git a/.github/workflows/dart_vm.yaml b/.github/workflows/dart_vm.yaml index 6ee0241122..fe38625fbd 100644 --- a/.github/workflows/dart_vm.yaml +++ b/.github/workflows/dart_vm.yaml @@ -66,11 +66,7 @@ jobs: - name: Setup aft shell: bash # Run in bash regardless of platform - run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd packages/aft/external/libgit2dart; git apply ../libgit2dart.patch ) - dart pub global activate -spath packages/aft - ( cd packages/aft/external/libgit2dart; git reset --hard HEAD ) + run: dart pub global activate -spath packages/aft - name: Bootstrap id: bootstrap diff --git a/.github/workflows/generate_workflows.yaml b/.github/workflows/generate_workflows.yaml index ff9b470e26..9c3abdd905 100644 --- a/.github/workflows/generate_workflows.yaml +++ b/.github/workflows/generate_workflows.yaml @@ -25,11 +25,7 @@ jobs: - name: Setup aft shell: bash # Run in bash regardless of platform - run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd packages/aft/external/libgit2dart; git apply ../libgit2dart.patch ) - dart pub global activate -spath packages/aft - ( cd packages/aft/external/libgit2dart; git reset --hard HEAD ) + run: dart pub global activate -spath packages/aft - name: Generate Workflows run: aft generate workflows --set-exit-if-changed diff --git a/.github/workflows/smoke_test.yaml b/.github/workflows/smoke_test.yaml index cd1e5b0c06..f28c72d758 100644 --- a/.github/workflows/smoke_test.yaml +++ b/.github/workflows/smoke_test.yaml @@ -39,8 +39,6 @@ jobs: - name: Link Packages run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd packages/aft/external/libgit2dart; git apply ../libgit2dart.patch ) dart pub global activate -spath packages/aft aft link diff --git a/.gitmodules b/.gitmodules index 4f2c1b02ed..18c19e3d7c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,6 +7,3 @@ [submodule "packages/secure_storage/amplify_secure_storage_dart/external/libsecret"] path = packages/secure_storage/amplify_secure_storage_dart/external/libsecret url = https://github.com/GNOME/libsecret.git -[submodule "packages/aft/external/libgit2dart"] - path = packages/aft/external/libgit2dart - url = https://github.com/SkinnyMind/libgit2dart.git diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 237e6bbfef..c11d22e11a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -79,7 +79,6 @@ $ cd amplify-flutter Next setup Amplify Flutter Repo Tool (aft). This can be installed using the following: ```sh -$ brew install libgit2 $ dart pub global activate -spath packages/aft ``` diff --git a/packages/aft/README.md b/packages/aft/README.md index 7179982818..f0f72f30da 100644 --- a/packages/aft/README.md +++ b/packages/aft/README.md @@ -28,18 +28,6 @@ A full list of available commands and options can be found by running `aft --hel ## Development -When developing `aft`, some commands will require the `libgit2` library for interacting with the repo's commit history. This library can be installed with the following commands: - -```sh -# macOS -$ brew install libgit2 -``` - -```sh -# Linux -$ sudo apt-get install libgit2-dev -``` - To activate and run the local `aft` package: ```sh @@ -47,8 +35,6 @@ $ dart pub global activate -spath packages/aft $ aft --help ``` -> Note: If you encounter a dependency error for libgit2dart, run `git submodule update --init`. - Make sure the Dart pub cache is in your PATH to run `aft` as a global executable after activating. See [here](https://dart.dev/tools/pub/cmd/pub-global#running-a-script-from-your-path) for more information. ### Writing Scripts diff --git a/packages/aft/external/libgit2dart b/packages/aft/external/libgit2dart deleted file mode 160000 index 34d492a9b6..0000000000 --- a/packages/aft/external/libgit2dart +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 34d492a9b6704a5d5bad7ece8970109df0f05752 diff --git a/packages/aft/external/libgit2dart.patch b/packages/aft/external/libgit2dart.patch deleted file mode 100644 index b9465a2206..0000000000 --- a/packages/aft/external/libgit2dart.patch +++ /dev/null @@ -1,29 +0,0 @@ -diff --git a/pubspec.yaml b/pubspec.yaml -index 5acda72..2831e58 100644 ---- a/pubspec.yaml -+++ b/pubspec.yaml -@@ -8,7 +8,6 @@ homepage: https://github.com/SkinnyMind/libgit2dart - - environment: - sdk: ">=2.18.0 <3.0.0" -- flutter: ">=3.3.0" - - dependencies: - args: ^2.3.0 -@@ -23,16 +22,6 @@ dev_dependencies: - lints: ^2.0.0 - test: ^1.20.0 - --flutter: -- plugin: -- platforms: -- linux: -- pluginClass: Libgit2dartPlugin -- macos: -- pluginClass: Libgit2dartPlugin -- windows: -- pluginClass: Libgit2dartPlugin -- - ffigen: - output: "lib/src/bindings/libgit2_bindings.dart" - headers: diff --git a/packages/aft/lib/src/changelog/commit_message.dart b/packages/aft/lib/src/changelog/commit_message.dart index 4d74dda07c..21582b74cf 100644 --- a/packages/aft/lib/src/changelog/commit_message.dart +++ b/packages/aft/lib/src/changelog/commit_message.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:aft/aft.dart'; +import 'package:aft/src/git.dart'; import 'package:aws_common/aws_common.dart'; import 'package:collection/collection.dart'; @@ -142,6 +143,26 @@ abstract class CommitMessage with AWSEquatable { ); } + factory CommitMessage.fromCommitRef(CommitRef commitRef) { + final (sha, commit) = commitRef; + final [summary, ...body] = LineSplitter.split(commit.message).toList(); + final commitTime = commit.committer + .split(_whitespace) + .firstWhereOrNull(_commitTimeRegex.hasMatch); + return CommitMessage.parse( + sha, + summary, + body: body.skip(1).join('\n'), + commitTimeSecs: switch (commitTime) { + final commitTime? => int.parse(commitTime), + _ => null, + }, + ); + } + + static final _commitTimeRegex = RegExp(r'\d{10}'); + static final _whitespace = RegExp(r'\s+'); + /// The commit's OID SHA. final String sha; diff --git a/packages/aft/lib/src/commands/amplify_command.dart b/packages/aft/lib/src/commands/amplify_command.dart index 48bc7d7164..50a957470e 100644 --- a/packages/aft/lib/src/commands/amplify_command.dart +++ b/packages/aft/lib/src/commands/amplify_command.dart @@ -120,10 +120,7 @@ abstract class AmplifyCommand extends Command return null; }(); - late final Repo repo = Repo( - aftConfig, - logger: logger, - ); + late final Repo repo; /// Runs `git` with the given [args] from the repo's root directory. Future runGit( @@ -194,6 +191,7 @@ abstract class AmplifyCommand extends Command AWSLogger().logLevel = LogLevel.verbose; } logger.verbose('Got configuration: $aftConfig'); + repo = await Repo.open(aftConfig, logger: logger); } @override diff --git a/packages/aft/lib/src/commands/generate/generate_goldens_command.dart b/packages/aft/lib/src/commands/generate/generate_goldens_command.dart index 3c260e9d03..600d47a116 100644 --- a/packages/aft/lib/src/commands/generate/generate_goldens_command.dart +++ b/packages/aft/lib/src/commands/generate/generate_goldens_command.dart @@ -6,16 +6,15 @@ import 'dart:io'; import 'package:aft/aft.dart'; import 'package:aws_common/aws_common.dart'; -import 'package:collection/collection.dart'; import 'package:file/local.dart'; import 'package:git/git.dart'; import 'package:glob/glob.dart'; -import 'package:libgit2dart/libgit2dart.dart'; import 'package:path/path.dart' as p; import 'package:pub_semver/pub_semver.dart'; import 'package:pubspec_parse/pubspec_parse.dart'; import 'package:smithy/ast.dart'; import 'package:smithy_codegen/smithy_codegen.dart'; +import 'package:stream_transform/stream_transform.dart'; const skipProtocols = [ 'shared', @@ -103,17 +102,18 @@ class GenerateGoldensCommand extends AmplifyCommand { exit(1); } - final gitRepo = Repository.open(tmpDir.path); - final versions = gitRepo.tags + final versions = await repo.git + .tags() .map((tag) { try { - return Version.parse(tag); + return Version.parse(tag.tag); } on Object { return null; } }) - .nonNulls - .sorted((a, b) => a.compareTo(b)); + .whereNotNull() + .toList(); + versions.sort(); final latestVersion = versions.last.toString(); logger.info('Updating models to Smithy $latestVersion'); diff --git a/packages/aft/lib/src/commands/version_bump_command.dart b/packages/aft/lib/src/commands/version_bump_command.dart index e02da0aa4f..6260ad434f 100644 --- a/packages/aft/lib/src/commands/version_bump_command.dart +++ b/packages/aft/lib/src/commands/version_bump_command.dart @@ -68,8 +68,8 @@ class VersionBumpCommand extends AmplifyCommand return null; }(); - GitChanges _changesForPackage(PackageInfo package) { - final baseRef = this.baseRef ?? repo.latestBumpRef(package); + Future _changesForPackage(PackageInfo package) async { + final baseRef = this.baseRef ?? await repo.latestBumpRef(package); if (baseRef == null) { exitError( 'No previous version bumps for package (${package.name}). ' @@ -80,7 +80,7 @@ class VersionBumpCommand extends AmplifyCommand } Future> _updateVersions() async { - repo.bumpAllVersions( + await repo.bumpAllVersions( commandPackages, changesForPackage: _changesForPackage, forcedBumpType: forcedBumpType, diff --git a/packages/aft/lib/src/git.dart b/packages/aft/lib/src/git.dart new file mode 100644 index 0000000000..54812e3a31 --- /dev/null +++ b/packages/aft/lib/src/git.dart @@ -0,0 +1,65 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import 'dart:convert'; + +import 'package:git/git.dart'; + +extension GitHelpers on GitDir { + /// Returns the [CommitRef] for the current `HEAD`. + Future get head => commitRef('HEAD'); + + /// Returns the [CommitRef] for the given [commit]. + Future commitRef(String commit) async { + if (_sha1Regex.hasMatch(commit)) { + return ( + commit, + await commitFromRevision(commit), + ); + } + return ( + revParse(commit), + commitFromRevision(commit), + ).wait; + } + + /// Runs a `git diff` between [baseTree] and [headTree] and returns the list + /// of filepaths changed between the two commits. + Future> diffTrees(String baseTree, String headTree) async { + final diff = await runCommand( + ['diff', '--raw', '$baseTree..$headTree'], + ); + final diffs = LineSplitter.split(diff.stdout as String); + final changedPaths = []; + for (final diff in diffs) { + // Example line: + // :100644 100644 475c1a84d 3738675a1 M packages/aws_sdk/smoke_test/test/build_verify_test.dart + changedPaths.add(diff.split(_whitespace).last); + } + return changedPaths; + } + + /// Runs `git rev-parse` with the provided [input]. + Future revParse(String input) async { + final revParse = await runCommand(['rev-parse', input]); + return (revParse.stdout as String).trim(); + } + + /// Lists all commits, in reverse chronological order, between [baseCommit] + /// and [headCommit]. + Stream revList(String baseCommit, String headCommit) async* { + final revList = await runCommand( + ['rev-list', '$baseCommit..$headCommit'], + ); + final commits = LineSplitter.split((revList.stdout as String).trim()); + for (final oid in commits) { + yield await commitRef(oid); + } + } + + static final _sha1Regex = RegExp(r'[a-f0-9]{40}'); + static final _whitespace = RegExp(r'\s+'); +} + +/// A [Commit] and its associated SHA. +typedef CommitRef = (String oid, Commit commit); diff --git a/packages/aft/lib/src/repo.dart b/packages/aft/lib/src/repo.dart index aa2e99298b..78f8201fe4 100644 --- a/packages/aft/lib/src/repo.dart +++ b/packages/aft/lib/src/repo.dart @@ -1,15 +1,17 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import 'dart:async'; import 'dart:io'; import 'package:aft/aft.dart'; import 'package:aft/src/changelog/changelog.dart'; import 'package:aft/src/changelog/commit_message.dart'; +import 'package:aft/src/git.dart'; import 'package:aws_common/aws_common.dart'; import 'package:built_collection/built_collection.dart'; import 'package:collection/collection.dart'; -import 'package:libgit2dart/libgit2dart.dart'; +import 'package:git/git.dart'; import 'package:path/path.dart' as p; import 'package:pub_semver/pub_semver.dart'; @@ -17,10 +19,21 @@ import 'package:pub_semver/pub_semver.dart'; /// management. class Repo { Repo( - this.aftConfig, { + this.aftConfig, + this.git, { AWSLogger? logger, }) : logger = logger ?? AWSLogger().createChild('Repo'); + static Future open( + AftConfig aftConfig, { + AWSLogger? logger, + }) async { + final gitDir = await GitDir.fromExisting( + aftConfig.rootDirectory.toFilePath(), + ); + return Repo(aftConfig, gitDir, logger: logger); + } + final AftConfig aftConfig; Map get allPackages => aftConfig.allPackages.toMap(); @@ -36,6 +49,8 @@ class Repo { final AWSLogger logger; + final GitDir git; + /// All packages which can be published to `pub.dev`. List publishablePackages([ Map? allPackages, @@ -47,16 +62,13 @@ class Repo { .toList(), ); - /// The libgit repository. - late final Repository repo = Repository.open(rootDir.path); - /// Returns the latest version bump commit for [package], or `null` if no such /// commit exists. /// /// This is the marker of the last time [package] was released and is used as /// the base git reference for calculating changes relevant to this version /// bump. - String? latestBumpRef(PackageInfo package) { + Future latestBumpRef(PackageInfo package) async { final packageName = package.name; final component = components[packageName]?.name ?? components.values @@ -67,14 +79,9 @@ class Repo { ) ?.name ?? packageName; - var commit = Commit.lookup(repo: repo, oid: repo.head.target); + var (sha, commit) = await git.head; while (commit.parents.isNotEmpty) { - final commitMessage = CommitMessage.parse( - commit.oid.sha, - commit.summary, - body: commit.body, - commitTimeSecs: commit.time, - ); + final commitMessage = CommitMessage.fromCommitRef((sha, commit)); if (commitMessage is VersionCommitMessage && // Check both the component and the package since the definition of // components can change over time. @@ -83,7 +90,7 @@ class Repo { commitMessage.updatedComponents.isEmpty)) { return commitMessage.sha; } - commit = commit.parent(0); + (sha, commit) = await git.commitRef(commit.parents.first); } return null; } @@ -137,38 +144,18 @@ class Repo { return UnmodifiableMapView(reversedPackageGraph); } - /// The git diff between [oldTree] and [newTree]. - /// - /// **NOTE**: This is an expensive operation and its result should be cached. - Diff diffTrees(Tree oldTree, Tree newTree) => Diff.treeToTree( - repo: repo, - oldTree: oldTree, - newTree: newTree, - ); - final _changesCache = <_DiffMarker, GitChanges>{}; /// Collect all the packages which have changed between [baseRef]..[headRef] /// and the commits which changed them. - GitChanges changes(String baseRef, String headRef) { - // TODO(dnys1): Diff with index if headRef is null to include uncommitted - // changes? - final baseTree = RevParse.single( - repo: repo, - spec: '$baseRef^{tree}', - ) as Tree; - final headTree = RevParse.single( - repo: repo, - spec: '$headRef^{tree}', - ) as Tree; - final diffMarker = _DiffMarker(baseTree, headTree); + Future changes(String baseRef, String headRef) async { + final baseTree = (await git.commitFromRevision(baseRef)).treeSha; + final headTree = (await git.commitFromRevision(headRef)).treeSha; + final diffMarker = (baseTree, headTree); if (_changesCache.containsKey(diffMarker)) { return _changesCache[diffMarker]!; } - final diff = diffTrees(baseTree, headTree); - final changedPaths = diff.deltas.expand( - (delta) => [delta.oldFile.path, delta.newFile.path], - ); + final changedPaths = await git.diffTrees(baseTree, headTree); final changedPackages = {}; for (final changedPath in changedPaths) { final changedPackage = allPackages.values.firstWhereOrNull( @@ -189,32 +176,24 @@ class Repo { final commitsByPackage = SetMultimapBuilder(); final packagesByCommit = SetMultimapBuilder(); for (final package in changedPackages) { - final walker = RevWalk(repo)..pushRange('$baseRef..$headRef'); - for (final commit in walker.walk()) { - for (var i = 0; i < commit.parents.length; i++) { - final parent = commit.parent(i); - final commitDiff = diffTrees(parent.tree, commit.tree); - final commitPaths = commitDiff.deltas.expand( - (delta) => [delta.oldFile.path, delta.newFile.path], - ); - final relativePath = p.relative(package.path, from: rootDir.path); - final changedPath = commitPaths.firstWhereOrNull( - (path) => path.contains('$relativePath/'), + await for (final (sha, commit) in git.revList(baseRef, headRef)) { + final parent = await git.commitFromRevision(commit.parents.first); + final commitPaths = await git.diffTrees( + parent.treeSha, + commit.treeSha, + ); + final relativePath = p.relative(package.path, from: rootDir.path); + final changedPath = commitPaths.firstWhereOrNull( + (path) => path.contains('$relativePath/'), + ); + if (changedPath != null) { + final commitMessage = CommitMessage.fromCommitRef((sha, commit)); + logger.verbose( + 'Package ${package.name} changed by $changedPath ' + '(${commitMessage.summary})', ); - if (changedPath != null) { - final commitMessage = CommitMessage.parse( - commit.oid.sha, - commit.summary, - body: commit.body, - commitTimeSecs: commit.time, - ); - logger.verbose( - 'Package ${package.name} changed by $changedPath ' - '(${commitMessage.summary})', - ); - commitsByPackage.add(package, commitMessage); - packagesByCommit.add(commitMessage, package); - } + commitsByPackage.add(package, commitMessage); + packagesByCommit.add(commitMessage, package); } } } @@ -231,11 +210,11 @@ class Repo { final Map changelogUpdates = {}; /// Bumps the version for all packages in the repo. - void bumpAllVersions( + Future bumpAllVersions( Map packages, { - required GitChanges Function(PackageInfo) changesForPackage, + required FutureOr Function(PackageInfo) changesForPackage, VersionBumpType? forcedBumpType, - }) { + }) async { final sortedPackages = List.of(publishablePackages(packages)); sortPackagesTopologically( sortedPackages, @@ -243,7 +222,7 @@ class Repo { ); bool canBump(PackageInfo package) => packages.containsKey(package.name); for (final package in sortedPackages) { - final changes = changesForPackage(package); + final changes = await changesForPackage(package); final commits = (changes.commitsByPackage[package]?.toList() ?? const []) ..sort((a, b) => a.dateTime.compareTo(b.dateTime)); for (final commit in commits) { @@ -467,15 +446,7 @@ class GitChanges { final BuiltSetMultimap packagesByCommit; } -class _DiffMarker with AWSEquatable<_DiffMarker> { - const _DiffMarker(this.baseTree, this.headTree); - - final Tree baseTree; - final Tree headTree; - - @override - List get props => [baseTree, headTree]; -} +typedef _DiffMarker = (String baseTree, String headTree); class VersionChanges { VersionChanges(this._repo); diff --git a/packages/aft/pubspec.yaml b/packages/aft/pubspec.yaml index 758c839b55..d8c7033762 100644 --- a/packages/aft/pubspec.yaml +++ b/packages/aft/pubspec.yaml @@ -17,12 +17,13 @@ dependencies: code_builder: 4.5.0 collection: ^1.16.0 file: ">=6.0.0 <8.0.0" - git: ^2.0.0 + git: + git: + url: https://github.com/dnys1/git + ref: feat/existing-worktree glob: ^2.1.0 graphs: ^2.1.0 json_annotation: ">=4.8.1 <4.9.0" - libgit2dart: - path: external/libgit2dart markdown: ^5.0.0 mason: ^0.1.0-dev.40 mason_logger: ^0.2.5 diff --git a/packages/aft/test/e2e_test.dart b/packages/aft/test/e2e_test.dart index bb9eed4ee1..6a0e689d5c 100644 --- a/packages/aft/test/e2e_test.dart +++ b/packages/aft/test/e2e_test.dart @@ -166,7 +166,7 @@ Initial version. amplifyCore, awsCommon, ]; - repo = Repo( + repo = await Repo.open( AftConfig( rootDirectory: repoDir.uri, workingDirectory: Directory.current.uri, @@ -255,7 +255,7 @@ Initial version. packageBumps['amplify_auth_cognito_ios'] = flutterBump; }); - GitChanges changesForPackage( + Future changesForPackage( String package, { required String baseRef, }) { @@ -272,14 +272,15 @@ Initial version. 'amplify_auth_cognito_ios': 3, }; for (final entry in packages.entries) { - test(entry.key, () { + test(entry.key, () async { final numCommits = entry.value; final package = repo.allPackages[entry.key]!; + final changes = await changesForPackage( + package.name, + baseRef: baseRef, + ); expect( - changesForPackage( - package.name, - baseRef: baseRef, - ).commitsByPackage[package], + changes.commitsByPackage[package], hasLength(numCommits), ); }); @@ -295,17 +296,18 @@ Initial version. 'amplify_auth_cognito_ios': 0, }; for (final entry in packages.entries) { - test(entry.key, () { + test(entry.key, () async { final package = repo.allPackages[entry.key]!; - final lastBump = repo.latestBumpRef(package); + final lastBump = await repo.latestBumpRef(package); expect(lastBump, packageBumps[package.name]); final numCommits = entry.value; + final changes = await changesForPackage( + package.name, + baseRef: lastBump ?? baseRef, + ); expect( - changesForPackage( - package.name, - baseRef: lastBump ?? baseRef, - ).commitsByPackage[package], + changes.commitsByPackage[package], hasLength(numCommits), ); }); @@ -358,9 +360,12 @@ Initial version. for (final check in numCommits.entries) { final packageName = check.key; - test(packageName, () { + test(packageName, () async { final package = repo.allPackages[packageName]!; - final changes = changesForPackage(package.name, baseRef: baseRef); + final changes = await changesForPackage( + package.name, + baseRef: baseRef, + ); final commits = changes.commitsByPackage[package]!; expect(commits, hasLength(check.value)); @@ -470,7 +475,7 @@ environment: }; setUp(() async { - repo.bumpAllVersions( + await repo.bumpAllVersions( repo.allPackages, changesForPackage: (pkg) => changesForPackage( pkg.name, diff --git a/packages/aft/workflow.yaml b/packages/aft/workflow.yaml index 8db1cdf5d3..f265ba0dff 100644 --- a/packages/aft/workflow.yaml +++ b/packages/aft/workflow.yaml @@ -40,12 +40,7 @@ jobs: - name: Get Packages working-directory: packages/aft - run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd external/libgit2dart; git apply ../libgit2dart.patch ) - dart pub upgrade - mkdir linux - cp external/libgit2dart/linux/*.so linux + run: dart pub upgrade - name: Save Repo State working-directory: packages/aft diff --git a/packages/aws_sdk/smoke_test/workflow.yaml b/packages/aws_sdk/smoke_test/workflow.yaml index cd1e5b0c06..f28c72d758 100644 --- a/packages/aws_sdk/smoke_test/workflow.yaml +++ b/packages/aws_sdk/smoke_test/workflow.yaml @@ -39,8 +39,6 @@ jobs: - name: Link Packages run: | - # Patch libgit2dart (see https://github.com/dart-lang/pub/issues/3563) - ( cd packages/aft/external/libgit2dart; git apply ../libgit2dart.patch ) dart pub global activate -spath packages/aft aft link diff --git a/pubspec.yaml b/pubspec.yaml index 4e96ac40ab..599ff6b9a2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,7 +59,6 @@ aft: # Packages to ignore in all repo operations. ignore: - synthetic_package - - libgit2dart # Strongly connected components which should have version bumps happen # in unison, i.e. a version bump to one package cascades to all.