Fix issues in git refs APIs (#3275)

This commit is contained in:
Naoki Takezoe
2023-04-23 22:52:31 +09:00
committed by GitHub
parent baf0b0b92c
commit 2f598b618b
2 changed files with 45 additions and 15 deletions

View File

@@ -57,22 +57,27 @@ trait ApiGitReferenceControllerBase extends ControllerBase {
* 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 @@ trait ApiGitReferenceControllerBase extends ControllerBase {
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 @@ trait ApiGitReferenceControllerBase extends ControllerBase {
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())
}
}

View File

@@ -275,4 +275,29 @@ class ApiIntegrationTest extends AnyFunSuite {
// }
}
}
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)
}
}
}