From 14423fe8760175c5a3a1295bc048527ef89daa6a Mon Sep 17 00:00:00 2001 From: reimai Date: Tue, 29 Dec 2020 14:14:16 +0300 Subject: [PATCH 1/8] add update-branch call --- github4s/src/main/scala/github4s/Encoders.scala | 2 ++ .../scala/github4s/algebras/PullRequests.scala | 8 ++++++++ .../main/scala/github4s/domain/PullRequest.scala | 2 ++ .../main/scala/github4s/http/RequestBuilder.scala | 4 ++++ .../interpreters/PullRequestsInterpreter.scala | 14 ++++++++++++++ 5 files changed, 30 insertions(+) diff --git a/github4s/src/main/scala/github4s/Encoders.scala b/github4s/src/main/scala/github4s/Encoders.scala index cf3d808e7..d756b2a30 100644 --- a/github4s/src/main/scala/github4s/Encoders.scala +++ b/github4s/src/main/scala/github4s/Encoders.scala @@ -76,4 +76,6 @@ object Encoders { deriveEncoder[CreatePRReviewRequest] implicit val encodeRequiestedReviewers: Encoder[ReviewersRequest] = deriveEncoder[ReviewersRequest] + implicit val encodeBranchUpdateRequest: Encoder[BranchUpdateRequest] = + deriveEncoder[BranchUpdateRequest] } diff --git a/github4s/src/main/scala/github4s/algebras/PullRequests.scala b/github4s/src/main/scala/github4s/algebras/PullRequests.scala index 55bf67e76..947f0bad8 100644 --- a/github4s/src/main/scala/github4s/algebras/PullRequests.scala +++ b/github4s/src/main/scala/github4s/algebras/PullRequests.scala @@ -179,4 +179,12 @@ trait PullRequests[F[_]] { reviewers: ReviewersRequest, headers: Map[String, String] = Map() ): F[GHResponse[PullRequest]] + + def updateBranch( + owner: String, + repo: String, + pullRequest: Int, + expectedHeadSha: String, + headers: Map[String, String] = Map() + ): F[GHResponse[Unit]] } diff --git a/github4s/src/main/scala/github4s/domain/PullRequest.scala b/github4s/src/main/scala/github4s/domain/PullRequest.scala index abbd4ed3f..39a9903b4 100644 --- a/github4s/src/main/scala/github4s/domain/PullRequest.scala +++ b/github4s/src/main/scala/github4s/domain/PullRequest.scala @@ -151,3 +151,5 @@ final case class ReviewersResponse( users: List[User], teams: List[Team] ) + +final case class BranchUpdateRequest(expected_head_sha: String) diff --git a/github4s/src/main/scala/github4s/http/RequestBuilder.scala b/github4s/src/main/scala/github4s/http/RequestBuilder.scala index 0897617b7..5956f93c2 100644 --- a/github4s/src/main/scala/github4s/http/RequestBuilder.scala +++ b/github4s/src/main/scala/github4s/http/RequestBuilder.scala @@ -47,3 +47,7 @@ case class RequestBuilder[Res]( case _ => Map.empty[String, String] }) } + +object RequestBuilder { + val acceptPreviewHeader = Map("Accept" -> "application/vnd.github.lydian-preview+json") +} diff --git a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala index 7b66ef40b..5497e3969 100644 --- a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala +++ b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala @@ -22,6 +22,7 @@ import github4s.GHResponse import github4s.algebras.PullRequests import github4s.domain._ import github4s.http.HttpClient +import github4s.http.RequestBuilder.acceptPreviewHeader class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends PullRequests[F] { @@ -160,4 +161,17 @@ class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends Pull headers, reviewers ) + + override def updateBranch( + owner: String, + repo: String, + pullRequest: Int, + expectedHeadSha: String, + headers: Map[String, String] = Map() + ): F[GHResponse[Unit]] = + client.put[BranchUpdateRequest, Unit]( + s"repos/$owner/$repo/pulls/$pullRequest/update-branch", + headers ++ acceptPreviewHeader, + BranchUpdateRequest(expectedHeadSha) + ) } From 98eb5069e5afe69f0744ec75a16cf2871d61cc9e Mon Sep 17 00:00:00 2001 From: reimai Date: Mon, 16 Aug 2021 17:07:48 +0300 Subject: [PATCH 2/8] compare branches --- github4s/src/main/scala/github4s/Decoders.scala | 8 +++++++- .../scala/github4s/algebras/PullRequests.scala | 12 ++++++++++-- .../main/scala/github4s/domain/PullRequest.scala | 5 ++++- .../interpreters/PullRequestsInterpreter.scala | 14 +++++++++++++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/github4s/src/main/scala/github4s/Decoders.scala b/github4s/src/main/scala/github4s/Decoders.scala index 8a0209e22..d95f713f8 100644 --- a/github4s/src/main/scala/github4s/Decoders.scala +++ b/github4s/src/main/scala/github4s/Decoders.scala @@ -25,7 +25,7 @@ import github4s.domain._ import io.circe.Decoder.Result import io.circe._ import io.circe.generic.auto._ -import io.circe.generic.semiauto.deriveDecoder +import io.circe.generic.semiauto.{deriveDecoder, deriveEncoder} /** * Implicit circe decoders of domains objects @@ -297,4 +297,10 @@ object Decoders { implicit val decodeReviewers: Decoder[ReviewersResponse] = deriveDecoder[ReviewersResponse] + + implicit val decodeBranchUpdateResponse: Decoder[BranchUpdateResponse] = + deriveDecoder[BranchUpdateResponse] + + implicit val decodeCommitComparisonResponse: Decoder[CommitComparisonResponse] = + deriveDecoder[CommitComparisonResponse] } diff --git a/github4s/src/main/scala/github4s/algebras/PullRequests.scala b/github4s/src/main/scala/github4s/algebras/PullRequests.scala index 947f0bad8..ce890fa56 100644 --- a/github4s/src/main/scala/github4s/algebras/PullRequests.scala +++ b/github4s/src/main/scala/github4s/algebras/PullRequests.scala @@ -184,7 +184,15 @@ trait PullRequests[F[_]] { owner: String, repo: String, pullRequest: Int, - expectedHeadSha: String, + expectedHeadSha: Option[String] = None, headers: Map[String, String] = Map() - ): F[GHResponse[Unit]] + ): F[GHResponse[BranchUpdateResponse]] + + def compare( + owner: String, + repo: String, + commitSha: String, + baseSha: String, + headers: Map[String, String] = Map() + ): F[GHResponse[CommitComparisonResponse]] } diff --git a/github4s/src/main/scala/github4s/domain/PullRequest.scala b/github4s/src/main/scala/github4s/domain/PullRequest.scala index 39a9903b4..fb03c70c4 100644 --- a/github4s/src/main/scala/github4s/domain/PullRequest.scala +++ b/github4s/src/main/scala/github4s/domain/PullRequest.scala @@ -152,4 +152,7 @@ final case class ReviewersResponse( teams: List[Team] ) -final case class BranchUpdateRequest(expected_head_sha: String) +final case class BranchUpdateRequest(expected_head_sha: Option[String]) +final case class BranchUpdateResponse(message: String, url: String) +final case class CommitComparisonResponse(status: String, ahead_by: Int, behind_by: Int, total_commits: Int) + diff --git a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala index 5497e3969..8968f5c3c 100644 --- a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala +++ b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala @@ -166,7 +166,7 @@ class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends Pull owner: String, repo: String, pullRequest: Int, - expectedHeadSha: String, + expectedHeadSha: Option[String] = None, headers: Map[String, String] = Map() ): F[GHResponse[Unit]] = client.put[BranchUpdateRequest, Unit]( @@ -174,4 +174,16 @@ class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends Pull headers ++ acceptPreviewHeader, BranchUpdateRequest(expectedHeadSha) ) + + override def compare( + owner: String, + repo: String, + commitSha: String, + baseSha: String, + headers: Map[String, String] = Map() + ): F[GHResponse[CommitComparisonResponse]] = + client.get[CommitComparisonResponse]( + s"repos/$owner/$repo/compare/$baseSha...$commitSha", + headers + ) } From 43f7664188211337bf0a5a3bbfb82d1e7cd5b05e Mon Sep 17 00:00:00 2001 From: reimai Date: Mon, 16 Aug 2021 17:30:14 +0300 Subject: [PATCH 3/8] fix override --- .../scala/github4s/interpreters/PullRequestsInterpreter.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala index 252491475..65fc2bc92 100644 --- a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala +++ b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala @@ -168,8 +168,8 @@ class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends Pull pullRequest: Int, expectedHeadSha: Option[String] = None, headers: Map[String, String] = Map() - ): F[GHResponse[Unit]] = - client.put[BranchUpdateRequest, Unit]( + ): F[GHResponse[BranchUpdateResponse]] = + client.put[BranchUpdateRequest, BranchUpdateResponse]( s"repos/$owner/$repo/pulls/$pullRequest/update-branch", headers ++ acceptPreviewHeader, BranchUpdateRequest(expectedHeadSha) From cf64ebae59e07b583dd0f5a26bf9c3f365c4d82a Mon Sep 17 00:00:00 2001 From: reimai Date: Fri, 20 Aug 2021 14:10:03 +0300 Subject: [PATCH 4/8] refactor, add tests and docs --- .../src/main/scala/github4s/Decoders.scala | 4 +++ .../src/main/scala/github4s/Encoders.scala | 9 ++++-- .../github4s/algebras/PullRequests.scala | 13 ++++----- .../github4s/algebras/Repositories.scala | 17 +++++++++++ .../scala/github4s/domain/PullRequest.scala | 2 -- .../scala/github4s/domain/Repository.scala | 29 +++++++++++++++++++ .../scala/github4s/http/RequestBuilder.scala | 4 --- .../PullRequestsInterpreter.scala | 17 ++--------- .../RepositoriesInterpreter.scala | 16 ++++++++-- .../github4s/unit/EncoderDecoderSpec.scala | 4 +++ .../github4s/integration/ReposSpec.scala | 19 ++++++++++++ .../github4s/unit/PullRequestsSpec.scala | 22 ++++++++++++++ .../test/scala/github4s/unit/ReposSpec.scala | 23 +++++++++++++++ .../test/scala/github4s/utils/TestData.scala | 10 ++++++- microsite/docs/pull_request.md | 29 +++++++++++++++++++ microsite/docs/repository.md | 29 +++++++++++++++++++ 16 files changed, 214 insertions(+), 33 deletions(-) diff --git a/github4s/src/main/scala/github4s/Decoders.scala b/github4s/src/main/scala/github4s/Decoders.scala index 2814c1903..b1c8aa3d8 100644 --- a/github4s/src/main/scala/github4s/Decoders.scala +++ b/github4s/src/main/scala/github4s/Decoders.scala @@ -18,6 +18,7 @@ package github4s import cats.data.NonEmptyList import cats.syntax.all._ +import github4s.domain.RepoUrlKeys.{CommitComparisonResponse, FileComparison} import github4s.domain._ import io.circe.Decoder.Result import io.circe._ @@ -241,6 +242,8 @@ object Decoders { ) ) + implicit val decoderFileComparison: Decoder[FileComparison] = deriveDecoder[FileComparison] + implicit val decoderCreatePullRequestData: Decoder[CreatePullRequestData] = deriveDecoder[CreatePullRequestData] implicit val decoderCreatePullRequestIssue: Decoder[CreatePullRequestIssue] = @@ -265,6 +268,7 @@ object Decoders { implicit val decoderNewTagRequest: Decoder[NewTagRequest] = deriveDecoder[NewTagRequest] implicit val decoderNewTreeRequest: Decoder[NewTreeRequest] = deriveDecoder[NewTreeRequest] implicit val decoderNewCommitRequest: Decoder[NewCommitRequest] = deriveDecoder[NewCommitRequest] + implicit val decoderBranchUpdateRequest: Decoder[BranchUpdateRequest] = deriveDecoder[BranchUpdateRequest] implicit def decodeNonEmptyList[T](implicit D: Decoder[T]): Decoder[NonEmptyList[T]] = { diff --git a/github4s/src/main/scala/github4s/Encoders.scala b/github4s/src/main/scala/github4s/Encoders.scala index 00843fa14..5ef8663bb 100644 --- a/github4s/src/main/scala/github4s/Encoders.scala +++ b/github4s/src/main/scala/github4s/Encoders.scala @@ -16,6 +16,7 @@ package github4s +import github4s.domain.RepoUrlKeys.{CommitComparisonResponse, FileComparison} import github4s.domain._ import io.circe._ import io.circe.generic.semiauto.deriveEncoder @@ -182,6 +183,8 @@ object Encoders { deriveEncoder[NewReleaseRequest] implicit val encoderNewStatusRequest: Encoder[NewStatusRequest] = deriveEncoder[NewStatusRequest] implicit val encoderMilestoneData: Encoder[MilestoneData] = deriveEncoder[MilestoneData] + implicit val encodeBranchUpdateRequest: Encoder[BranchUpdateRequest] = deriveEncoder[BranchUpdateRequest] + implicit val encoderCreateReviewComment: Encoder[CreateReviewComment] = deriveEncoder[CreateReviewComment] implicit val encodeNewPullRequestReview: Encoder[CreatePRReviewRequest] = @@ -237,6 +240,8 @@ object Encoders { implicit val encoderUser: Encoder[User] = deriveEncoder[User] implicit val encoderComment: Encoder[Comment] = deriveEncoder[Comment] implicit val encoderMilestone: Encoder[Milestone] = deriveEncoder[Milestone] - implicit val encodeBranchUpdateRequest: Encoder[BranchUpdateRequest] = - deriveEncoder[BranchUpdateRequest] + implicit val encodeBranchUpdateResponse: Encoder[BranchUpdateResponse] = deriveEncoder[BranchUpdateResponse] + implicit val encodeFileComparison: Encoder[FileComparison] = deriveEncoder[FileComparison] + implicit val encodeCommitComparisonResponse: Encoder[CommitComparisonResponse] = + deriveEncoder[CommitComparisonResponse] } diff --git a/github4s/src/main/scala/github4s/algebras/PullRequests.scala b/github4s/src/main/scala/github4s/algebras/PullRequests.scala index cde0482b5..3e1a0645b 100644 --- a/github4s/src/main/scala/github4s/algebras/PullRequests.scala +++ b/github4s/src/main/scala/github4s/algebras/PullRequests.scala @@ -180,19 +180,16 @@ trait PullRequests[F[_]] { headers: Map[String, String] = Map() ): F[GHResponse[PullRequest]] + /** + * @param iAgreeToUseExperimentalApi This call is an experimental API and could be subject to change, + * use 'true' to use it + */ def updateBranch( owner: String, repo: String, pullRequest: Int, + iAgreeToUseExperimentalApi: Boolean, expectedHeadSha: Option[String] = None, headers: Map[String, String] = Map() ): F[GHResponse[BranchUpdateResponse]] - - def compare( - owner: String, - repo: String, - commitSha: String, - baseSha: String, - headers: Map[String, String] = Map() - ): F[GHResponse[CommitComparisonResponse]] } diff --git a/github4s/src/main/scala/github4s/algebras/Repositories.scala b/github4s/src/main/scala/github4s/algebras/Repositories.scala index aa6e3c6fa..0f7b599fa 100644 --- a/github4s/src/main/scala/github4s/algebras/Repositories.scala +++ b/github4s/src/main/scala/github4s/algebras/Repositories.scala @@ -18,6 +18,7 @@ package github4s.algebras import cats.data.NonEmptyList import github4s.GHResponse +import github4s.domain.RepoUrlKeys.CommitComparisonResponse import github4s.domain._ trait Repositories[F[_]] { @@ -228,6 +229,22 @@ trait Repositories[F[_]] { headers: Map[String, String] = Map() ): F[GHResponse[List[Commit]]] + /** + * @param owner of the repo + * @param repo name of the repo + * @param commitSha commit to compare against base + * @param baseSha the base to compare against + * @param headers optional user headers to include in the request + * @return GhResponse[CommitComparisonResponse] comparison result + */ + def compareCommits( + owner: String, + repo: String, + commitSha: String, + baseSha: String, + headers: Map[String, String] = Map() + ): F[GHResponse[CommitComparisonResponse]] + /** * Retrieve list of branches for a repo * diff --git a/github4s/src/main/scala/github4s/domain/PullRequest.scala b/github4s/src/main/scala/github4s/domain/PullRequest.scala index d3fb6f7ae..aa87d49cf 100644 --- a/github4s/src/main/scala/github4s/domain/PullRequest.scala +++ b/github4s/src/main/scala/github4s/domain/PullRequest.scala @@ -154,5 +154,3 @@ final case class ReviewersResponse( final case class BranchUpdateRequest(expected_head_sha: Option[String]) final case class BranchUpdateResponse(message: String, url: String) -final case class CommitComparisonResponse(status: String, ahead_by: Int, behind_by: Int, total_commits: Int) - diff --git a/github4s/src/main/scala/github4s/domain/Repository.scala b/github4s/src/main/scala/github4s/domain/Repository.scala index 8d1dbe37a..114f39361 100644 --- a/github4s/src/main/scala/github4s/domain/Repository.scala +++ b/github4s/src/main/scala/github4s/domain/Repository.scala @@ -349,4 +349,33 @@ object RepoUrlKeys { deployments_url ) + final case class CommitComparisonResponse( + status: String, + ahead_by: Int, + behind_by: Int, + total_commits: Int, + url: Option[String] = None, + html_url: Option[String] = None, + permalink_url: Option[String] = None, + diff_url: Option[String] = None, + patch_url: Option[String] = None, + base_commit: Option[Commit] = None, + merge_base_commit: Option[Commit] = None, + commits: Seq[Commit] = Seq.empty, + files: Seq[FileComparison] = Seq.empty + ) + + final case class FileComparison( + sha: String, + filename: String, + status: String, + additions: Int, + deletions: Int, + changes: Int, + blob_url: String, + raw_url: String, + contents_url: String, + patch: String + ) + } diff --git a/github4s/src/main/scala/github4s/http/RequestBuilder.scala b/github4s/src/main/scala/github4s/http/RequestBuilder.scala index 954c78b62..bd833997a 100644 --- a/github4s/src/main/scala/github4s/http/RequestBuilder.scala +++ b/github4s/src/main/scala/github4s/http/RequestBuilder.scala @@ -47,7 +47,3 @@ case class RequestBuilder[Res]( case _ => Map.empty[String, String] }) } - -object RequestBuilder { - val acceptPreviewHeader = Map("Accept" -> "application/vnd.github.lydian-preview+json") -} diff --git a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala index 65fc2bc92..0b99f9e9f 100644 --- a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala +++ b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala @@ -22,7 +22,6 @@ import github4s.GHResponse import github4s.algebras.PullRequests import github4s.domain._ import github4s.http.HttpClient -import github4s.http.RequestBuilder.acceptPreviewHeader class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends PullRequests[F] { @@ -166,24 +165,14 @@ class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends Pull owner: String, repo: String, pullRequest: Int, + iAgreeToUseExperimentalApi: Boolean, expectedHeadSha: Option[String] = None, headers: Map[String, String] = Map() ): F[GHResponse[BranchUpdateResponse]] = client.put[BranchUpdateRequest, BranchUpdateResponse]( s"repos/$owner/$repo/pulls/$pullRequest/update-branch", - headers ++ acceptPreviewHeader, + headers ++ + Option("Accept" -> "application/vnd.github.lydian-preview+json").filter(_ => iAgreeToUseExperimentalApi), BranchUpdateRequest(expectedHeadSha) ) - - override def compare( - owner: String, - repo: String, - commitSha: String, - baseSha: String, - headers: Map[String, String] = Map() - ): F[GHResponse[CommitComparisonResponse]] = - client.get[CommitComparisonResponse]( - s"repos/$owner/$repo/compare/$baseSha...$commitSha", - headers - ) } diff --git a/github4s/src/main/scala/github4s/interpreters/RepositoriesInterpreter.scala b/github4s/src/main/scala/github4s/interpreters/RepositoriesInterpreter.scala index 39cd21fa6..3afd7b308 100644 --- a/github4s/src/main/scala/github4s/interpreters/RepositoriesInterpreter.scala +++ b/github4s/src/main/scala/github4s/interpreters/RepositoriesInterpreter.scala @@ -19,13 +19,14 @@ package github4s.interpreters import cats.Functor import cats.data.NonEmptyList import cats.syntax.functor._ -import github4s.internal.Base64._ import github4s.Decoders._ import github4s.Encoders._ import github4s.GHResponse import github4s.algebras.Repositories +import github4s.domain.RepoUrlKeys.CommitComparisonResponse import github4s.domain._ import github4s.http.HttpClient +import github4s.internal.Base64._ class RepositoriesInterpreter[F[_]: Functor](implicit client: HttpClient[F] @@ -169,6 +170,18 @@ class RepositoriesInterpreter[F[_]: Functor](implicit pagination ) + override def compareCommits( + owner: String, + repo: String, + commitSha: String, + baseSha: String, + headers: Map[String, String] = Map() + ): F[GHResponse[CommitComparisonResponse]] = + client.get[CommitComparisonResponse]( + s"repos/$owner/$repo/compare/$baseSha...$commitSha", + headers + ) + override def listBranches( owner: String, repo: String, @@ -344,5 +357,4 @@ class RepositoriesInterpreter[F[_]: Functor](implicit response.copy(result = Right(false)) case Left(error) => GHResponse(Left(error), response.statusCode, response.headers) } - } diff --git a/github4s/src/test/scala-2/github4s/unit/EncoderDecoderSpec.scala b/github4s/src/test/scala-2/github4s/unit/EncoderDecoderSpec.scala index e3cf63796..451576069 100644 --- a/github4s/src/test/scala-2/github4s/unit/EncoderDecoderSpec.scala +++ b/github4s/src/test/scala-2/github4s/unit/EncoderDecoderSpec.scala @@ -5,6 +5,7 @@ import com.eed3si9n.expecty.Expecty import github4s.ArbitraryDerivation import github4s.Decoders._ import github4s.Encoders._ +import github4s.domain.RepoUrlKeys.CommitComparisonResponse import github4s.domain._ import io.circe.{Decoder, Encoder, Printer} import org.scalacheck.fortyseven.GenInstances._ @@ -133,6 +134,9 @@ class EncoderDecoderSpec extends AnyFlatSpec with ScalaCheckPropertyChecks { test[Repository] test[ReviewersRequest] test[ReviewersResponse] + test[BranchUpdateRequest] + test[BranchUpdateResponse] + test[CommitComparisonResponse] test[SearchIssuesResult] test[SearchReposResult] test[Stargazer] diff --git a/github4s/src/test/scala/github4s/integration/ReposSpec.scala b/github4s/src/test/scala/github4s/integration/ReposSpec.scala index 9c5af34b5..0abe9cdb5 100644 --- a/github4s/src/test/scala/github4s/integration/ReposSpec.scala +++ b/github4s/src/test/scala/github4s/integration/ReposSpec.scala @@ -20,6 +20,7 @@ import cats.data.NonEmptyList import cats.effect.{IO, Resource} import cats.implicits._ import github4s.GHError.{NotFoundError, UnauthorizedError} +import github4s.domain.RepoUrlKeys.CommitComparisonResponse import github4s.domain._ import github4s.utils.{BaseIntegrationSpec, Integration} import github4s.{GHResponse, Github} @@ -471,6 +472,24 @@ trait ReposSpec extends BaseIntegrationSpec { response.statusCode shouldBe okStatusCode } + "Repos >> Compare" should "compare against the base" taggedAs Integration in { + val response = clientResource + .use { client => + Github[IO](client, accessToken).repos + .compareCommits(validRepoOwner, validRepoName, validCommitSha, validBase) + } + .unsafeRunSync() + + testIsRight[CommitComparisonResponse]( + response, + { r => + r.status shouldBe "behind" + r.behind_by should be > 0 + } + ) + response.statusCode shouldBe okStatusCode + } + it should "successfully return results when a valid repo is provided using / syntax" taggedAs Integration in { val response = clientResource .use { client => diff --git a/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala b/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala index af95dd2cb..9b41e6177 100644 --- a/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala +++ b/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala @@ -261,4 +261,26 @@ class PullRequestsSpec extends BaseSpec { .shouldNotFail } + "PullRequests.updateBranch" should "call to httpClient.put with the right parameters" in { + + implicit val httpClientMock: HttpClient[IO] = httpClientMockPut[BranchUpdateRequest, BranchUpdateResponse]( + url = + s"repos/$validRepoOwner/$validRepoName/pulls/$validPullRequestNumber/update-branch", + req = BranchUpdateRequest(None), + response = IO.pure(validBranchUpdateResponse) + ) + + val pullRequests = new PullRequestsInterpreter[IO] + + pullRequests + .updateBranch( + validRepoOwner, + validRepoName, + validPullRequestNumber, + iAgreeToUseExperimentalApi = true, + None, + headerUserAgent + ) + .shouldNotFail + } } diff --git a/github4s/src/test/scala/github4s/unit/ReposSpec.scala b/github4s/src/test/scala/github4s/unit/ReposSpec.scala index 1b7abdd51..90656bc6e 100644 --- a/github4s/src/test/scala/github4s/unit/ReposSpec.scala +++ b/github4s/src/test/scala/github4s/unit/ReposSpec.scala @@ -20,6 +20,7 @@ import cats.data.NonEmptyList import cats.effect.IO import github4s.Decoders._ import github4s.Encoders._ +import github4s.domain.RepoUrlKeys.CommitComparisonResponse import github4s.domain._ import github4s.http.HttpClient import github4s.internal.Base64._ @@ -434,4 +435,26 @@ class ReposSpec extends BaseSpec { repos.searchRepos("", validSearchParams, None, headerUserAgent).shouldNotFail } + + "Repos.compare" should "call to httpClient.get with the right parameters" in { + + implicit val httpClientMock: HttpClient[IO] = httpClientMockGet[CommitComparisonResponse]( + url = + s"repos/$validRepoOwner/$validRepoName/compare/$validCommitSha...$validMergeCommitSha", + response = IO.pure(validCommitComparisonResponse) + ) + + val repos = new RepositoriesInterpreter[IO] + + repos + .compareCommits( + validRepoOwner, + validRepoName, + validCommitSha, + validMergeCommitSha, + headerUserAgent + ) + .shouldNotFail + } + } diff --git a/github4s/src/test/scala/github4s/utils/TestData.scala b/github4s/src/test/scala/github4s/utils/TestData.scala index 8ea9a4a1f..c60895c36 100644 --- a/github4s/src/test/scala/github4s/utils/TestData.scala +++ b/github4s/src/test/scala/github4s/utils/TestData.scala @@ -16,8 +16,9 @@ package github4s.utils -import java.util.UUID +import github4s.domain.RepoUrlKeys.CommitComparisonResponse +import java.util.UUID import github4s.internal.Base64._ import github4s.domain._ @@ -489,6 +490,13 @@ trait TestData { val validRequestedReviewersResponse = ReviewersResponse(List(user), List(team)) + val validBranchUpdateResponse = + BranchUpdateResponse( + "Updating pull request branch.", + s"https://github.com/repos/$validRepoOwner/$validRepoName/pulls/$validPullRequestNumber") + + val validCommitComparisonResponse = CommitComparisonResponse("behind", 1, 2, 100) + val validProjectId = 4115271L val invalidProjectId = 11111L diff --git a/microsite/docs/pull_request.md b/microsite/docs/pull_request.md index 5229502d8..51e5d63a2 100644 --- a/microsite/docs/pull_request.md +++ b/microsite/docs/pull_request.md @@ -14,6 +14,7 @@ with Github4s, you can interact with: - [List pull requests](#list-pull-requests) - [List the files in a pull request](#list-the-files-in-a-pull-request) - [Create a pull request](#create-a-pull-request) + - [Update branch](#update-a-pull-request-branch) - [Reviews](#reviews) - [List reviews](#list-pull-request-reviews) - [Get a review](#get-an-individual-review) @@ -158,6 +159,34 @@ createPullRequestIssue.flatMap(_.result match { See [the API doc](https://developer.github.com/v3/pulls/#create-a-pull-request) for full reference. +### Update a pull request branch + +Merges the base HEAD into your pull request branch. +Note that this is an experimental API, meaning github could stop supporting it at any time. + +Accepts these parameters: + + - the repository coordinates (`owner` and `name` of the repository). + - `pullRequest`: integer id of you pr. + - `iAgreeToUseExperimentalApi`: your conscious agreement to use an experimental API. + - `expectedHeadSha`: The expected SHA of the pull request's HEAD ref for an optional check on github's side. + +```scala mdoc:compile-only +import github4s.domain.BranchUpdateResponse + +val updatePullRequestBranch = gh.pullRequests.updatebranch( + "47deg", + "github4s", + 567, + iAgreeToUseExperimentalApi = true) +updatePullRequestBranch.flatMap(_.result match { + case Left(e) => IO.println(s"Something went wrong: ${e.getMessage}") + case Right(r) => IO.println(r) +}) +``` + +See [the API doc](https://developer.github.com/v3/pulls/#update-a-pull-request-branch) for full reference. + ## Reviews ### List pull request reviews diff --git a/microsite/docs/repository.md b/microsite/docs/repository.md index 311bef2fc..3be972e50 100644 --- a/microsite/docs/repository.md +++ b/microsite/docs/repository.md @@ -20,6 +20,7 @@ with Github4s, you can interact with: - [Get repository permissions for a user](#get-repository-permissions-for-a-user) - [Commits](#commits) - [List commits on a repository](#list-commits-on-a-repository) + - [Compare commits on a repository](#compare-commits-on-a-repository) - [Contents](#contents) - [Get contents](#get-contents) - [Create a File](#create-a-file) @@ -263,6 +264,34 @@ The `result` on the right is the corresponding [List[Commit]][repository-scala]. See [the API doc](https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository) for full reference. +### Compare commits on a repository + +You can compare two commits using `compareCommits`, it takes as arguments: + +- the repository coordinates (`owner` and `name` of the repository). +- `commitSha` or branch to identify the commit you want to check. +- `baseSha`: or branch you're comparing the commitSha against + +To compare commits: + +```scala mdoc:compile-only +val compareCommits = + gh.repos.compareCommits( + "47deg", + "github4s", + "d3b048c1f500ee5450e5d7b3d1921ed3e7645891", + "main") +compareCommits.flatMap(_.result match { + case Left(e) => IO.println(s"Something went wrong: ${e.getMessage}") + case Right(r) => IO.println(r) +}) +``` + +The `result` on the right is the corresponding [List[CommitComparisonResponse]][repository-scala]. + +See [the API doc](https://developer.github.com/v3/repos/#compare-two-commits) for full +reference. + ## Branches ### List branches on a repository From 20900eb7ff418d1d1ddf900c25775b7ee3c85baf Mon Sep 17 00:00:00 2001 From: reimai Date: Fri, 20 Aug 2021 15:30:03 +0300 Subject: [PATCH 5/8] fix format --- github4s/src/main/scala/github4s/Decoders.scala | 3 ++- github4s/src/main/scala/github4s/Encoders.scala | 6 ++++-- .../interpreters/PullRequestsInterpreter.scala | 4 ++-- .../test/scala/github4s/unit/PullRequestsSpec.scala | 12 ++++++------ .../src/test/scala/github4s/unit/ReposSpec.scala | 3 +-- .../src/test/scala/github4s/utils/TestData.scala | 3 ++- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/github4s/src/main/scala/github4s/Decoders.scala b/github4s/src/main/scala/github4s/Decoders.scala index b1c8aa3d8..671d933fb 100644 --- a/github4s/src/main/scala/github4s/Decoders.scala +++ b/github4s/src/main/scala/github4s/Decoders.scala @@ -268,7 +268,8 @@ object Decoders { implicit val decoderNewTagRequest: Decoder[NewTagRequest] = deriveDecoder[NewTagRequest] implicit val decoderNewTreeRequest: Decoder[NewTreeRequest] = deriveDecoder[NewTreeRequest] implicit val decoderNewCommitRequest: Decoder[NewCommitRequest] = deriveDecoder[NewCommitRequest] - implicit val decoderBranchUpdateRequest: Decoder[BranchUpdateRequest] = deriveDecoder[BranchUpdateRequest] + implicit val decoderBranchUpdateRequest: Decoder[BranchUpdateRequest] = + deriveDecoder[BranchUpdateRequest] implicit def decodeNonEmptyList[T](implicit D: Decoder[T]): Decoder[NonEmptyList[T]] = { diff --git a/github4s/src/main/scala/github4s/Encoders.scala b/github4s/src/main/scala/github4s/Encoders.scala index 5ef8663bb..4392b96fe 100644 --- a/github4s/src/main/scala/github4s/Encoders.scala +++ b/github4s/src/main/scala/github4s/Encoders.scala @@ -183,7 +183,8 @@ object Encoders { deriveEncoder[NewReleaseRequest] implicit val encoderNewStatusRequest: Encoder[NewStatusRequest] = deriveEncoder[NewStatusRequest] implicit val encoderMilestoneData: Encoder[MilestoneData] = deriveEncoder[MilestoneData] - implicit val encodeBranchUpdateRequest: Encoder[BranchUpdateRequest] = deriveEncoder[BranchUpdateRequest] + implicit val encodeBranchUpdateRequest: Encoder[BranchUpdateRequest] = + deriveEncoder[BranchUpdateRequest] implicit val encoderCreateReviewComment: Encoder[CreateReviewComment] = deriveEncoder[CreateReviewComment] @@ -240,7 +241,8 @@ object Encoders { implicit val encoderUser: Encoder[User] = deriveEncoder[User] implicit val encoderComment: Encoder[Comment] = deriveEncoder[Comment] implicit val encoderMilestone: Encoder[Milestone] = deriveEncoder[Milestone] - implicit val encodeBranchUpdateResponse: Encoder[BranchUpdateResponse] = deriveEncoder[BranchUpdateResponse] + implicit val encodeBranchUpdateResponse: Encoder[BranchUpdateResponse] = + deriveEncoder[BranchUpdateResponse] implicit val encodeFileComparison: Encoder[FileComparison] = deriveEncoder[FileComparison] implicit val encodeCommitComparisonResponse: Encoder[CommitComparisonResponse] = deriveEncoder[CommitComparisonResponse] diff --git a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala index 0b99f9e9f..78c370b17 100644 --- a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala +++ b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala @@ -171,8 +171,8 @@ class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends Pull ): F[GHResponse[BranchUpdateResponse]] = client.put[BranchUpdateRequest, BranchUpdateResponse]( s"repos/$owner/$repo/pulls/$pullRequest/update-branch", - headers ++ - Option("Accept" -> "application/vnd.github.lydian-preview+json").filter(_ => iAgreeToUseExperimentalApi), + headers ++ Option("Accept" -> "application/vnd.github.lydian-preview+json") + .filter(_ => iAgreeToUseExperimentalApi), BranchUpdateRequest(expectedHeadSha) ) } diff --git a/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala b/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala index 9b41e6177..270f00052 100644 --- a/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala +++ b/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala @@ -263,12 +263,12 @@ class PullRequestsSpec extends BaseSpec { "PullRequests.updateBranch" should "call to httpClient.put with the right parameters" in { - implicit val httpClientMock: HttpClient[IO] = httpClientMockPut[BranchUpdateRequest, BranchUpdateResponse]( - url = - s"repos/$validRepoOwner/$validRepoName/pulls/$validPullRequestNumber/update-branch", - req = BranchUpdateRequest(None), - response = IO.pure(validBranchUpdateResponse) - ) + implicit val httpClientMock: HttpClient[IO] = + httpClientMockPut[BranchUpdateRequest, BranchUpdateResponse]( + url = s"repos/$validRepoOwner/$validRepoName/pulls/$validPullRequestNumber/update-branch", + req = BranchUpdateRequest(None), + response = IO.pure(validBranchUpdateResponse) + ) val pullRequests = new PullRequestsInterpreter[IO] diff --git a/github4s/src/test/scala/github4s/unit/ReposSpec.scala b/github4s/src/test/scala/github4s/unit/ReposSpec.scala index 90656bc6e..ad04d515a 100644 --- a/github4s/src/test/scala/github4s/unit/ReposSpec.scala +++ b/github4s/src/test/scala/github4s/unit/ReposSpec.scala @@ -439,8 +439,7 @@ class ReposSpec extends BaseSpec { "Repos.compare" should "call to httpClient.get with the right parameters" in { implicit val httpClientMock: HttpClient[IO] = httpClientMockGet[CommitComparisonResponse]( - url = - s"repos/$validRepoOwner/$validRepoName/compare/$validCommitSha...$validMergeCommitSha", + url = s"repos/$validRepoOwner/$validRepoName/compare/$validCommitSha...$validMergeCommitSha", response = IO.pure(validCommitComparisonResponse) ) diff --git a/github4s/src/test/scala/github4s/utils/TestData.scala b/github4s/src/test/scala/github4s/utils/TestData.scala index c60895c36..309e2e1db 100644 --- a/github4s/src/test/scala/github4s/utils/TestData.scala +++ b/github4s/src/test/scala/github4s/utils/TestData.scala @@ -493,7 +493,8 @@ trait TestData { val validBranchUpdateResponse = BranchUpdateResponse( "Updating pull request branch.", - s"https://github.com/repos/$validRepoOwner/$validRepoName/pulls/$validPullRequestNumber") + s"https://github.com/repos/$validRepoOwner/$validRepoName/pulls/$validPullRequestNumber" + ) val validCommitComparisonResponse = CommitComparisonResponse("behind", 1, 2, 100) From 23082082bb7b19459dc6bdc17d4344698e72a9dd Mon Sep 17 00:00:00 2001 From: reimai Date: Fri, 20 Aug 2021 15:45:56 +0300 Subject: [PATCH 6/8] fix code sample --- microsite/docs/pull_request.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/docs/pull_request.md b/microsite/docs/pull_request.md index 51e5d63a2..4bf8f6068 100644 --- a/microsite/docs/pull_request.md +++ b/microsite/docs/pull_request.md @@ -174,7 +174,7 @@ Accepts these parameters: ```scala mdoc:compile-only import github4s.domain.BranchUpdateResponse -val updatePullRequestBranch = gh.pullRequests.updatebranch( +val updatePullRequestBranch = gh.pullRequests.updateBranch( "47deg", "github4s", 567, From 51357f1d857172e243ff2a49e2164c7cd165fba7 Mon Sep 17 00:00:00 2001 From: reimai Date: Tue, 24 Aug 2021 12:42:32 +0300 Subject: [PATCH 7/8] remove iAgree, add doc --- .../src/main/scala/github4s/algebras/PullRequests.scala | 4 +--- .../github4s/interpreters/PullRequestsInterpreter.scala | 4 +--- .../src/test/scala/github4s/unit/PullRequestsSpec.scala | 1 - microsite/docs/pull_request.md | 6 ++---- 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/github4s/src/main/scala/github4s/algebras/PullRequests.scala b/github4s/src/main/scala/github4s/algebras/PullRequests.scala index 3e1a0645b..f75d9b20e 100644 --- a/github4s/src/main/scala/github4s/algebras/PullRequests.scala +++ b/github4s/src/main/scala/github4s/algebras/PullRequests.scala @@ -181,14 +181,12 @@ trait PullRequests[F[_]] { ): F[GHResponse[PullRequest]] /** - * @param iAgreeToUseExperimentalApi This call is an experimental API and could be subject to change, - * use 'true' to use it + * This is an experimental API and could be changed or removed */ def updateBranch( owner: String, repo: String, pullRequest: Int, - iAgreeToUseExperimentalApi: Boolean, expectedHeadSha: Option[String] = None, headers: Map[String, String] = Map() ): F[GHResponse[BranchUpdateResponse]] diff --git a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala index 78c370b17..6535fafc3 100644 --- a/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala +++ b/github4s/src/main/scala/github4s/interpreters/PullRequestsInterpreter.scala @@ -165,14 +165,12 @@ class PullRequestsInterpreter[F[_]](implicit client: HttpClient[F]) extends Pull owner: String, repo: String, pullRequest: Int, - iAgreeToUseExperimentalApi: Boolean, expectedHeadSha: Option[String] = None, headers: Map[String, String] = Map() ): F[GHResponse[BranchUpdateResponse]] = client.put[BranchUpdateRequest, BranchUpdateResponse]( s"repos/$owner/$repo/pulls/$pullRequest/update-branch", - headers ++ Option("Accept" -> "application/vnd.github.lydian-preview+json") - .filter(_ => iAgreeToUseExperimentalApi), + headers ++ Seq("Accept" -> "application/vnd.github.lydian-preview+json"), BranchUpdateRequest(expectedHeadSha) ) } diff --git a/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala b/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala index 270f00052..2b3d2ab5e 100644 --- a/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala +++ b/github4s/src/test/scala/github4s/unit/PullRequestsSpec.scala @@ -277,7 +277,6 @@ class PullRequestsSpec extends BaseSpec { validRepoOwner, validRepoName, validPullRequestNumber, - iAgreeToUseExperimentalApi = true, None, headerUserAgent ) diff --git a/microsite/docs/pull_request.md b/microsite/docs/pull_request.md index 4bf8f6068..a1ab80b87 100644 --- a/microsite/docs/pull_request.md +++ b/microsite/docs/pull_request.md @@ -162,13 +162,12 @@ See [the API doc](https://developer.github.com/v3/pulls/#create-a-pull-request) ### Update a pull request branch Merges the base HEAD into your pull request branch. -Note that this is an experimental API, meaning github could stop supporting it at any time. +Note that this is an experimental API, meaning github could stop supporting it at any time or change in an incompatible way. Accepts these parameters: - the repository coordinates (`owner` and `name` of the repository). - `pullRequest`: integer id of you pr. - - `iAgreeToUseExperimentalApi`: your conscious agreement to use an experimental API. - `expectedHeadSha`: The expected SHA of the pull request's HEAD ref for an optional check on github's side. ```scala mdoc:compile-only @@ -177,8 +176,7 @@ import github4s.domain.BranchUpdateResponse val updatePullRequestBranch = gh.pullRequests.updateBranch( "47deg", "github4s", - 567, - iAgreeToUseExperimentalApi = true) + 567) updatePullRequestBranch.flatMap(_.result match { case Left(e) => IO.println(s"Something went wrong: ${e.getMessage}") case Right(r) => IO.println(r) From 3fa7aae072fc60c9dc56c056d59235c46707369e Mon Sep 17 00:00:00 2001 From: reimai Date: Wed, 1 Sep 2021 13:26:53 +0300 Subject: [PATCH 8/8] * a doc for commit compare * a unit test for update branch --- .../scala/github4s/algebras/Repositories.scala | 2 ++ .../github4s/integration/PullRequestsSpec.scala | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/github4s/src/main/scala/github4s/algebras/Repositories.scala b/github4s/src/main/scala/github4s/algebras/Repositories.scala index 0f7b599fa..0d5fe64e7 100644 --- a/github4s/src/main/scala/github4s/algebras/Repositories.scala +++ b/github4s/src/main/scala/github4s/algebras/Repositories.scala @@ -230,6 +230,8 @@ trait Repositories[F[_]] { ): F[GHResponse[List[Commit]]] /** + * Compare any two commits in the same repository + * * @param owner of the repo * @param repo name of the repo * @param commitSha commit to compare against base diff --git a/github4s/src/test/scala/github4s/integration/PullRequestsSpec.scala b/github4s/src/test/scala/github4s/integration/PullRequestsSpec.scala index 3673340b2..e637d0d1e 100644 --- a/github4s/src/test/scala/github4s/integration/PullRequestsSpec.scala +++ b/github4s/src/test/scala/github4s/integration/PullRequestsSpec.scala @@ -356,4 +356,21 @@ trait PullRequestsSpec extends BaseIntegrationSpec { ) removeReviewersResponse.statusCode shouldBe okStatusCode } + + "PullRequests >> Update Branch" should "merge target branch's head into selected" taggedAs Integration in { + val response = clientResource + .use { client => + Github[IO](client, accessToken).pullRequests + .updateBranch( + validRepoOwner, + validRepoName, + validPullRequestNumber, + headers = headerUserAgent + ) + } + .unsafeRunSync() + + testIsRight[BranchUpdateResponse](response) + response.statusCode shouldBe okStatusCode + } }