diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 119546e2..bb1838d7 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -6,7 +6,7 @@ jobs: build: runs-on: ubuntu-latest container: - image: dart:2.17 + image: dart steps: - uses: actions/checkout@v1 - name: Install dependencies diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 33f242d2..25a2bb12 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -7,7 +7,7 @@ jobs: build-and-deploy: runs-on: ubuntu-latest container: - image: google/dart:latest + image: dart steps: - name: Checkout 🛎️ uses: actions/checkout@v2.3.1 diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index ca9789ba..0287d22a 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -8,7 +8,8 @@ jobs: publish: runs-on: ubuntu-latest - + container: + image: dart steps: - name: Checkout uses: actions/checkout@v1 diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml index a087b032..9b33737d 100644 --- a/.github/workflows/release_unreleased_prs.yml +++ b/.github/workflows/release_unreleased_prs.yml @@ -12,7 +12,7 @@ jobs: release: if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest - container: dart:2.17.7 + container: dart permissions: contents: write diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6e1cb6e5..225f514f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - sdk: [2.14.4, 2.17.7, stable] # Test with at least the declared minimum Dart version + sdk: [2.17.7, stable] # Test with at least the declared minimum Dart version steps: - uses: actions/checkout@v2 - uses: dart-lang/setup-dart@v1.3 diff --git a/CHANGELOG.md b/CHANGELOG.md index fcbf764c..1e7a870d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,15 @@ +## 9.6.0 + +* Update to allow different merge methods in pulls_service by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/333 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.5.1...9.6.0 + ## 9.5.1 +* Require Dart 2.17 * Fix up unit tests & run them in CI by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/336 - **Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.5.0...9.5.1 ## 9.5.0 diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 9c611cf9..f0ec3dcc 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -121,16 +121,27 @@ class PullRequestsService extends Service { RepositorySlug slug, int number, { String? message, + MergeMethod mergeMethod = MergeMethod.merge, + String? requestSha, }) { final json = {}; if (message != null) { json['commit_message'] = message; } + if (requestSha != null) { + json['sha'] = requestSha; + } + + json['merge_method'] = mergeMethod.name; + + // Recommended Accept header when making a merge request. + Map? headers = {}; + headers['Accept'] = 'application/vnd.github+json'; return github .request('PUT', '/repos/${slug.fullName}/pulls/$number/merge', - body: GitHubJson.encode(json)) + headers: headers, body: GitHubJson.encode(json)) .then((response) { return PullRequestMerge.fromJson( jsonDecode(response.body) as Map); @@ -184,3 +195,9 @@ class PullRequestsService extends Service { ); } } + +enum MergeMethod { + merge, + squash, + rebase, +} diff --git a/pubspec.yaml b/pubspec.yaml index d7d20f57..76b54847 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,10 +1,10 @@ name: github -version: 9.5.1 +version: 9.6.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.14.0 <3.0.0' + sdk: '>=2.17.0 <3.0.0' dependencies: http: ^0.13.0 diff --git a/test/assets/responses/nocked_responses.dart b/test/assets/responses/nocked_responses.dart index 6feb9465..3a1b9b5b 100644 --- a/test/assets/responses/nocked_responses.dart +++ b/test/assets/responses/nocked_responses.dart @@ -1472,3 +1472,9 @@ var searchResults = '''{ } ] }'''; + +var mergedPR1 = '''{ + "sha": "someSHA", + "merged": true, + "message": "Pull Request successfully merged" +}'''; diff --git a/test/git_test.dart b/test/git_test.dart index 2eaff028..f769571b 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -188,4 +188,77 @@ void main() { expect(results.totalCount, 17); expect(results.items?.length, 17); }); + + group('Merge', () { + test('Merge() normal', () async { + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', '{"merge_method":"merge"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests.merge(repo, 1); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with squash', () async { + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', '{"merge_method":"squash"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests + .merge(repo, 1, mergeMethod: MergeMethod.squash); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with rebase', () async { + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', '{"merge_method":"rebase"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests + .merge(repo, 1, mergeMethod: MergeMethod.rebase); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage', () async { + const commitMessage = 'Some message'; + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', + '{"commit_message":"$commitMessage","merge_method":"squash"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests.merge(repo, 1, + message: commitMessage, mergeMethod: MergeMethod.squash); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage, with sha', () async { + const commitMessage = 'Some message'; + const commitSha = 'commitSha'; + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', + '{"commit_message":"$commitMessage","sha":"$commitSha","merge_method":"squash"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests.merge(repo, 1, + message: commitMessage, + mergeMethod: MergeMethod.squash, + requestSha: commitSha); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + }); }