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 @@
@tag.name
- @tag.id.substring(0, 7)
+ @tag.commitId.substring(0, 7)
@gitbucket.core.helper.html.datetimeago(tag.time)
diff --git a/src/main/twirl/gitbucket/core/releases/release.scala.html b/src/main/twirl/gitbucket/core/releases/release.scala.html index f645a0d..e51a528 100644 --- a/src/main/twirl/gitbucket/core/releases/release.scala.html +++ b/src/main/twirl/gitbucket/core/releases/release.scala.html @@ -10,7 +10,7 @@ @defining(repository.tags.find(_.name == release.tag)){ tag => @tag.map { tag => @tag.name
- @tag.id.substring(0, 7)
+ @tag.commitId.substring(0, 7)
@gitbucket.core.helper.html.datetimeago(tag.time) } } diff --git a/src/test/scala/gitbucket/core/TestingGitBucketServer.scala b/src/test/scala/gitbucket/core/TestingGitBucketServer.scala index 6f6db5b..d3f0c62 100644 --- a/src/test/scala/gitbucket/core/TestingGitBucketServer.scala +++ b/src/test/scala/gitbucket/core/TestingGitBucketServer.scala @@ -52,6 +52,8 @@ def client(login: String, password: String): GitHub = GitHub.connectToEnterprise(s"http://localhost:${port}/api/v3", login, password) + def getDirectory(): File = dir + private def addStatisticsHandler(handler: Handler) = { // The graceful shutdown is implemented via the statistics handler. // See the following: https://bugs.eclipse.org/bugs/show_bug.cgi?id=420142 val statisticsHandler = new StatisticsHandler diff --git a/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala b/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala index 747ae03..d424d89 100644 --- a/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala +++ b/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala @@ -2,11 +2,14 @@ import gitbucket.core.TestingGitBucketServer import org.apache.commons.io.IOUtils +import org.eclipse.jgit.api.Git import org.scalatest.funsuite.AnyFunSuite import scala.util.Using import org.kohsuke.github.GHCommitState +import java.io.File + /** * Need to run `sbt package` before running this test. */ @@ -145,13 +148,16 @@ assert(ref.getObject.getType == "commit") } -// // get tag v1.0 -// { -// val ref = repo.getRef("heads/tags/v1.0") -// assert(ref.getRef == "heads/tags/v1.0") -// assert(ref.getUrl == "tbd") -// assert(ref.getObject.getType == "tag") -// } + // get tag v1.0 + { + Using.resource(Git.open(new File(server.getDirectory(), "repositories/root/create_status_test"))) { git => + git.tag().setName("v1.0").call() + } + val ref = repo.getRef("tags/v1.0") + assert(ref.getRef == "refs/tags/v1.0") + assert(ref.getUrl.toString == "http://localhost:19999/api/v3/repos/root/create_status_test/git/refs/tags/v1.0") + assert(ref.getObject.getType == "tag") + } } } diff --git a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala index daa73b8..42e35c1 100644 --- a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala +++ b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala @@ -83,8 +83,20 @@ milestoneCount = 1, branchList = Seq("master", "develop"), tags = Seq( - TagInfo(name = "v1.0", time = date("2015-05-05T23:40:27Z"), id = "id1", message = "1.0 released"), - TagInfo(name = "v2.0", time = date("2016-05-05T23:40:27Z"), id = "id2", message = "2.0 released") + TagInfo( + name = "v1.0", + time = date("2015-05-05T23:40:27Z"), + commitId = "id1", + message = "1.0 released", + objectId = "id1" + ), + TagInfo( + name = "v2.0", + time = date("2016-05-05T23:40:27Z"), + commitId = "id2", + message = "2.0 released", + objectId = "id2" + ) ), managers = Seq("myboss") )