diff --git a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala index 23d7e54..17937f8 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala @@ -57,22 +57,27 @@ * iii. 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 { repository => + post("/api/v3/repos/:owner/:repository/git/refs")(writableUsersOnly { repository => extractFromJsonBody[CreateARef].map { data => - Using.resource(Git.open(getRepositoryDir(repository.owner, repository.owner))) { 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.fromRef(RepositoryName(repository.owner, repository.name), ref)) - case _ => UnprocessableEntity(result.name()) + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { + 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 + .fromRef(RepositoryName(repository.owner, repository.name), git.getRepository.findRef(data.ref)) + ) + case _ => UnprocessableEntity(result.name()) + } + } else { + UnprocessableEntity("Ref already exists.") } - } else { - UnprocessableEntity("Ref already exists.") - } } } getOrElse BadRequest() }) @@ -85,7 +90,7 @@ val refName = multiParams("splat").mkString("/") extractFromJsonBody[UpdateARef].map { data => - Using.resource(Git.open(getRepositoryDir(repository.owner, repository.owner))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val ref = git.getRepository.findRef(refName) if (ref == null) { UnprocessableEntity("Ref does not exist.") @@ -96,7 +101,7 @@ val result = update.update() result match { case Result.FORCED | Result.FAST_FORWARD | Result.NO_CHANGE => - JsonFormat(ApiRef.fromRef(RepositoryName(repository), update.getRef)) + JsonFormat(ApiRef.fromRef(RepositoryName(repository), git.getRepository.findRef(refName))) case _ => UnprocessableEntity(result.name()) } } diff --git a/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala b/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala index 97933a4..3751167 100644 --- a/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala +++ b/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala @@ -275,4 +275,29 @@ // } } } + + test("Git refs APIs") { + Using.resource(new TestingGitBucketServer(19999)) { server => + val github = server.client("root", "root") + + val repo = github.createRepository("git_refs_test").autoInit(true).create() + val sha1 = repo.getBranch("master").getSHA1 + + val refs1 = repo.listRefs().toList + assert(refs1.size() == 1) + assert(refs1.get(0).getRef == "refs/heads/master") + assert(refs1.get(0).getObject.getSha == sha1) + + val ref = repo.createRef("refs/heads/testref", sha1) + assert(ref.getRef == "refs/heads/testref") + assert(ref.getObject.getSha == sha1) + + val refs2 = repo.listRefs().toList + assert(refs2.size() == 2) + assert(refs2.get(0).getRef == "refs/heads/master") + assert(refs2.get(0).getObject.getSha == sha1) + assert(refs2.get(1).getRef == "refs/heads/testref") + assert(refs2.get(1).getObject.getSha == sha1) + } + } }