diff --git a/src/main/scala/gitbucket/core/api/ApiRef.scala b/src/main/scala/gitbucket/core/api/ApiRef.scala index 97c5d41..8f4f92f 100644 --- a/src/main/scala/gitbucket/core/api/ApiRef.scala +++ b/src/main/scala/gitbucket/core/api/ApiRef.scala @@ -39,11 +39,11 @@ ): ApiRef = ApiRef( ref = s"refs/tags/${tagInfo.name}", - url = ApiPath(s"/api/v3/repos/${repositoryName.fullName}/refs/tags/${tagInfo.name}"), + url = ApiPath(s"/api/v3/repos/${repositoryName.fullName}/git/refs/tags/${tagInfo.name}"), `object` = ApiRefCommit( - sha = tagInfo.id, - url = ApiPath(s"/api/v3/repos/${repositoryName.fullName}/git/tags/${tagInfo.id}"), // TODO This URL is not yet available? - `type` = "commit" + sha = tagInfo.objectId, + url = ApiPath(s"/api/v3/repos/${repositoryName.fullName}/git/tags/${tagInfo.objectId}"), // TODO This URL is not yet available? + `type` = "tag" ) ) } diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala index cc84449..0e9d3bd 100644 --- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala +++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala @@ -138,7 +138,7 @@ get("/:owner/:repository/changelog/*...*")(writableUsersOnly { repository => val Seq(previousTag, currentTag) = multiParams("splat") - val previousTagId = repository.tags.collectFirst { case x if x.name == previousTag => x.id }.getOrElse("") + val previousTagId = repository.tags.collectFirst { case x if x.name == previousTag => x.commitId }.getOrElse("") val commitLog = Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val commits = JGitUtil.getCommitLog(git, previousTagId, currentTag).reverse diff --git a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala index e4a3c50..23d7e54 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala @@ -1,10 +1,10 @@ package gitbucket.core.controller.api -import gitbucket.core.api.{ApiRef, CreateARef, JsonFormat, UpdateARef} +import gitbucket.core.api.{ApiError, ApiRef, CreateARef, JsonFormat, UpdateARef} import gitbucket.core.controller.ControllerBase import gitbucket.core.service.RepositoryService.RepositoryInfo import gitbucket.core.util.Directory.getRepositoryDir import gitbucket.core.util.Implicits._ -import gitbucket.core.util.{ReferrerAuthenticator, RepositoryName} +import gitbucket.core.util.{ReferrerAuthenticator, RepositoryName, WritableUsersAuthenticator} import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.ObjectId import org.eclipse.jgit.lib.RefUpdate.Result @@ -15,10 +15,23 @@ import scala.util.Using trait ApiGitReferenceControllerBase extends ControllerBase { - self: ReferrerAuthenticator => + self: ReferrerAuthenticator with WritableUsersAuthenticator => private val logger = LoggerFactory.getLogger(classOf[ApiGitReferenceControllerBase]) + get("/api/v3/repos/:owner/:repository/git/refs")(referrersOnly { repository => + val result = Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + val refs = git + .getRepository() + .getRefDatabase() + .getRefsByPrefix("refs") + .asScala + + refs.map(ApiRef.fromRef(RepositoryName(s"${repository.owner}/${repository.name}"), _)) + } + JsonFormat(result) + }) + /* * i. Get a reference * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#get-a-reference @@ -35,34 +48,6 @@ getRef(revstr, repository) }) - protected def getRef(revstr: String, repository: RepositoryInfo): String = { - logger.debug(s"getRef: path '${revstr}'") - - val name = RepositoryName(repository) - val result = JsonFormat(revstr match { - case tags if tags == "tags" => - repository.tags.map(ApiRef.fromTag(name, _)) - case other => - Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => - git.getRepository().findRef(other) match { - case null => - val refs = git - .getRepository() - .getRefDatabase() - .getRefsByPrefix("refs/") - .asScala - - refs.map(ApiRef.fromRef(name, _)) - case hit => - ApiRef.fromRef(name, hit) - } - } - }) - - logger.debug(s"json result: $result") - result - } - /* * ii. Get all references * https://docs.github.com/en/free-pro-team@latest/rest/reference/git#list-matching-references @@ -96,7 +81,7 @@ * iv. 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 { repository => + patch("/api/v3/repos/:owner/:repository/git/refs/*")(writableUsersOnly { repository => val refName = multiParams("splat").mkString("/") extractFromJsonBody[UpdateARef].map { data => @@ -123,7 +108,7 @@ * 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 { repository => + delete("/api/v3/repos/:owner/:repository/git/refs/*")(writableUsersOnly { _ => val refName = multiParams("splat").mkString("/") Using.resource(Git.open(getRepositoryDir(params("owner"), params("repository")))) { git => val ref = git.getRepository.findRef(refName) @@ -140,4 +125,34 @@ } } }) + + private def notFound(): ApiError = { + response.setStatus(404) + ApiError("Not Found") + } + + protected def getRef(revstr: String, repository: RepositoryInfo): AnyRef = { + logger.debug(s"getRef: path '${revstr}'") + + val name = RepositoryName(repository) + val result = JsonFormat(revstr match { + case "tags" => repository.tags.map(ApiRef.fromTag(name, _)) + case x if x.startsWith("tags/") => + val tagName = x.substring("tags/".length) + repository.tags.find(_.name == tagName) match { + case Some(tagInfo) => ApiRef.fromTag(name, tagInfo) + case None => notFound() + } + case other => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + git.getRepository().findRef(other) match { + case null => notFound() + case ref => ApiRef.fromRef(name, ref) + } + } + }) + + logger.debug(s"json result: $result") + result + } } diff --git a/src/main/scala/gitbucket/core/service/PullRequestService.scala b/src/main/scala/gitbucket/core/service/PullRequestService.scala index 65d134c..925a4f7 100644 --- a/src/main/scala/gitbucket/core/service/PullRequestService.scala +++ b/src/main/scala/gitbucket/core/service/PullRequestService.scala @@ -579,7 +579,7 @@ case (oldGit, newGit) => if (originRepository.branchList.contains(originId)) { val forkedId2 = - forkedRepository.tags.collectFirst { case x if x.name == forkedId => x.id }.getOrElse(forkedId) + forkedRepository.tags.collectFirst { case x if x.name == forkedId => x.commitId }.getOrElse(forkedId) val originId2 = JGitUtil.getForkedCommitId( oldGit, @@ -596,9 +596,9 @@ } else { val originId2 = - originRepository.tags.collectFirst { case x if x.name == originId => x.id }.getOrElse(originId) + originRepository.tags.collectFirst { case x if x.name == originId => x.commitId }.getOrElse(originId) val forkedId2 = - forkedRepository.tags.collectFirst { case x if x.name == forkedId => x.id }.getOrElse(forkedId) + forkedRepository.tags.collectFirst { case x if x.name == forkedId => x.commitId }.getOrElse(forkedId) (Option(oldGit.getRepository.resolve(originId2)), Option(newGit.getRepository.resolve(forkedId2))) } diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index 9e2d81e..77e3449 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -228,10 +228,11 @@ * * @param name the tag name * @param time the tagged date - * @param id the commit id + * @param commitId the commit id * @param message the message of the tagged commit + * @param objectId the tag object id */ - case class TagInfo(name: String, time: Date, id: String, message: String) + case class TagInfo(name: String, time: Date, commitId: String, message: String, objectId: String) /** * The submodule data @@ -347,7 +348,8 @@ ref.getName.stripPrefix("refs/tags/"), revCommit.getCommitterIdent.getWhen, revCommit.getName, - revCommit.getShortMessage + revCommit.getShortMessage, + ref.getObjectId.getName ) ) } catch { diff --git a/src/main/twirl/gitbucket/core/releases/list.scala.html b/src/main/twirl/gitbucket/core/releases/list.scala.html index 3c8b9ec..602e292 100644 --- a/src/main/twirl/gitbucket/core/releases/list.scala.html +++ b/src/main/twirl/gitbucket/core/releases/list.scala.html @@ -16,7 +16,7 @@