From 34439bf0a3364bfb986f4d03db20a2b3993ac448 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 13 Aug 2020 23:33:04 +1000 Subject: [PATCH 1/7] Added the required status code StatusCodes.CREATED for the createRelease to work. --- lib/src/common/repos_service.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 1a2a2a7e..b8931624 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -986,10 +986,10 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(createRelease); final release = await github.postJSON, Release>( - '/repos/${slug.fullName}/releases', - convert: (i) => Release.fromJson(i), - body: GitHubJson.encode(createRelease.toJson()), - ); + '/repos/${slug.fullName}/releases', + convert: (i) => Release.fromJson(i), + body: GitHubJson.encode(createRelease.toJson()), + statusCode: StatusCodes.CREATED); if (release.hasErrors) { final alreadyExistsErrorCode = release.errors.firstWhere( (error) => error['code'] == 'already_exists', From 5d41ad092daa6fde3a7763d9c8a9f8ea068ec283 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 13 Aug 2020 23:40:39 +1000 Subject: [PATCH 2/7] null bool was returned when errors was null which was causing an assertion in createRelease. Now correctly returns false if no errors were returned. --- lib/src/common/model/repos_releases.dart | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index b29a67ae..c6d5500f 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -89,14 +89,13 @@ class Release { List errors; - factory Release.fromJson(Map input) => - _$ReleaseFromJson(input); + factory Release.fromJson(Map input) => _$ReleaseFromJson(input); Map toJson() => _$ReleaseToJson(this); String getUploadUrlFor(String name, [String label]) => "${uploadUrl.substring(0, uploadUrl.indexOf('{'))}?name=$name${label != null ? ",$label" : ""}"; - bool get hasErrors => errors?.isNotEmpty; + bool get hasErrors => errors == null ? false : errors.isNotEmpty; } /// Model class for a release asset. @@ -145,8 +144,7 @@ class ReleaseAsset { /// Time the asset was last updated DateTime updatedAt; - factory ReleaseAsset.fromJson(Map input) => - _$ReleaseAssetFromJson(input); + factory ReleaseAsset.fromJson(Map input) => _$ReleaseAssetFromJson(input); Map toJson() => _$ReleaseAssetToJson(this); } @@ -206,8 +204,7 @@ class CreateRelease { isDraft.hashCode ^ isPrerelease.hashCode; - factory CreateRelease.fromJson(Map input) => - _$CreateReleaseFromJson(input); + factory CreateRelease.fromJson(Map input) => _$CreateReleaseFromJson(input); Map toJson() => _$CreateReleaseToJson(this); } From 5700cda75e02952296103bca2134d9c58880586d Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 13 Aug 2020 23:41:42 +1000 Subject: [PATCH 3/7] fixed formatting. --- lib/src/common/model/repos_releases.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index c6d5500f..59085fe3 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -89,7 +89,8 @@ class Release { List errors; - factory Release.fromJson(Map input) => _$ReleaseFromJson(input); + factory Release.fromJson(Map input) => + _$ReleaseFromJson(input); Map toJson() => _$ReleaseToJson(this); String getUploadUrlFor(String name, [String label]) => @@ -144,7 +145,8 @@ class ReleaseAsset { /// Time the asset was last updated DateTime updatedAt; - factory ReleaseAsset.fromJson(Map input) => _$ReleaseAssetFromJson(input); + factory ReleaseAsset.fromJson(Map input) => + _$ReleaseAssetFromJson(input); Map toJson() => _$ReleaseAssetToJson(this); } @@ -204,7 +206,8 @@ class CreateRelease { isDraft.hashCode ^ isPrerelease.hashCode; - factory CreateRelease.fromJson(Map input) => _$CreateReleaseFromJson(input); + factory CreateRelease.fromJson(Map input) => + _$CreateReleaseFromJson(input); Map toJson() => _$CreateReleaseToJson(this); } From 7ba76293fee112ff14798d8d5a55b03492339e35 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 24 Aug 2020 11:04:36 +1000 Subject: [PATCH 4/7] Added log to handle a 404 which occurs if the tag doesn't exist. --- lib/src/common/repos_service.dart | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index b8931624..14abc8be 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -968,10 +968,31 @@ class RepositoriesService extends Service { /// Fetches a single release by the release tag name. /// + /// Returns null if the release doesn't exist. + /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name - Future getReleaseByTagName(RepositorySlug slug, String tagName) => - github.getJSON('/repos/${slug.fullName}/releases/tags/$tagName', - convert: (i) => Release.fromJson(i)); + Future getReleaseByTagName( + RepositorySlug slug, String tagName) async { + // github.getJSON('/repos/${slug.fullName}/releases/tags/$tagName', convert: (i) => Release.fromJson(i)); + + Release release; + try { + release = await github.getJSON( + '/repos/${slug.fullName}/releases/tags/$tagName', + convert: (i) => Release.fromJson(i), + statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == 404) { + // we just return null if the tag can't be found. + throw ReleaseNotFound.fromTagName(github, tagName); + } + }, + ); + } on ReleaseNotFound catch (e) { + release = null; + } + return release; + } /// Creates a Release based on the specified [createRelease]. /// From 16bfe55d96a8f9c6bcd1be72ad7db1f2184f74e8 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 24 Aug 2020 11:05:04 +1000 Subject: [PATCH 5/7] Added asserts to ensure that each argument to RepositorySlug is non-null --- lib/src/common/model/repos.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 04641e4f..dbf8ea7c 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -274,7 +274,10 @@ class RepositorySlug { /// Repository Name String name; - RepositorySlug(this.owner, this.name); + RepositorySlug(this.owner, this.name) { + ArgumentError.checkNotNull(owner, 'owner'); + ArgumentError.checkNotNull(name, 'name'); + } /// Creates a Repository Slug from a full name. factory RepositorySlug.full(String f) { From dfe06d7d0d9bc55e3b26ada0a4522f29594db2d4 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 24 Aug 2020 11:05:18 +1000 Subject: [PATCH 6/7] Added new Exception for ReleaseNotFound. --- lib/src/common/util/errors.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index 330f9534..a140f583 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -41,6 +41,12 @@ class RepositoryNotFound extends NotFound { : super(github, 'Repository Not Found: $repo'); } +/// Release not found +class ReleaseNotFound extends NotFound { + const ReleaseNotFound.fromTagName(GitHub github, String tagName) + : super(github, 'Release for tagName $tagName Not Found.'); +} + /// GitHub User was not found class UserNotFound extends NotFound { const UserNotFound(GitHub github, String user) From 6caf3ed0250d4e77f1f849feafe19aedc486451c Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Tue, 15 Sep 2020 17:53:18 +1000 Subject: [PATCH 7/7] Modified getReleaseByTagName to thrown an exception if the release can't be found. --- lib/src/common/repos_service.dart | 32 ++++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 14abc8be..ee2860b5 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -968,30 +968,22 @@ class RepositoriesService extends Service { /// Fetches a single release by the release tag name. /// - /// Returns null if the release doesn't exist. + /// Throws a [ReleaseNotFound] exception if the release + /// doesn't exist. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name Future getReleaseByTagName( RepositorySlug slug, String tagName) async { - // github.getJSON('/repos/${slug.fullName}/releases/tags/$tagName', convert: (i) => Release.fromJson(i)); - - Release release; - try { - release = await github.getJSON( - '/repos/${slug.fullName}/releases/tags/$tagName', - convert: (i) => Release.fromJson(i), - statusCode: StatusCodes.OK, - fail: (http.Response response) { - if (response.statusCode == 404) { - // we just return null if the tag can't be found. - throw ReleaseNotFound.fromTagName(github, tagName); - } - }, - ); - } on ReleaseNotFound catch (e) { - release = null; - } - return release; + return github.getJSON( + '/repos/${slug.fullName}/releases/tags/$tagName', + convert: (i) => Release.fromJson(i), + statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == 404) { + throw ReleaseNotFound.fromTagName(github, tagName); + } + }, + ); } /// Creates a Release based on the specified [createRelease].