diff --git a/src/main/scala/gitbucket/core/api/CreateARef.scala b/src/main/scala/gitbucket/core/api/CreateARef.scala new file mode 100644 index 0000000..1375423 --- /dev/null +++ b/src/main/scala/gitbucket/core/api/CreateARef.scala @@ -0,0 +1,7 @@ +package gitbucket.core.api + +/** + * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-reference + * api form + */ +case class CreateARef(ref: String, sha: String) diff --git a/src/main/scala/gitbucket/core/api/UpdateARef.scala b/src/main/scala/gitbucket/core/api/UpdateARef.scala new file mode 100644 index 0000000..83beb8d --- /dev/null +++ b/src/main/scala/gitbucket/core/api/UpdateARef.scala @@ -0,0 +1,7 @@ +package gitbucket.core.api + +/** + * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#update-a-reference + * api form + */ +case class UpdateARef(sha: String, force: Boolean) diff --git a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala index 497d5c6..516b433 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala @@ -1,10 +1,13 @@ package gitbucket.core.controller.api -import gitbucket.core.api.{ApiObject, ApiRef, JsonFormat} +import gitbucket.core.api.{ApiObject, ApiRef, CreateARef, JsonFormat, UpdateARef} import gitbucket.core.controller.ControllerBase import gitbucket.core.util.Directory.getRepositoryDir import gitbucket.core.util.ReferrerAuthenticator import gitbucket.core.util.Implicits._ import org.eclipse.jgit.api.Git +import org.eclipse.jgit.lib.ObjectId +import org.eclipse.jgit.lib.RefUpdate.Result +import org.scalatra.{BadRequest, NoContent, UnprocessableEntity} import org.slf4j.LoggerFactory import scala.jdk.CollectionConverters._ @@ -17,7 +20,7 @@ /* * i. Get a reference - * https://developer.github.com/v3/git/refs/#get-a-reference + * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#get-a-reference */ get("/api/v3/repos/:owner/:repository/git/ref/*")(referrersOnly { repository => getRef() @@ -55,21 +58,79 @@ /* * ii. Get all references - * https://developer.github.com/v3/git/refs/#get-all-references + * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#list-matching-references */ /* * iii. Create a reference - * https://developer.github.com/v3/git/refs/#create-a-reference + * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-reference */ + post("/api/v3/repos/:owner/:repository/git/refs")(referrersOnly { _ => + extractFromJsonBody[CreateARef].map { + data => + Using.resource(Git.open(getRepositoryDir(params("owner"), params("repository")))) { git => + val ref = git.getRepository.findRef(data.ref) + if (ref == null) { + val update = git.getRepository.updateRef(data.ref) + update.setNewObjectId(ObjectId.fromString(data.sha)) + val result = update.update() + result match { + case Result.NEW => JsonFormat(ApiRef(update.getName, ApiObject(update.getNewObjectId.getName))) + case _ => UnprocessableEntity(result.name()) + } + } else { + UnprocessableEntity("Ref already exists.") + } + } + } getOrElse BadRequest() + }) /* * iv. Update a reference - * https://developer.github.com/v3/git/refs/#update-a-reference + * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#update-a-reference */ + patch("/api/v3/repos/:owner/:repository/git/refs/*")(referrersOnly { _ => + val refName = multiParams("splat").mkString("/") + extractFromJsonBody[UpdateARef].map { + data => + Using.resource(Git.open(getRepositoryDir(params("owner"), params("repository")))) { git => + val ref = git.getRepository.findRef(refName) + if (ref == null) { + UnprocessableEntity("Ref does not exist.") + } else { + val update = git.getRepository.updateRef(ref.getName) + update.setNewObjectId(ObjectId.fromString(data.sha)) + update.setForceUpdate(data.force) + val result = update.update() + result match { + case Result.FORCED | Result.FAST_FORWARD | Result.NO_CHANGE => + JsonFormat(ApiRef(update.getName, ApiObject(update.getNewObjectId.getName))) + case _ => UnprocessableEntity(result.name()) + } + } + } + } getOrElse BadRequest() + }) /* - * v. Delete a reference - * https://developer.github.com/v3/git/refs/#delete-a-reference - */ + * v. Delete a reference + * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#delete-a-reference + */ + delete("/api/v3/repos/:owner/:repository/git/refs/*")(referrersOnly { _ => + val refName = multiParams("splat").mkString("/") + Using.resource(Git.open(getRepositoryDir(params("owner"), params("repository")))) { git => + val ref = git.getRepository.findRef(refName) + if (ref == null) { + UnprocessableEntity("Ref does not exist.") + } else { + val update = git.getRepository.updateRef(ref.getName) + update.setForceUpdate(true) + val result = update.delete() + result match { + case Result.FORCED => NoContent() + case _ => UnprocessableEntity(result.name()) + } + } + } + }) } diff --git a/src/main/scala/gitbucket/core/controller/api/ApiIssueCommentControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiIssueCommentControllerBase.scala index 4f78f28..e4ed393 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiIssueCommentControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiIssueCommentControllerBase.scala @@ -85,7 +85,7 @@ * iv. Delete a comment * https://docs.github.com/en/rest/reference/issues#delete-an-issue-comment */ - delete("/api/v3/repos/{owner}/{repo}/issues/comments/:id")(readableUsersOnly { repository => + delete("/api/v3/repos/:owner/:repo/issues/comments/:id")(readableUsersOnly { repository => val maybeDeleteResponse: Option[Either[ActionResult, Option[Int]]] = for { commentId <- params("id").toIntOpt